2DタイルベースのRTSを書いています。そして私はそれに「疑似3D」機能を追加したいと思います-川に架かる橋。
私はまだコーディングを開始していません。衝突検出モデルにどのように適合するかを考えようとしています。橋の下を通過するボートと橋の上を移動するユニットは、最終的にマップ上の同じセルを占有します。それらを衝突から予防する方法は?
そのような問題を解決するための一般的なアプローチはありますか?または、これを行うには3Dワールドを実装する必要がありますか?
2DタイルベースのRTSを書いています。そして私はそれに「疑似3D」機能を追加したいと思います-川に架かる橋。
私はまだコーディングを開始していません。衝突検出モデルにどのように適合するかを考えようとしています。橋の下を通過するボートと橋の上を移動するユニットは、最終的にマップ上の同じセルを占有します。それらを衝突から予防する方法は?
そのような問題を解決するための一般的なアプローチはありますか?または、これを行うには3Dワールドを実装する必要がありますか?
回答:
基本的には3番目の次元を作成する必要がありますが、最も単純なケースでは、「地上/橋上」と「水上/橋下」の2つの値のみで構成できます。
Advanced Strategic Commandが行う方法からインスピレーションを得ることができます:ユニットは特定の高さレベルを占有し、他の方法で実行できる特定の機能(航空機の滑走路など)がない限り、そのタイプに合った高さレベルでのみ移動できます。それらを変更すると、通常、移動ポイントがかかり、高さレベルなどにペナルティが課されます。タイルは、それぞれが異なる高さレベルにある限り、任意の数のユニットで占有できます。
ASCの場合、レベルは次のとおりです。
レベルを指定する単純な属性を各タイルに追加できます。
だから例えば:
tileA.layer = 0 // Will be at the bottom
tileB.layer = 1 // Will be above level 0, on top of it.
// Add tiles to layered list
List<List<Tile>> tiles = new List<List<Tile>>();
tiles[0].add(tileA);
tiles[1].add(tileB);
// Draw 'em in the right order!
void Draw(List<List<Tile>> tiles) {
foreach( var listOfTiles in tiles ) {
foreach( var tile in listOfTiles ) {
tile.draw();
}
}
これで、レイヤーの値に応じてタイルを並べ替え、下から上に描画できます->上!これにより、ゲームにある程度の深みがあるように見えます。ほとんどのタイルエンジンがこれをサポートしています。追加できるもう1つの優れた点は、テクスチャに透明度を設定して、下のレイヤーが透けて見えるようにすることです。
これは、たとえば水で行うことができます-レベル1の水を想像してから、レベル0の海底を想像してください。水のテクスチャがやや透明であれば、海底を上から見ることができます。