4

私はチュートリアルに従って Java でボンバーマンをプログラミングしています (これは私の最初のゲームです)。チュートリアルでは、衝突を検出するための次のコードを提案しています。

        for (int p=0; p<entities.size(); p++) {
            for (int s=p+1; s<entities.size(); s++) {
                Entity me = (Entity) entities.get(p);
                Entity him = (Entity) entities.get(s);

                if (me.collidesWith(him)) {
                    me.collidedWith(him);
                    him.collidedWith(me);
                }
            }

ここまでで、entitiesは敵とプレイヤーを含む配列リストです。プレイヤーが壁に衝突したことも検出したいので、レベル内のすべての壁またはレンガ タイルをエンティティ配列リストに入れる必要がありますか? もしそうなら、このアルゴリズムは非常に非効率的ではありませんか? これらのタイルは他のタイルと衝突することはないので、ゲーム エンティティを別のリストで管理することを考えていました。何を指示してるんですか?それを行うためのより効率的なアルゴリズムはありますか?

注: 2D ゲームでの衝突に関する他の質問は既に読みました。どうもありがとう。

4

3 に答える 3

10

PacManでゴーストの動きと衝突検出がどのように機能するかについて、この優れた記事を読むことをお勧めします。

次に、Bomberman のレベルをタイルのコレクションとして論理的にモデル化することをお勧めします。各タイルはレベル内の個別の位置を表しており、論理的には、タイルの「間に」あることや、同時に 2 つのタイルを占有することはありません。各タイルは、現在その上にある地形の種類と、それがプレイヤー (および敵) にとって有効な目的地タイルであるかどうかを追跡できます。プレーヤーのために)。

そうすれば、世界のすべてのオブジェクトに対して衝突検出アルゴリズムは必要ありません。敵が移動するとき、またはユーザーがキャラクターを移動しようとすると、現在のタイルに隣接するすべてのタイルを確認するだけで済みます (4、または斜めの移動を許可する場合は最大 8)。各タイルが有効な移動方向を表しているかどうかを確認し、有効な方向でない場合は移動をブロックします。

そして、あなたの質問に答えるために、はい、すべての位置の更新で世界のすべてのオブジェクトを反復することは非常に非効率的です.

于 2011-07-25T04:38:53.980 に答える
2

衝突システムにグリッドを使用する別の方法があります。Arothの提案のより複雑なバージョンを使用しており、これを使用して衝突のバグを修正しています。

理論的には、このシステムは最速です (このチェックを行っていると仮定しますif(Grid[x][y] ==true))。これは、各エンティティ (移動できるもの) に対して単一のブール値チェックのみを使用するためです。

: 上記のグリッド チェックの例では、通過できないグリッドの座標を false に設定するブール値の 2 次元配列を使用しました。

壁から跳ね返るなどの物理現象を心配していない場合は、次のように使用できます。

1- Divide the map into grids. 
2- Making every entity only fill a tile would be better but not necessary. 
3- Store the previous position or the grid of the entities.
4- Whenever an entity moves, before visually updating their location (also before 
doing other calculations) check the grids they are in. If they are in grid 
that is not empty or simply in a grid that they are not supposed to 
be, return their position back to the previous position (which you have stored). 

エンティティがグリッド内を自由に移動できるようにする場合 (グリッドは、移動できる最小距離よりも大きい)、エンティティが入力したグリッドに隣接して配置する必要があります。それ以外の場合は、前のグリッドに戻します。

壁から跳ね返らせたい場合は、これを引き続き使用できますが、このような衝突システムに追加できる機能の数はわかりません.

于 2014-10-29T08:01:52.560 に答える