如何在Spritekit中停止func update(_ currentTime:TimeInterval)

时间:2016-12-10 08:45:35

标签: ios swift sprite-kit

override func update(currentTime: NSTimeInterval) { // ... }

如何在更新方法中停止currentTime? 我想计算自比赛开始以来的时间。 当玩家点击暂停按钮时,当前场景成功暂停。 但是,更新中的currentTime正在移动。

2 个答案:

答案 0 :(得分:3)

当场景暂停时,将不会调用update,请尝试以下代码:

class GameScene: SKScene {

    override func didMove(to view: SKView) {
        let wait = SKAction.wait(forDuration: 2)
        let pause = SKAction.run { self.isPaused = true }
        self.run(SKAction.sequence([wait, pause]))
    }

    override func update(_ currentTime: TimeInterval) {
        print("update")
    }
}

"更新"将仅在前2秒打印。这证明暂停场景将停止update。您可能没有暂停场景,而是场景中运行所有操作的节点。

除此之外,通过暂停场景来实现暂停屏幕并不是一个好主意,因为用户不能通过点击场景是否暂停来离开暂停屏幕。此外,您无法在暂停屏幕中显示很酷的动画。

我通常做的是拥有一个背景节点。每个游戏精灵都被添加为背景节点的子节点。在暂停屏幕中,背景暂停但场景仍在运行。然后我将暂停屏幕spirte添加为场景的直接子项,以便您仍然可以与暂停屏幕进行交互。

你真的不需要"停止" update方法。您只需要检查游戏是否在方法中暂停。如果是,立即返回。

如果您想测量玩家开始游戏后经过的时间,您还可以使用Date个对象。在游戏开始时创建Date,在用户暂停时创建另一个Date。调用timeIntervalSince方法然后你去!

答案 1 :(得分:2)

我实施了如下所示的暂停,我认为该代码是自我解释的,但我添加了一些评论:

// BaseScene inherits from SKScene but adds some methods, e.g. for dealing with 
// controller input.
class GameScene : BaseScene {    
    // The previous update time is used to calculate the delta time. 
    // The delta time is used to update the Game state.
    private var lastUpdateTime: NSTimeInterval = 0

    override func update(currentTime: CFTimeInterval) {
        // NOTE: After pausing the game, the last update time is reset to 
        // the current time. The next time the update loop is entered, 
        // a correct delta time can then be calculated using the current 
        // time and the last update time.
        if lastUpdateTime <= 0 {
            lastUpdateTime = currentTime
        } else {
            let deltaTime = currentTime - lastUpdateTime
            lastUpdateTime = currentTime
            Game.sharedInstance.update(deltaTime)
        }
    }

    // A method on BaseScene that is called when the player presses pause 
    // on controller.
    override func handlePausePress(forPlayer player: PlayerIndex) {
        paused = true
        lastUpdateTime = 0
    }    
}

我的游戏单身人士在更新游戏状态时仅使用增量时间(自上次呼叫后的时间差)。