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.

中的世界