質問

2D ゲームのスプライトで衝突を検出する最良の方法は何ですか?私は現在アレグロとG++で作業しています

役に立ちましたか?

解決

衝突検出を検出する方法はたくさんあります。2D 環境を使用しているか 3D 環境を使用しているかによって、使用する方法が若干異なります。また、衝突検出システムを導入するときは、現実性を高めるためにゲームに実装する可能性のある物理 (ほとんどの降下 3D ゲームで必要) を考慮することも忘れないでください。

簡単に言えば、境界ボックスを使用することです。言い換えると、ワールド内の各エンティティをボックスにして、ボックスの各軸が他のエンティティと衝突しているかどうかを確認します。

衝突をテストするエンティティが大量にある場合は、オクツリーにチェックインすることをお勧めします。世界をセクターに分割し、同じセクター内のオブジェクト間の衝突のみをチェックするだけです。

さらにリソースが必要な場合は、sourceforge にアクセスして、オープンソースの衝突検出および物理エンジンである Bullet ダイナミクス エンジンを検索するか、以下をチェックしてください。 http://www.gamedev.net ここには、豊富なゲーム開発トピックに関するリソースが豊富にあります。

他のヒント

まともな 2D グラフィックス ライブラリは、位置合わせされたスプライトからポリゴン、ピクセルに至るまで、あらゆるものに対して独自の衝突検出機能を提供するか、それらの機能を実行する優れたサードパーティ ライブラリを 1 つ以上備えています。衝突検出は、単独で作成できるものよりもはるかに最適化されている可能性が高いため、エンジン/ライブラリ/フレームワークの選択によって衝突検出の選択が決まります。

アレグロの場合は、 コレグロ. 。SDLの場合は、 SDL_Collide.h または SDL-衝突. 。使用できます I_COLLIDE OpenGLを使って。DarkBASIC には衝突システムが組み込まれており、 ダーク物理学 衝突を含む非常に正確なインタラクションを実現します。

図書館を利用することをお勧めします ボックス2D

この質問はかなり一般的なものです。2D ゲームでの衝突検出にはさまざまな方法があります。あなたが何をしようとしているのかを知るのに役立ちます。

ただし、出発点として、円、長方形などの間の検出を可能にする非常に簡単な方法があります。私は gamedev.net の大ファンではありませんが、この種の検出に関する優れたリソースがいくつかあります。そのような記事の 1 つが、 ここ. 。始めるのに役立ついくつかの基本的な内容について説明します。

基本的な 2D ゲームでは、長方形または円を使用して画面上のオブジェクトを「囲む」ことができます。長方形が重なっているとき、または円が重なっているときの検出は、非常に単純な計算です。より複雑なもの (凸状の任意ポリゴンなど) が必要な場合、解決策はさらに複雑になります。ここでも、gamedev.net が役に立つかもしれません。

しかし、本当にあなたの質問に答えるには、あなたが何をしようとしているのかを知る必要がありますか?どのような種類のゲームですか?どのようなタイプのオブジェクトを衝突させようとしていますか?画面境界などに衝突しようとしていませんか。

衝突検知システムの実装は複雑ですが、次の 3 つの点を考慮する必要があります。

  • オブジェクトの世界。空間のパーティショニング。ワールド内のすべての 2D スプライトに対して他のすべてのスプライトに対して衝突チェックを実行すると、遅い遅いプログラムが完成します。優先順位を付ける必要があります。スペースを区切る必要があります。直交グリッド システムを使用して、世界を 2D グリッドにスライスできます。または、区切り関数として線を使用して BSP ツリーを使用することもできます。

  • 広い位相衝突検出これは、シリンダーや排出物などの境界ボリューム(スプライトの形状に最も近い場合でも)を使用して、オブジェクトがより詳細に比較する価値があるかどうかを判断します。これを計算するのは簡単です。2D マトリックス変換を学びましょう。2D 交差の場合は、高性能のビデオ カードを使用して多くの作業を実行することもできます。

  • 狭い位相衝突検出2つ以上のオブジェクトが比較する価値があると判断したので、微調整されたセクションに足を踏み入れます。このフェーズの目的は、衝突の結果を判断することです。浸透深さ、包含量など...そして、この情報は、あなたが計画した物理エンジンに入力されます。3D では、これは私たち皆が大好きな GJK 距離アルゴリズムやその他のニート アルゴリズムの領域です。

これらすべてを汎用的に実装し、幅広い解像度と狭い解像度を多態的に指定したり、低レベル言語で作業している場合はフックを提供したりできます。

何との間の衝突?スプライト、凹多角形、凸多角形、長方形、正方形、円、点などを使用するかどうかによって異なります。

2D で 2 つのボール間の衝突をチェックするのは簡単です。グーグルで調べることもできますが、基本的には、2 つのボールの半径を合わせた長さが 2 つのボールの中心間の距離以上であるかどうかを確認します。

次に、ボールの中心間の単位ベクトルを取得し、それにボールの半径の 1 つを乗算することで、衝突点を見つけることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top