等距瓷砖生成

时间:2012-10-31 00:16:44

标签: java loops isometric

所以我的问题是,通常在我生成地图时,我会使用以下内容:

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

你可以得到正义的。 无论如何,我需要在等距/ 45度旋转中以务实的方式做到这一点。

说第一个循环你要添加新的平铺(宽度/ 2,0)。

接下来循环你添加新的平铺((宽度/ 2) - 1,0)和新的平铺((宽度/ 2)+ 1,0)。

我尝试过几种不同的方法来做到这一点,但是没有取得多大成功。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您似乎正在尝试为等距游戏代表瓷砖,例如:

enter image description here

为此,您的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),平铺Bnew Tile(0,1)等。

使用此表示法,您将获得以下优势:等轴测量显示中的相邻切片在x方向或y方向上仅相差1。这应该使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)和常量width的值,pxpypWidthpHeight