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) 的第一个循环。

下一个循环,您将添加 new Tile((width / 2) - 1, 0) 和 new Tile((width / 2) + 1, 0)。

我已经尝试了几种不同的方法来做到这一点,但没有取得太大的成功。

4

1 回答 1

2

如果我理解正确,您似乎正在尝试代表等距游戏的图块,例如:

在此处输入图像描述

为此,您Tile的 s 使用以下布局存储其位置的 (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 |   |   | 
------+---+---+---+---
      |   |   |   | 

也就是说, tileA创建为new Tile(0,0), tile Basnew 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.xtile.y在水平方向上相互抵消(因为左右彼此相反),但它们都有助于在垂直方向上向下移动。

int pyTile = (tile.x + tile.y) * pHeight / 2 + py;

除非您的游戏进行滚动/缩放,否则您可以Tile在构造函数中计算每个右侧的像素坐标,因为它们仅取决于 (x,y) 的值和常量widthpxpypWidthpHeight

于 2012-10-31T00:44:25.333 回答