私の理解が正しければ、アイソメトリック ゲームのタイルを表現しようとしているようです。

このために、Tile
は次のレイアウトで位置の (x,y) 情報を保存します。
y \ x | 0 | 1 | 2 | 3 | 4 | 5 | 6
------+---+---+---+---+---+---+---
0 | | | | A | | |
------+---+---+---+---+---+---+---
1 | | | B | | C | |
------+---+---+---+---+---+---+---
2 | | D | | E | | F |
------+---+---+---+---+---+---+---
| | | | | | |
等々。
ただし、タイル グリッドの内部表現を表示方法から切り離すことをお勧めします。アイソメトリック グラフィックスが必要だからといって、必ずしもTile
s' (x,y) 位置をひし形にも格納する必要があるとは限りません。
代わりに、タイルごとに次のレイアウトを試してください。
y \ x | 0 | 1 | 2 | 3
------+---+---+---+---
0 | A | C | F |
------+---+---+---+---
1 | B | E | |
------+---+---+---+---
2 | D | | |
------+---+---+---+---
| | | |
つまり、タイルA
は として作成されnew Tile(0,0)
、タイルはB
として作成されますnew Tile(0,1)
。
この表現を使用すると、アイソメ表示で隣接するタイルが1
x 方向または y 方向のいずれかでのみ異なるという利点が得られます。これにより、リストの初期化ステップがtiles
はるかに簡単になります。
これらの座標をアイソメ表示位置にマッピングするには、位置のタイルA
が(0,0)
ひし形の上部にあることに注意してください。次に、そのタイルに対する他のすべてのタイルの表示位置を計算できます。
- x 座標の違いは、右および下への移動に変換されます
- y 座標の違いは、左および下への移動に変換されます
A
したがって、ディスプレイがピクセル座標(px, py)
でレンダリングされ、すべてのタイルが の幅pWidth
と高さでレンダリングされると仮定しましょうpHeight
。
の水平方向のオフセットは、右を歩く回数と左を歩く回数tile
によって計算できます。等角図であるため、各ステップで幅の半分だけオフセットします。tile.x
tile.y
int pxTile = (tile.x - tile.y) * pWidth / 2 + px;
垂直方向のオフセットも同様に計算されます。tile.x
とは水平方向では互いに打ち消し合いますがtile.y
(左右が反対であるため)、両方とも垂直方向で下に移動するのに寄与します。
int pyTile = (tile.x + tile.y) * pHeight / 2 + py;
ゲームがスクロール/ズームを行わない限り、(x,y) の値と定数、、、Tile
のみに依存するため、コンストラクターですべての右のピクセル座標を計算できます。width
px
py
pWidth
pHeight