0

私はターン ベースのゲームを作ろうとしています。各敵はプレイヤー ノードへのパスを見つける必要があります。私はgameplaykitのパスファインディングを使用しており、敵がターンを行う必要があるたびに、そのGKGridGraphから他の敵を必ず削除し(敵が互いに歩かないようにするため)、後で同じノードを追加します。

NSMutableArray <GKGridGraphNode *> *walls = [NSMutableArray array];

for(SKNode *mapNode in enemies)
  {
    for(SKNode *node in mapNode.children)
      {
        if((node.position.x != enemy.position.x)||(node.position.y != enemy.position.y))
          {
            GKGridGraphNode *graphNode = [_NewGraph nodeAtGridPosition:
            (vector_int2){(node.position.x-300)/70, (node.position.y-180)/70}];
            [walls addObject:graphNode];
          }
        }
      }
[_NewGraph removeNodes:walls];

GKGridGraphNode* GKenemyNode = [_NewGraph nodeAtGridPosition:(vector_int2)
                         {(enemy.position.x-300)/70, (enemy.position.y-180)/70}];

GKGridGraphNode* GKplayerNode = [_NewGraph nodeAtGridPosition:(vector_int2)
                        {(player.position.x-300)/70,(player.position.y-180)/70}];
NSArray<GKGridGraphNode *> *path = [_NewGraph findPathFromNode:GKenemyNode toNode:GKplayerNode];
[_NewGraph addNodes:walls];

removeNodes と addNodes の行をコメントアウトすると、すべて正常に動作します。

編集:同じオブジェクトを再署名するのではなく、生成された GKGridGraph を返すことができる新しいクラス オブジェクトを毎回作成することをお勧めしますか?

4

1 に答える 1

1

わかりました、答えを見つけたので、皆さんと共有したいと思います! ノードを削除した後、これを行いました(私が行ったようにノードを追加する必要はありません):

for(GKGridGraphNode *node in walls)
{
  [NewGraph connectNodeToAdjacentNodes:node];
}

NewGraph = nil;

幸運を !

于 2016-02-23T22:32:38.333 に答える