2Dゲームスプライトの衝突を検出するための最良の方法は何ですか?私は現在アレグロとG++で働いています
7 に答える
適切な2Dグラフィックライブラリは、整列されたスプライトからポリゴン、ピクセルまで、あらゆるものに対して独自の衝突検出機能を提供するか、これらの機能を実行するための1つ以上の優れたサードパーティライブラリを備えています。エンジン/ライブラリ/フレームワークの選択によって、衝突検出の選択が決まるはずです。これは、単独で作成できるものよりもはるかに最適化されている可能性が高いためです。
AllegroにはCollegroがあります。SDLの場合、SDL_Collide.hまたはSDL-Collideがあります。OpenGLでI_COLLIDEを使用できます。DarkBASICには衝突システムが組み込まれており、DarkPhysicsは衝突を含む非常に正確な相互作用を実現します。
衝突検出を検出する方法はたくさんあります。2D環境と3D環境のどちらを使用しているかによって、使用する方法が少し変更されます。また、衝突検出システムを導入するときは、ゲームに実装する可能性のある物理的特性(ほとんどの降下3Dゲームに必要)を考慮して、その現実性を高めることを忘れないでください。
短いバージョンは、バウンディングボックスを使用することです。つまり、ワールド内の各エンティティをボックスにしてから、ボックスの各軸が他のエンティティと衝突していないかどうかを確認します。
衝突をテストするエンティティが大量にある場合は、八分木にチェックインすることをお勧めします。単純に世界をセクターに分割し、同じセクター内のオブジェクト間の衝突のみをチェックします。
その他のリソースについては、sourceforgeにアクセスして、オープンソースの衝突検出および物理エンジンであるBullet Dynamics Engineを検索するか、豊富なゲーム開発に関するリソースが豊富なhttp://www.gamedev.netを確認してください。トピック。
ライブラリを使用してください。Box2Dをお勧めします
この質問はかなり一般的です。2Dゲームで衝突検出を行う方法はたくさんあります。あなたが何をしようとしているのかを知ることは助けになるでしょう。
出発点として、円や長方形などの間の検出を可能にする非常に単純な方法があります。私はgamedev.netの大ファンではありませんが、このタイプの検出に関するいくつかの優れたリソースがあります。そのような記事の1つがここにあります。それはあなたが始めるのを助けるかもしれないいくつかの基本的な資料をカバーしています。
基本的な2Dゲームでは、長方形または円を使用して、画面上のオブジェクトを「囲む」ことができます。長方形が重なるとき、または円が重なるときの検出は、かなり簡単な計算です。より複雑なもの(凸状の関節ポリなど)が必要な場合、解決策はより複雑になります。繰り返しになりますが、gamedev.netはここで役立つかもしれません。
しかし、本当にあなたの質問に答えるために、私たちはあなたが何をしようとしているのかを知る必要がありますか?どんなタイプのゲーム?どのタイプのオブジェクトを衝突させようとしていますか?画面の境界などと衝突しようとしていますか?
衝突検出システムの実装は複雑な問題ですが、3 つのポイントを考慮する必要があります。
オブジェクトの世界。スペース分割。ワールド内のすべての 2D スプライトに対して他のすべてのものに対して衝突チェックを行うと、プログラムが遅くなります。優先する必要があります。スペースを分割する必要があります。直交グリッド システムを使用して、世界を 2D グリッドにスライスできます。または、区切り関数として行を使用して、BSP ツリーを使用することもできます。
ブロード フェーズ コリジョン検出 これは、円柱や楕円 (スプライトの形状に最も近いもの) などのバウンディング ボリュームを使用して、オブジェクトをより詳細に比較する価値があるかどうかを判断します。これの計算は簡単です。2D マトリックス変換を学びます。また、2D 交差の場合は、強力なビデオ カードを使用して多くの作業を行うこともできます!
狭位相衝突検出 2 つ以上のオブジェクトを比較する価値があると判断したので、微調整セクションに進みます。このフェーズの目標は、衝突結果を決定することです。侵入深度、含まれるボリュームなど...そして、この情報は、計画した物理エンジンに供給されます。3D では、これは、私たちが大好きな GJK 距離アルゴリズムやその他の neato アルゴリズムの領域です。
これらすべてを一般的に実装し、幅広い解像度と狭い解像度をポリモーフィックに指定するか、低レベル言語で作業している場合はフックを提供できます。
2D で 2 つのボール間の衝突をチェックするのは簡単です。グーグルで検索できますが、基本的には、2 つのボールの半径を合わせた長さが 2 つのボールの中心間の距離以上かどうかを確認します。
次に、ボールの中心間の単位ベクトルを取得し、ボールの半径の 1 つを掛けて、衝突点を見つけることができます。
何の間の衝突?スプライト、凹多角形、凸多角形、長方形、正方形、円、点などを使用するかどうかによって異なります。