我有一个 GKAgent2D 控制向目的地移动的 SKNode 敌人的移动。
当我暂停代理正在移动的 SKScene 时,敌人节点似乎继续移动而没有显示出这种移动。所有可见的动作都停止(也就是敌人停止移动)。如果我等待 5 秒然后取消暂停场景,就好像敌人从未停止移动,它突然出现在我没有暂停场景的地方,并且它继续从那个点正常移动。
我查看了 Apple 为用户创建的名为 DemoBots 的示例演示游戏,他们实现了类似于我正在使用的“修复”,只需将update:(NSTimeInterval *)currentTime
方法留给返回即可。这是我的代码目前的样子:
- (void)update:(NSTimeInterval)currentTime {
[super update:currentTime];
if (_lastUpdateTime == 0) _lastUpdateTime = currentTime;
float delta = currentTime - _lastUpdateTime;
_lastUpdateTime = currentTime;
// Stop updating if the `worldNode` is paused.
if (worldNode.paused) { return };
for (GKComponentSystem *componentSystem in componentSystems) {
[componentSystem updateWithDeltaTime:deltaTime];
}
}
但是我无法更深入地了解他们正在做什么以确保GKGoal
在暂停发生时立即停止当前有效的目标。我什至记录了 agentDidUpdate 方法,当我暂停场景时它会停止触发,所以我真的不确定它是如何继续移动的。
如果有人知道答案,请告诉我。谢谢!
更新:我什至尝试暂停目标设置为移动的各个节点:
- (void)didPauseScene {
worldNode.paused = YES;
/*
<< Animations >>
*/
for (OEnemy *enemy /*my subclass*/ in enemyArray) {
enemy.paused = YES;
}
}
但这仍然没有阻止GKGoals
他们在不暂停场景的情况下继续进行。
更新 2:停止代理冷的唯一解决方案实际上是消除代理系统的目的:
if (worldNode.paused) {
self.agentSystem = nil;
return;
}
这是一个非常可悲的解决方案,因为我希望有一种更优雅/更合适的方式来停止目标,而不会将所有内容完全从场景中移除。然而,另一个问题是即使这样,在取消暂停时重置目标也会产生同样的问题,即如果没有发生暂停,他们会跳到他们所处的位置。