所以我的问题是,通常在我生成地图时,我会使用以下内容:
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)。
我尝试过几种不同的方法来做到这一点,但是没有取得多大成功。
答案 0 :(得分:2)
如果我理解正确,您似乎正在尝试为等距游戏代表瓷砖,例如:
为此,您的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)
等。
使用此表示法,您将获得以下优势:等轴测量显示中的相邻切片在x方向或y方向上仅相差1
。这应该使tiles
列表的初始化步骤更加容易。
要将这些坐标映射到等轴测量显示位置,请记住位置A
处的图块(0,0)
位于菱形的顶部。然后,您可以计算所有其他图块相对于该图块的显示位置:
因此,我们假设您的显示在像素坐标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;
除非您的游戏进行滚动/缩放,否则您可以在构造函数中计算每个Tile
右边的像素坐标,因为它们仅取决于(x,y)和常量width
的值,px
,py
,pWidth
和pHeight
。