3

GKAgent を一時停止する最良の方法は何ですか?

私のゲームはいくつかのレベルでいくつかのエージェントを使用しており、ゲームが一時停止/ゲームオーバーになったときにエージェントを一時停止する必要があります。

ゲームで SKScene 全体を一時停止するのではなく、worldNode を一時停止します。これにより、ゲームが一時停止されている場合でも spriteKit のものをより柔軟に表示できるからです。

私は使用しています

 updateWithDeltaTime...

エージェントの動作を更新し、それに応じて移動するメソッド。

更新メソッドを停止することを考えましたが、エージェントはまだ最後の既知の GKGoal に移動します。

これまでに見つけた最善の解決策は、ゲームが一時停止しているときにエージェントの速度/最大速度を 0 に設定することです。ここで私が抱えている問題は、特に複数のエージェントを独自の動作で使用している場合、再開時にエージェントの速度を以前の速度にリセットするのが少し面倒なことです。また、それらは消えて、再開時に再び現れるように見えます。

私が理解している限り、agent.paused メソッドなどはありません。

SKScene自体を一時停止せずにエージェントを一時停止する良い方法は何ですか?

助けと提案をありがとう。

4

2 に答える 2

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
 }

エージェントデリゲートをリセットする前に、再開時にわずかな遅延を使用しています。遅延がないと、エンティティ/エージェントは、GKGoals を再開する前に数秒間大規模なジャンプ/消失を行うように見えるためです。

于 2016-02-27T12:54:15.553 に答える
0

GameSceneにラインif worldNode.paused { return }を入れましたか?update

これは私のために働く

ゲームシーン:

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)

    }
于 2016-02-27T11:04:16.393 に答える