等尺性衝突検出


11

2つのアイソメトリックタイルの衝突を検出しようとすると問題が発生します。

タイルの各ポイント間のラインをプロットしてからラインインターセプトを確認しようとしましたが、機能しませんでした(おそらく間違った式が原因です)。

今日しばらくこれを調べた後、私は多くのことを検討していると思います。もっと簡単な方法があるはずです。

私はコードを探していませんが、オーバーラップの検出を達成するための最良の方法に関するいくつかのアドバイス


4
正確に何をしようとしていますか?マウスがタイルの上にあるとき、または2つのユニットが重なっているかどうかを検出しますか?それは後に、あなたが本当に「グラフィックス」から、あなたの「ゲーム」を分離する考えなければならないなら
ジョン・マクドナルド

動いているアイソタイルの側面が動いていないタイルにぶつかったときに、動いているタイルが停止するようにする必要があります。私が問題を抱えているのは、衝突テストだけです。バインドボックスを使用することもできますが、正確に衝突する必要があります。
Chris Crew、

回答:


23

私はまっすぐ出てきて、質問で説明した問題(等タイル型の長方形間の衝突検出)を解決する方法はわかりませんが、他の人が過去にどのように解決したかを教えてくれます:

他のゲームでそれを行う方法は、画面の世界からゲームの世界を分離することです。あなたが始めているとき、それらが同じものであると想像することは一般的ですが、それからあなたが説明しているような問題につながります。

一般的な考え方は、ゲームの世界はメモリ内に完全に格納されているということです。これは、数値、参照、ロジックだけです。あなたがゲームの世界を等角投影で描いているという事実は無関係です。ゲームの世界には、等角投影、正方形、または画面が3Dで描画されている場合でも、概念はありません。画面にゲームの世界(別名画面の世界)を描画すると、これらすべてが処理されます。ゲームの世界は、ゲームにとって意味のある最も簡単な方法で保存および保守する必要があります。アイソメトリックゲームでは、通常、アイソメであるという事実を完全に無視し、軸に沿ったグリッドを使用しているかのように位置を保存します。ほとんどのゲームは、2つの世界の間の座標を変換するための方法を持って、私は私を呼ぶScreenToWorld(x, y)と、WorldToScreen(x, y)。多くの場合、変換はMatrix数学で行われますが、他の方法でも実現できます。マウスを使用する場合はScreenToWorldを使用し、描画する場合はWorldToScreenを使用します。

ゲームの世界画面の世界を分割することには、いくつかの利点があります。利点の1つは、衝突の検出と動きがすべてゲームの世界で行われることです。したがって、斜めのグリッド、傾斜した座標、または画面の場所などを処理していないため、通常は非常に簡単です。 、軸に沿った長方形と正方形を扱います。ゲームの世界が更新されたら、ゲームの世界の描写を画面に描画します。キーワード:描写。最初は直感に反するように見えるかもしれませんが、画面はゲームの世界で起こっていることを表すだけです。これにより、専用サーバーや端末のようなクライアントが可能になります。

FreeCivは実際、これらすべての優れた例です。正方形の北/南グリッド、等角投影、さらには16進数と同じ正確な世界を表示できます。シングルプレイヤーゲームの場合でも、実行するすべてのゲームのバックグラウンドで専用サーバーが実行されるため、クライアントは単なるディスプレイポートにすぎません。

簡単に言えば、ゲームの世界とロジックを画面の世界から分離すると、ゲームのロジックが簡素化され、ゲームとディスプレイのカップリングが減り、「iso」タイル間の衝突の検出が簡単になり、視覚化しやすくなります。


よく説明された答えのおかげで、描画されたものと背景で起こっていることのロジックを分けていましたが、すべてを斜めグリッドとして扱いました。
Chris Crew

1
未来の人々のために; グラフィックはデータの解釈です。ゲームの4つの主要な部分:ロジック、データ、入力、出力。それらをひとまとめにしないでください。また、優れた反応John、+1
Aarowaim 2014

9

ジョンの答えはまったく正しいですが、別の方法で説明しようと思います。

アイソメトリック衝突検出はありません。

衝突検出は、投影行列/変換がどのように見えるかを気にしません。レンダリングを行う場合でも、衝突検出は問題になりません(結局、画面の外にあるオブジェクトでも衝突する可能性はありますよね?)

それはより哲学的な質問です:森に落ちた木はまだ誰もいないときに実際に地面に衝突しますか?

従来の知恵は言うでしょう:はい。それをどのように見るかは問題ではありません。物事はビュースペースではなく、ワールドスペースで衝突します。


2
+1まあ。「アイソメトリック衝突検出はありません」
John McDonald

1
ありがとう、私はあなたがすでに言ったことをちょうど言いました。しかし、少し異なります。
MarkR 2012

0

個々のピクセルのそれぞれのgetRGB()値のビットマップを構成するピクセルの配列を割り当てることができます。タイルの境界線はタイルが表すもの(水、砂、草)の色値とは別の色値であるため、値をifステートメントと比較します。基本的な等尺性グリッドの場合。または、マップ自体の2つのレイヤーを持つことができます。衝突するオブジェクトの各代表の輪郭を描くグリーンスクリーンのようなものを含む1つのレイヤーと、もう1つのレイヤーはマップ自体になります。

マップレイヤーの各ピクセルのビットマップ配列を構成するのではなく、オブジェクトが維持する色の値の境界に衝突/交差したときの効果を表す一連の色を計算します。値を小さくするか、オブジェクトが移動する速度を速くするかを指定します。移動する各オブジェクトは、別の場所に格納されているメモリの複製です。

ピクセルの完全な衝突とビットマップ配列の理解について調べます。各四角形は、インプリントされたメモリのような複製データを含む境界です。オブジェクトが場所またはベクトルでレンダリングされる場所に応じて、各イベントがトリガーされます。画面上のすべての点は2D平面上にあり、影の深さはオブジェクトがそれ自体を3Dとして表現しているような錯覚をもたらします。スキュー内の形状の変換は、オブジェクトが傾いているように感じさせます。カメラが表示する中心点には、すべてがこの中心点の周りに運ばれ、サイズが小さくなったり、小さくなったり、大きくなったりします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.