swift 随着游戏时间的推移,spritekit 会增加重力吗?
swift spritekit increase gravity as play time goes?
我试图通过随着玩家得分的增加而增加重力来增加游戏的难度。我不确定如何实现它,因为我尝试使用此处的解决方案:Any way to speed up gameplay gradually in Swift?
但是,我不确定如何将它实现到我的游戏中,以便它逐渐增加重力
这是我的代码:
override func update(_ currentTime: TimeInterval) {
// Altered the gravity drastically
// self.physicsWorld.gravity = CGVector(dx: 0, dy: CGFloat(self.score))
}
像这样定期设置定时器并增加重力
override func didMove(to view: SKView) {
let increasingDifficultyPeriod = TimeInterval(60)
Timer.scheduledTimer(withTimeInterval: increasingDifficultyPeriod,
repeats: true)
{ _ in
// increase currentGravity property here
self.physicsWorld.gravity.dy -= CGFloat(0.1)
}
}
我会远离这里 Timer
因为一些原因...
如果游戏暂停(例如场景或视图暂停),该解决方案会发生什么情况?当发生不同的中断时(例如 phone 呼叫,或让应用程序因任何原因进入后台......),计时器是否会继续 运行。在这些情况下,这个计时器会自动暂停吗?当应用 returns 到前台时,它会取消暂停(也是自动)吗?
简短的回答是:"Just stay away from it and use SKAction :)"
长答案是:
定时器不会自动暂停/取消暂停。它没有与 SKAction
这样的游戏循环配对。当用户 returns 进入游戏时,重力将不再像中断前那样具有重力,而是具有意想不到的值,这可能会使您的游戏变得一团糟。因此,正如我提到的,您需要为计时器 class 自定义暂停功能来处理这些情况。但是,与 Timer
class 的情况不同,所有这些都是使用 SKActions
自动处理的。
你也可以使用更新方法,但我更喜欢动作,所以这里是你如何用动作来完成的:
import SpriteKit
import GameplayKit
class GameScene: SKScene {
let kStep:CGFloat = 0.01
let kIncreaseActionKey = "kIncreaseActionkey"
override func sceneDidLoad() {
let increase = SKAction.run {[unowned self] in
//Optionally, you can check here if you want to increase the gravity further
self.physicsWorld.gravity.dy -= self.kStep
print("Gravity is now \(self.physicsWorld.gravity)")
}
let wait = SKAction.wait(forDuration: 1)//wait one second before increasing gravity
let sequence = SKAction.sequence([wait, increase])
let loop = SKAction.repeatForever(sequence)
self.run(loop, withKey: kIncreaseActionKey)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if self.action(forKey: kIncreaseActionKey) != nil{
self.removeAction(forKey: kIncreaseActionKey)
}
}
}
为什么不在分数变化的同时改变重力呢?最好是在分数变化时计算新的重力值并将其分配给 didFinishUpdate
.
中的世界
我试图通过随着玩家得分的增加而增加重力来增加游戏的难度。我不确定如何实现它,因为我尝试使用此处的解决方案:Any way to speed up gameplay gradually in Swift?
但是,我不确定如何将它实现到我的游戏中,以便它逐渐增加重力
这是我的代码:
override func update(_ currentTime: TimeInterval) {
// Altered the gravity drastically
// self.physicsWorld.gravity = CGVector(dx: 0, dy: CGFloat(self.score))
}
像这样定期设置定时器并增加重力
override func didMove(to view: SKView) {
let increasingDifficultyPeriod = TimeInterval(60)
Timer.scheduledTimer(withTimeInterval: increasingDifficultyPeriod,
repeats: true)
{ _ in
// increase currentGravity property here
self.physicsWorld.gravity.dy -= CGFloat(0.1)
}
}
我会远离这里 Timer
因为一些原因...
如果游戏暂停(例如场景或视图暂停),该解决方案会发生什么情况?当发生不同的中断时(例如 phone 呼叫,或让应用程序因任何原因进入后台......),计时器是否会继续 运行。在这些情况下,这个计时器会自动暂停吗?当应用 returns 到前台时,它会取消暂停(也是自动)吗?
简短的回答是:"Just stay away from it and use SKAction :)"
长答案是:
定时器不会自动暂停/取消暂停。它没有与 SKAction
这样的游戏循环配对。当用户 returns 进入游戏时,重力将不再像中断前那样具有重力,而是具有意想不到的值,这可能会使您的游戏变得一团糟。因此,正如我提到的,您需要为计时器 class 自定义暂停功能来处理这些情况。但是,与 Timer
class 的情况不同,所有这些都是使用 SKActions
自动处理的。
你也可以使用更新方法,但我更喜欢动作,所以这里是你如何用动作来完成的:
import SpriteKit
import GameplayKit
class GameScene: SKScene {
let kStep:CGFloat = 0.01
let kIncreaseActionKey = "kIncreaseActionkey"
override func sceneDidLoad() {
let increase = SKAction.run {[unowned self] in
//Optionally, you can check here if you want to increase the gravity further
self.physicsWorld.gravity.dy -= self.kStep
print("Gravity is now \(self.physicsWorld.gravity)")
}
let wait = SKAction.wait(forDuration: 1)//wait one second before increasing gravity
let sequence = SKAction.sequence([wait, increase])
let loop = SKAction.repeatForever(sequence)
self.run(loop, withKey: kIncreaseActionKey)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if self.action(forKey: kIncreaseActionKey) != nil{
self.removeAction(forKey: kIncreaseActionKey)
}
}
}
为什么不在分数变化的同时改变重力呢?最好是在分数变化时计算新的重力值并将其分配给 didFinishUpdate
.