当场景暂停时,GameplayKit不会暂停

时间:2016-07-25 13:44:37

标签: ios objective-c sprite-kit gameplay-kit

我有一个GKAgent2D来控制朝着目的地移动的SKNode敌人的移动。

当我暂停代理进入的SKScene时,敌方节点似乎继续移动而没有显示这样的移动。所有可见的运动停止(AKA敌人停止移动)。如果我等待5秒钟然后取消暂停场景,那就好像敌人从未停止过移动它会弹到原本我没有暂停场景的地方,并且它会继续正常移动。< / p>

我查看了Apple为用户创建的示例游戏,称为DemoBots,他们实施了一个&#34;修复&#34;类似于我正在使用的方法,只需将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;
}

这是一个非常悲伤的解决方案,因为我希望有更优雅/适当的方法来停止目标,而不必从场景中完全删除所有内容。然而另一个问题是,即使没有暂停,重新设定目标,如果没有发生暂停,也会产生跳到他们所处位置的相同问题。

2 个答案:

答案 0 :(得分:1)

如果另一个目标没有改变,代理将继续沿着他们最后的已知有效速度。如果您希望代理停止,您可以尝试使用GKGoal的goalToReachTargetSpeed:。

答案 1 :(得分:0)

对于那些GKGoal goalToReachTargetSpeed:无效的人。

从实体中删除我的MovementComponent对我有用:

let movementComponent = entity.component(ofType: MovementComponent.self)!
entity.removeComponent(ofType: MovementComponent.self)
componentSystem.removeComponent(moveComponent)

当您恢复游戏时,请确保创建移动组件的新实例并再次将其添加到实体中:

let movementComponent = MovementComponent()
entity.addComponent(movementComponent)
componentSystem.addComponent(moveComponent)

使用GKComponentSystem更新移动组件时,还要确保相应地移除和添加移动组件。