暂停GKAgent的最佳方法是什么?
我的游戏在某些关卡中使用了一些代理,我需要在游戏暂停/ gameOver时暂停它们。
我不会在游戏中暂停整个SKScene而是暂停worldNode,因为即使游戏暂停,它也能让我更灵活地显示spriteKit。
我正在使用
updateWithDeltaTime...
更新我的代理行为并相应地移动它们的方法。
我考虑过停止更新方法,但代理仍然会移动到他们最后一次知道的GKGoal。
我到目前为止找到的最佳解决方案是在游戏暂停时将代理速度/ maxSpeed设置为0。我在这里遇到的问题是,在恢复时,将速度重置为代理程序之前的速度有点痛苦,尤其是在使用具有自己行为的多个代理程序时。它们似乎也消失了,而不是在恢复时重新出现。
据我所知,没有agent.paused方法或类似内容。
什么是暂停代理而不暂停SKScene本身的好方法?
感谢您提供任何帮助和建议。
答案 0 :(得分: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
}
我在重置代理委托之前稍微延迟了一段时间,因为没有延迟,enties / agent似乎在恢复GKGoals之前会进行大量跳跃/消失几秒钟。
答案 1 :(得分:0)
您是否已将行if worldNode.paused { return }
放入GameScene的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)
}