所以我的问题是,通常当我生成 map 时我会使用以下内容:
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)。
我尝试了几种不同的方法来做到这一点,但没有取得太大成功。
最佳答案
如果我理解正确,您似乎正在尝试表示等距游戏的图 block ,例如:
为此,您的 Tile
使用以下布局存储其位置的 (x,y) 信息:
y \ x | 0 | 1 | 2 | 3 | 4 | 5 | 6
------+---+---+---+---+---+---+---
0 | | | | A | | |
------+---+---+---+---+---+---+---
1 | | | B | | C | |
------+---+---+---+---+---+---+---
2 | | D | | E | | F |
------+---+---+---+---+---+---+---
| | | | | | |
等等。
但是,我建议将图 block 网格的内部表示与其显示方式分离。仅仅因为您想要等距图形并不一定意味着您也必须将 Tile
的 (x,y) 位置存储为菱形。
相反,请尝试对每个图 block 使用以下布局:
y \ x | 0 | 1 | 2 | 3
------+---+---+---+---
0 | A | C | F |
------+---+---+---+---
1 | B | E | |
------+---+---+---+---
2 | D | | |
------+---+---+---+---
| | | |
也就是说,tile A
创建为 new Tile(0,0)
,tile B
创建为 new Tile(0 ,1)
等
通过这种表示,您将获得以下优势:等轴测显示中的相邻图 block 在 x 或 y 方向上仅相差 1
。这将使您的tiles
列表的初始化步骤变得更加容易。
要将这些坐标映射到等距显示位置,请记住位置 (0,0)
处的图 block A
位于菱形的顶部。然后,您可以计算所有其他图 block 相对于该图 block 的显示位置:
- x 坐标的差异转化为向右和向下移动
- y 坐标的差异转化为向左和向下移动
因此,我们假设您的显示器在像素坐标 (px, py)
处渲染 A
,并且每个图 block 的渲染宽度为 pWidth
> 高度为 pHeight
。
然后可以通过向右行走tile.x
次和向左行走tile.y
次来计算tile
的水平偏移。由于是等轴测 View ,因此每一步仅偏移宽度的一半。
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) 的值和常量宽度
、px
、py
、pWidth
和pHeight
。
关于java - 等距图 block 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13149483/