0

目的地に向かって移動する SKNode 敵の動きを管理する GKAgent2D があります。

エージェントが移動している 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;
}

シーンからすべてを完全に削除することなく、ゴールを停止するよりエレガントで適切な方法があることを願っているため、これは非常に悲しい解決策です。ただし、他の問題はこれでもあります。一時停止を解除するときに目標をリセットすると、一時停止が発生しなかった場合の位置にジャンプするという同じ問題が発生します。

4

2 に答える 2

1

別の目標によって速度が変更されていない場合、エージェントは最後に確認された有効な速度に沿って続行します。エージェントを停止させたい場合は、GKGoal の goalToReachTargetSpeed: を使用してみてください。

于 2016-08-03T00:54:20.907 に答える