3

暂停 GKAgent 的最佳方法是什么?

我的游戏在某些关卡中使用了一些代理,当我的游戏暂停/gameOver 时我需要暂停它们。

我不会在我的游戏中暂停整个 SKScene,而是暂停一个 worldNode,因为它给了我更大的灵活性来显示 spriteKit 内容,即使在游戏暂停时也是如此。

我正在使用

 updateWithDeltaTime...

更新我的代理行为并相应地移动它们的方法。

我考虑过停止更新方法,但代理仍将移动到他们最后一个已知的 GKGoal。

到目前为止,我发现的最佳解决方案是在我的游戏暂停时将代理速度/maxSpeed 设置为 0。我在这里遇到的问题是,在恢复时将速度重置为代理以前的速度有点痛苦,尤其是在使用具有自己行为的多个代理时。它们似乎也消失了,而不是在恢复时重新出现。

据我了解,没有 agent.paused 方法或类似的方法。

什么是暂停代理而不暂停 SKScene 本身的好方法?

感谢您的任何帮助和建议。

4

2 回答 2

1

我想我现在找到了一个似乎可行的解决方案。

首先,当游戏暂停时,我将停止 udapteDeltaMethods。

我比查看我所有的实体并将代理委托设置为 nil

  for entity in baseScene.entityManager.entities {
        if let soldier = entity as? BossWorld3Soldiers {
            soldier.agentComponent.delegate = nil
        }
    }

当我恢复我的游戏时,我称之为

  for entity in baseScene.entityManager.entities {
        if let soldier = entity as? BossWorld3Soldiers {
            let action1 = SKAction.waitForDuration(0.5)
            let action2 = SKAction.runBlock({ soldier.resetAgentDelegate() })
            baseScene.runAction(SKAction.sequence([action1, action2]))
        }
    }

resetAgentDelegate() 方法只是我的实体类中用于重置代理委托的便捷方法

 func resetAgentDelegate() {
    self.agentComponent.delegate = self
 }

在重置代理委托之前,我在恢复时使用了轻微的延迟,因为没有延迟,实体/代理似乎在恢复他们的 GKGoals 之前进行了几秒钟的大规模跳跃/消失。

于 2016-02-27T12:54:15.553 回答
0

您是否已将线路if worldNode.paused { return }放入update您的 GameScene 中?

这对我有用

游戏场景:

override func update(currentTime: CFTimeInterval) {

        super.update(currentTime)

        // Don't perform any updates if the scene isn't in a view.
        guard view != nil else { return }

        let deltaTime = currentTime - lastUpdateTimeInterval
        lastUpdateTimeInterval = currentTime

        /*
        Don't evaluate any updates if the `worldNode` is paused.
        Pausing a subsection of the node tree allows the `camera`
        and `overlay` nodes to remain interactive.
        */
        if worldNode.paused { return }

        // Don't perform any updates if the scene isn't in a view.
        guard entityManagerGame != nil else { return }

        entityManagerGame.update(deltaTime)

    }
于 2016-02-27T11:04:16.393 回答