2

したがって、私の問題は、通常、マップを生成するときに、次のものを使用することです。

for(int x = 0; x < width; x++) {
    for(int y = 0; y < height; y++) {
       tiles.add(new Tile(x, y));
    }
}

あなたはそれだけを手に入れることができます。とにかく、私はアイソメトリック/45度の回転でこれを行うための実用的な方法をかなり持っている必要があります。

新しいTile(width / 2、0)を追加する最初のループを言います。

次のループでは、新しいTile((width / 2)-1、0)と新しいTile((width / 2)+ 1、0)を追加します。

私はこれを行うためにいくつかの異なる方法を試しましたが、あまり成功していません。

4

1 に答える 1

2

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

ここに画像の説明を入力

このために、Tileは次のレイアウトで位置の (x,y) 情報を保存します。

y \ x | 0 | 1 | 2 | 3 | 4 | 5 | 6
------+---+---+---+---+---+---+---
   0  |   |   |   | A |   |   |
------+---+---+---+---+---+---+---
   1  |   |   | B |   | C |   |
------+---+---+---+---+---+---+---
   2  |   | D |   | E |   | F |
------+---+---+---+---+---+---+---
      |   |   |   |   |   |   |

等々。

ただし、タイル グリッドの内部表現を表示方法から切り離すことをお勧めします。アイソメトリック グラフィックスが必要だからといって、必ずしもTiles' (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)

この表現を使用すると、アイソメ表示で隣接するタイルが1x 方向または y 方向のいずれかでのみ異なるという利点が得られます。これにより、リストの初期化ステップがtilesはるかに簡単になります。

これらの座標をアイソメ表示位置にマッピングするには、位置のタイルA(0,0)ひし形の上部にあることに注意してください。次に、そのタイルに対する他のすべてのタイルの表示位置を計算できます。

  • x 座標の違いは、右および下への移動に変換されます
  • y 座標の違いは、左および下への移動に変換されます

Aしたがって、ディスプレイがピクセル座標(px, py)でレンダリングされ、すべてのタイルが の幅pWidthと高さでレンダリングされると仮定しましょうpHeight

の水平方向のオフセットは、右を歩く回数と左を歩く回数tileによって計算できます。等角図であるため、各ステップで幅の半分だけオフセットします。tile.xtile.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のみに依存するため、コンストラクターですべての右のピクセル座標を計算できます。widthpxpypWidthpHeight

于 2012-10-31T00:44:25.333 に答える