如果我理解正确,您似乎正在尝试代表等距游戏的图块,例如:
为此,您Tile
的 s 使用以下布局存储其位置的 (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 | | |
------+---+---+---+---
| | | |
也就是说, tileA
创建为new Tile(0,0)
, tile B
asnew 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;
除非您的游戏进行滚动/缩放,否则您可以Tile
在构造函数中计算每个右侧的像素坐标,因为它们仅取决于 (x,y) 的值和常量width
、px
、py
、pWidth
和pHeight
。