Flex と Flashpunk フレームワークを使用して AS3 ゲームに取り組んでいます。この要件の 1 つは、A* アルゴリズムを使用して移動、衝突、およびパスファインディングを行う可能性のある多数のエンティティがあることです。
このソリューションを最適化しようとしている方法の 1 つは、A* 関数を、エンティティの周りの可変グリッド サイズで構成される制限されたマップ領域から機能させることです。エンティティは、「感知範囲」の制限を介して、別のエンティティをターゲットにしてパス移動する能力が制限されています。
私の考えでは、必要に応じて小さな領域を検索するだけで、動的な障害物や目標に A* を使用して回避できる可能性があります。パスが受信されると、エンティティは衝突をチェックしながら最初のノードに移動します。途中で衝突が検出された場合、エンティティは 1 ~ 2 秒待機してから、衝突を再チェックします。何も見つからない場合は、ノードに進み、再確認して、次のノードに移動します。遅延後も衝突が残っている場合、これは静的な障害物である可能性が高く、パスを再計算する必要があります。
私が抱えている問題は、私が使用している実装と、このグリッド データを格納する方法に関係しています。現在、マップは長さがグリッド領域に等しい配列として表されています。これをソート済みリストまたはバイナリ ヒープに移動する必要があることはわかっていますが、正しく機能するものができるまではシンプルに保ちます。
そうです、実際の問題は次のとおりです。
このグリッドは、世界の位置 500,500 にあるエンティティの検索配列を表します。エンティティ スプライトのサイズは 64x64 です。エンティティは、グリッド中央の灰色の四角として表されます。
各グリッドの最初の数値は配列内のインデックス、2 番目は行と列 (これは A* 関数が配列を格納する方法です)、3 番目はエンティティの位置に対するワールド座標です。各グリッド ブロックは 64x64 の領域を表します。
世界座標関数にグリッドを書き込もうとしています。パス内の各ノードの行/列を含むパス配列がありますが、これを相対的な世界座標に変換する必要があります。0,0 座標が左上にあることに注意してください。
私はこの関数を書くことを何度か試みましたが、成功しませんでした。私の数学はひどいものです。これを達成する方法、またはこの問題に対する別のアプローチを知っている人がいれば、私は最も感謝しています。