1

Android ゲームでピクセル単位の衝突検出が必要です。「通常の」ビットマップ (回転されていない) との衝突を検出するコードをいくつか書きました。正常に動作します。ただし、回転したビットマップでは取得できません。残念ながら、Java には回転した四角形のクラスがないため、自分で実装しました。画面に対する四隅の位置を保持し、ビットマップの正確な位置/レイヤーを記述します。「アイテムサーフェス」と呼ばれます。検出を解決するための私の計画は次のとおりでした。

  1. 異なる itemSurfaces の交差を検出する
  2. 重なり面積の計算
  3. 上位 itemSurface/bitmap に関連してこれらの領域を設定します
  4. 各単一ピクセルを他のビットマップの対応するピクセルと比較します

さて、1枚目と2枚目で悩んでいます。誰かがアイデアを持っているか、コードを持っていますか? たぶん、Java/Android ライブラリには既にコードがあり、私はそれを見つけられませんでした。

4

1 に答える 1

0

長方形(異なる方法で回転)間の衝突検出が必要であることを理解しています。重複領域を計算する必要はありません。さらに、すべてのピクセルを比較しても効果がありません。

static boolean isCollisionある長方形と別の長方形の間に衝突があるかどうかを知らせる関数を実装します。一枚の紙を取る前に、正確な式を見つけるためにいくつかの幾何学を行います. パフォーマンス上の理由から、一部の Rectangle クラスで四角形をラップせず、double などのプリミティブ型を使用してください。

次に(疑似コード):

for (every rectangle a)
  for (every rectangle b)
    if (a != b && isCollision(a, b))
      bounce(a, b)  

これは O(n^2) で、n は長方形の数です。より高いパフォーマンスが必要な場合は、より優れたアルゴリズムがあります。bounce関数は、移動する四角形のベクトルを変更して、衝突を模倣します。オブジェクトの重量が同じ場合 (四角形のサイズと重量を近似できます)、2 つの速度ベクトルを交換するだけで済みます。

要素を正しくバウンスするboolean alreadyBounced[][]には、既にバウンスされているため、バウンス (衝突) 後にベクトルを変更する必要のない四角形を決定するために、補助テーブルを格納する必要があります。

もう 1 つのヒント:

Android でゲームを作成している場合、ゲームプレイ中にメモリを割り当てないように注意する必要があります。これは、GC の呼び出しが速くなり、長い時間がかかり、ゲームが遅くなるためです。このビデオと関連するビデオを見ることをお勧めします。幸運を。

于 2012-07-13T18:17:27.520 に答える