1

少し前にJava2Dパスファインディングについて質問しました...パスファインディング2DJava ゲーム?

開発中のゲームは、テーマホスピタルのアイデアに基づいています。私の質問から選ばれた答え、A *パスファインディング、リンクは素晴らしく、とても役に立ちました。最終的にはこれをゲームに実装するようになりますが、それに関してさらにいくつかの質問/問題があります。

私のゲームでは、マップが変更されます。チュートリアルでは、マップが静的であると想定しています(私は思います)。私はコードを見てきましたが、うまくいく限り、パスファインディングコードでゲームマップを更新するために呼び出すメソッドを作成する必要があります。

次に、GameMapクラスが表示されます。私はすべてのタイルを収容するボードと呼ばれる私自身のクラスを持っています。GameMapのメソッドをBoardクラスに統合できると思います。右?

第三に、私はどの部屋もブロックされていると見なされるという推論に取り組んできました。つまり、部屋が覆っている正方形はすべてブロックされたものとして数えられます。人々が部屋に入る場所を前もって考えていました。その後、さまざまな場所に移動するために、これらの部屋を移動する必要があります。正方形ごとにBlockedブール値を反転するだけだと思っていましたが、2つの理由で機能しませんでした。1、部屋には隣接する壁があり、パスファインディングを台無しにする可能性があります。2、ブロックされた状態が単純に反転された場合、部屋の固体アイテムは、反転されたときに固体ではないと見なされ、壁に触れているときに問題が発生する可能性があります。

考えてみると、実際の正方形全体ではなく、正方形の辺をブロックしたほうがいいと思います。これは可能である必要がありますが、前の質問のチュートリアルを使用して取得しているだけで、これを行うためにA *を変更するか、ルームアイテムの問題の回避策に取り組む必要があるかわかりません。

これらの問題のいずれかについての考えや提案はありますか?今日は簡単なパスファインディングを実装していますが、自分の前で考えています。

4

3 に答える 3

1

簡単に見ると、isValidLocation(mover、sx、sy、xp、yp)メソッドは、point(sx、sy)からpoint(xp、yp)への移動が有効な移動であるかどうかを定義しているように見えます。

この方法で移動の方向を考慮に入れると、ブロックを完全に貫通できないようにすることなく、ブロックから/ブロックへの特定の方向をブロックできます。このようにして、2つのアクセス可能なブロックを隣り合わせに配置し、それらの間にしっかりとした境界を設定することができます。

このアプローチには、一方向の境界を作成する機能など、いくつかの興味深い副作用があります(ブロックAはブロックBにアクセスできますが、その逆はありません)。エスケープ?)を考慮に入れます。

誰かがあなたの前に立っている場合、パスの一部を再計算できるAdaptiveA*と呼ばれるアルゴリズムがあります。最初にバニラA*に集中します。以前に有効だったパスがブロックされていることが途中で見つかった場合は、その時点からいつでも新しいパスを計算できます。

これは興味深い読み物のように見えます:リアルタイムアダプティブA * [PDF]

于 2009-07-02T11:06:49.807 に答える
0

ゲームマップが変更された場合は、パスを再計算する必要がありますが、変更内容によっては、必ずしもすべてのパスを再計算する必要はありません。

GameMapのメソッドをBoardクラスに統合する必要があります(GameMapクラスに変更を加えます)。

正方形の側面をブロックするには、代わりに各タイルを9つの別々のタイル(3X3)と考えることができます。たとえば、水平方向の壁がブロックされているタイルの場合、単一の正方形の代わりに、タイルを(a *アルゴリズムに対して)次のように表すことができます。

[X| |X]
[X| |X]
[X| |X]

垂直および水平のタイルがブロックされているタイル:

[ | |X]
[ | |X]
[X|X|X]

追加のエッジ情報をゲームマップに保存する必要があります。お役に立てれば。

于 2009-07-02T10:58:41.023 に答える
0

パスの質問について:

簡単な解決策は、現在のパスの次の移動が無効であると見なされた場合にのみ、パスを再計算することです(新しい要素がマップに配置され、新しい部屋が追加され、ドアが移動されました...) 。もちろん、現在の位置から再計算します。ブロッキング要素が別の移動要素である場合、問題はより複雑になります。この場合、優先度に応じて、2つのオブジェクトの1つは数サイクル待機する必要があり、もう1つは再パスする必要があります。ただし、これにより、複数パスの衝突の問題が発生する可能性があります(ドアの片側にそれぞれ2つの優先度の高いオブジェクト、およびドア内の優先度の低いオブジェクト:移動できず、優先度の高いオブジェクトは長時間待機します)

部屋の問題について:

部屋を1つのタイルではなく、タイルのセットとして定義するのが一般的です。したがって、1つの部屋を定義できます。サブタイルは合格であり、サブタイルは合格ではありません。モデルで許可されている場合は、異なるタイルに存在するオブジェクトを記述して、通行不能として設定することもできます。完全に通行可能な場合は待合室(6タイルx 4タイルの部屋)ですが、椅子のセットと小さなものが含まれていますいくつかのサブタイルを通行不能にする噴水。

お役に立てれば

ギヨーム

于 2009-07-02T11:28:59.853 に答える