2016-07-25 12 views
0

私は目的地に向かって移動するSKNodeの敵の動きを管理するGKAgent2Dを持っています。シーンが一時停止しているときにゲームプレイキットが一時停止しない

エージェントが移動しているSKSceneを一時停止すると、敵ノードはそのような動きを示さずに動き続けているようです。すべての目に見える動きが止まる(敵は動かなくなる)。私は5秒待ってからシーンをポーズ解除すると、敵が決して動いていないかのようになり、シーンを一時停止していなかった場所にポップアップし、通常通りそのポイントから移動し続けます。

AppleがDemoBotという名前のユーザー用に作成したサンプルデモゲームを見て、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メソッドをログに記録して、シーンを一時停止すると発砲を停止するので、動きの仕方がわからないのです。

誰かが答えを知っている場合は、私に知らせてください。ありがとうございました!

UPDATE:私も目標が移動するように設定している個々のノードの一時停止しようとした:

- (void)didPauseScene { 

    worldNode.paused = YES; 

    /* 
    <<Animations>> 
    */ 

    for (OEnemy *enemy /*my subclass*/ in enemyArray) { 
     enemy.paused = YES; 
    } 
} 

をしかし、これはまだシーンを一時停止することなく、彼らは同じように続けるからGKGoalsを停止していない..

UPDATE 2

:文字通りエージェントシステムの目的を除去された薬剤冷停止溶液のみ

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

+0

そのコードはあなたの 'update'メソッドかAppleのものですか?私たちはあなたのことを見て、助けてください。 – andyvn22

+0

あなたの質問に答えるために投稿を更新しました。 * my *コードです。 –

+0

スプライトキットの一時停止が盗聴されている、私はこの同じバグがゲームプレイキットを介して運ばれたと推測するつもりです。あなたのシーンが一時停止され、一時停止されていない場合は、すべての子供が一時停止され、一時停止されません。あなたのシーンで一時停止された変数をオーバーライドして、セッターにプロパティの値を設定させないようにしてください。 – Knight0fDragon

答えて

1

エージェントは、もう1つの目標がそれを変更していない場合、最後に知られている有効な速度に沿って継続します。エージェントを停止させたい場合は、GKGoalのgoalToReachTargetSpeed:を試してみてください。

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を使用してムーブメントコンポーネントを更新する場合は、それに応じてムーブメントコンポーネントも削除して追加してください。

関連する問題