1

Cocos2D を使用して、カジュアルなグリッド ベースの 2D iPhone ゲームを作成しています。グリッドは、均一なサイズと間隔で配置されたディスクで構成される「ずらした」六角形のグリッドです。こんな感じです

グリッドを 2D 配列に格納しました。また、グリッドセルを「囲む」という概念もあります。つまり、特定のセルを囲む 6 つのグリッド セルです (6 つ未満のセルを持つことができる境界上のグリッド セルを除く)。

とにかく、衝突検出をテストしていますが、計画どおりに機能していません。静止しているディスクのグループに近づいている移動ディスクの衝突検出を現在どのように行っているかを次に示します。

  1. 移動セルの xy 位置を使用して、移動セルに最も近いグリッド セルの ij 座標を計算します。
  2. ij 座標を使用して周囲のグリッド セルのリストを取得する
  3. 周囲の細胞を調べます。それらがすべて空の場合、衝突はありません
  4. 空でない周囲のセルがいくつかある場合は、ディスクの中心間の距離を衝突に必要な最小距離と比較します
  5. 衝突が発生した場合は、移動ディスクをグリッド セル ij に配置します。

したがって、これは機能しますが、あまりうまくいきません。ゲーム ループの各ステップで、移動するディスクと静止しているすべてのディスクを比較するだけの、より単純なブルート フォース アプローチを検討しました。静止ディスク数が最大 300 であるため、これはおそらくパフォーマンスの観点から実現可能です。そうでない場合は、スペース分割データ構造を使用できますが、複雑すぎると感じます。

このようなゲームで衝突を検出するための一般的なアプローチとベスト プラクティスは何ですか?

4

1 に答える 1

2

移動する円盤の xy 座標を最も近いセルに正確にマッピングできるはずです。

    +------+-------+-------+ odd rows
    |      |       |       |
    |      |       |       |
+---|--+---|---+---|----+  | 
|   +--|---+---|---+----|--+
|      | x     |        | <- even rows
|   +--|---+---|---+----|--+ odd rows
+---|--+---|-y-+---|----+  |
    |      |       |       |
    |      |       |       |
    +------+-------+-------+

ポイントxは、even_row[0][1] にあり、ポイントyは、odd_row[1][1] にあり、同時に、even_row[0][1] にあります。最大で 2 つの場所があり、そのうちのどれが最も近いかを計算できます。(偶数行と奇数行を別の配列に保持する理由はありません...)

y を奇数行と偶数行にマップする数式を導き出すことができるはずです。

于 2012-10-19T06:38:40.457 に答える