1

私が感じていることをやろうとするのは簡単なはずですが、これまで試したことはありません。敵のプロパティが true に設定されるまで、このループが継続しないようにしています。

私の敵ノードは、歩行状態中にプレイヤーへの経路を見つけ出します。パスが計算されるまで、次の敵に反復したくありません。私の敵ノードには、walk ステート中に true に設定した pathComplete ノードがあります。

これはタッチで実行されます。

       for node:AnyObject in self.children {


                if node is EnemyNode {

                    let enemy = node as! EnemyNode

                    enemy.destination = coordinate
                    enemy.stateMachine.enterState(WalkingState)


                }

            }
4

1 に答える 1

1

何をしたいのか理解できたら、ループの代わりに再帰を使用する必要があります。

最初に、必要なenemyNodeArrayオブジェクトを含むオブジェクトを作成する必要があります。

次に、次のような 2 つの関数を作成できます。

func actionForObjectWithIndex(index: Int, completion block: (nextIndex: Int) -> Void) {
    guard index >= 0 && index < enemyNodeArray.count else {
        return
    }

    // do what you need with object in array like enemyNodeArray[index]...
    ...
    // Then call completion 
    block(nextIndex: index + 1)
}

func makeActionWithIndex(index: Int) {
    actionForObjectWithIndex(index, completion: {(nextIndex: Int) -> Void in
        self.makeActionWithIndex(nextIndex)
    })
}

次のように使用を開始します。

if !enemyNodeArray.isEmpty {
    makeActionWithIndex(0)
}

このアルゴリズムは、配列内のすべてのオブジェクトを取得し、それらに対して特定のアクションを実行し、前のアイテムが終了した後にのみ次のアイテムに移動します。

于 2015-11-20T13:08:39.973 に答える