2つのアイソメトリックタイルの衝突を検出しようとすると問題が発生します。
タイルの各ポイント間のラインをプロットしてからラインインターセプトを確認しようとしましたが、機能しませんでした(おそらく間違った式が原因です)。
今日しばらくこれを調べた後、私は多くのことを検討していると思います。もっと簡単な方法があるはずです。
私はコードを探していませんが、オーバーラップの検出を達成するための最良の方法に関するいくつかのアドバイス
2つのアイソメトリックタイルの衝突を検出しようとすると問題が発生します。
タイルの各ポイント間のラインをプロットしてからラインインターセプトを確認しようとしましたが、機能しませんでした(おそらく間違った式が原因です)。
今日しばらくこれを調べた後、私は多くのことを検討していると思います。もっと簡単な方法があるはずです。
私はコードを探していませんが、オーバーラップの検出を達成するための最良の方法に関するいくつかのアドバイス
回答:
私はまっすぐ出てきて、質問で説明した問題(等タイル型の長方形間の衝突検出)を解決する方法はわかりませんが、他の人が過去にどのように解決したかを教えてくれます:
他のゲームでそれを行う方法は、画面の世界からゲームの世界を分離することです。あなたが始めているとき、それらが同じものであると想像することは一般的ですが、それからあなたが説明しているような問題につながります。
一般的な考え方は、ゲームの世界はメモリ内に完全に格納されているということです。これは、数値、参照、ロジックだけです。あなたがゲームの世界を等角投影で描いているという事実は無関係です。ゲームの世界には、等角投影、正方形、または画面が3Dで描画されている場合でも、概念はありません。画面にゲームの世界(別名画面の世界)を描画すると、これらすべてが処理されます。ゲームの世界は、ゲームにとって意味のある最も簡単な方法で保存および保守する必要があります。アイソメトリックゲームでは、通常、アイソメであるという事実を完全に無視し、軸に沿ったグリッドを使用しているかのように位置を保存します。ほとんどのゲームは、2つの世界の間の座標を変換するための方法を持って、私は私を呼ぶScreenToWorld(x, y)
と、WorldToScreen(x, y)
。多くの場合、変換はMatrix数学で行われますが、他の方法でも実現できます。マウスを使用する場合はScreenToWorldを使用し、描画する場合はWorldToScreenを使用します。
ゲームの世界と画面の世界を分割することには、いくつかの利点があります。利点の1つは、衝突の検出と動きがすべてゲームの世界で行われることです。したがって、斜めのグリッド、傾斜した座標、または画面の場所などを処理していないため、通常は非常に簡単です。 、軸に沿った長方形と正方形を扱います。ゲームの世界が更新されたら、ゲームの世界の描写を画面に描画します。キーワード:描写。最初は直感に反するように見えるかもしれませんが、画面はゲームの世界で起こっていることを表すだけです。これにより、専用サーバーや端末のようなクライアントが可能になります。
FreeCivは実際、これらすべての優れた例です。正方形の北/南グリッド、等角投影、さらには16進数と同じ正確な世界を表示できます。シングルプレイヤーゲームの場合でも、実行するすべてのゲームのバックグラウンドで専用サーバーが実行されるため、クライアントは単なるディスプレイポートにすぎません。
簡単に言えば、ゲームの世界とロジックを画面の世界から分離すると、ゲームのロジックが簡素化され、ゲームとディスプレイのカップリングが減り、「iso」タイル間の衝突の検出が簡単になり、視覚化しやすくなります。
ジョンの答えはまったく正しいですが、別の方法で説明しようと思います。
アイソメトリック衝突検出はありません。
衝突検出は、投影行列/変換がどのように見えるかを気にしません。レンダリングを行う場合でも、衝突検出は問題になりません(結局、画面の外にあるオブジェクトでも衝突する可能性はありますよね?)
それはより哲学的な質問です:森に落ちた木はまだ誰もいないときに実際に地面に衝突しますか?
従来の知恵は言うでしょう:はい。それをどのように見るかは問題ではありません。物事はビュースペースではなく、ワールドスペースで衝突します。
個々のピクセルのそれぞれのgetRGB()値のビットマップを構成するピクセルの配列を割り当てることができます。タイルの境界線はタイルが表すもの(水、砂、草)の色値とは別の色値であるため、値をifステートメントと比較します。基本的な等尺性グリッドの場合。または、マップ自体の2つのレイヤーを持つことができます。衝突するオブジェクトの各代表の輪郭を描くグリーンスクリーンのようなものを含む1つのレイヤーと、もう1つのレイヤーはマップ自体になります。
マップレイヤーの各ピクセルのビットマップ配列を構成するのではなく、オブジェクトが維持する色の値の境界に衝突/交差したときの効果を表す一連の色を計算します。値を小さくするか、オブジェクトが移動する速度を速くするかを指定します。移動する各オブジェクトは、別の場所に格納されているメモリの複製です。
ピクセルの完全な衝突とビットマップ配列の理解について調べます。各四角形は、インプリントされたメモリのような複製データを含む境界です。オブジェクトが場所またはベクトルでレンダリングされる場所に応じて、各イベントがトリガーされます。画面上のすべての点は2D平面上にあり、影の深さはオブジェクトがそれ自体を3Dとして表現しているような錯覚をもたらします。スキュー内の形状の変換は、オブジェクトが傾いているように感じさせます。カメラが表示する中心点には、すべてがこの中心点の周りに運ばれ、サイズが小さくなったり、小さくなったり、大きくなったりします。