随着游戏时间的推移,swift spritekit会增加引力?

时间:2018-01-16 03:04:13

标签: ios sprite-kit skphysicsworld

我试图通过在玩家的分数上升时增加重力来增加游戏的难度。我不确定如何实现这一点,因为我尝试在此处使用解决方案: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))
}

3 个答案:

答案 0 :(得分:1)

由于一些原因,我会远离Timer。 如果游戏暂停(例如场景或视图暂停),该解决方案会发生什么?当不同的中断发生时,定时器会继续运行(例如,电话呼叫,或者应用程序因任何原因进入后台......)。在这种情况下,此计时器是否会自动暂停,并且当应用程序返回到前台时它是否会(也会自动)取消暂停?

简短的回答是:"只要远离它并使用SKAction:)"

答案很长:

计时器不会自动暂停/取消暂停。它不与像SKAction这样的游戏循环配对。当用户返回游戏时,重力将具有意想不到的价值,而不是像在中断之前那样具有重力,这可能会使游戏中出现一些混乱。因此,正如我所提到的,您需要Timer类的自定义暂停功能来处理这些情况。但是,与Timer类的情况不同,所有这些都是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)
        }
    }
}

答案 1 :(得分:0)

安排计时器,并像这样定期增加重力

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)
    } 
}

答案 2 :(得分:0)

为什么不在分数改变的同时改变引力?最好是在分数变化时计算新的重力值,并在didFinishUpdate中将其分配给世界。