Java 等距瓷砖生成
所以我的问题是,通常在生成地图时,我会使用以下方法:Java 等距瓷砖生成,java,loops,isometric,Java,Loops,Isometric,所以我的问题是,通常在生成地图时,我会使用以下方法: for(int x = 0; x < width; x++) { for(int y = 0; y < height; y++) { tiles.add(new Tile(x, y)); } } for(int x=0;x
for(int x = 0; x < width; x++) {
for(int y = 0; y < height; y++) {
tiles.add(new Tile(x, y));
}
}
for(int x=0;x
你可以从中得到好处。
无论如何,我需要有一个非常实用的方法,以等距/45度旋转的方式来做这件事
说出要添加新平铺的第一个循环(宽度/2,0)
下一个循环将添加新的平铺((宽度/2)-1,0)和新的平铺((宽度/2)+1,0)
我尝试了几种不同的方法来实现这一点,但没有取得太大的成功。如果我理解正确,您似乎在尝试为等距游戏表示瓷砖,例如: 为此,您的
平铺
s使用以下布局存储其位置的(x,y)信息:
y \ x | 0 | 1 | 2 | 3 | 4 | 5 | 6
------+---+---+---+---+---+---+---
0 | | | | A | | |
------+---+---+---+---+---+---+---
1 | | | B | | C | |
------+---+---+---+---+---+---+---
2 | | D | | E | | F |
------+---+---+---+---+---+---+---
| | | | | | |
等等
但是,我建议将平铺网格的内部表示与显示方式分离。仅仅因为您需要等轴测图形,并不一定意味着您必须将平铺
s'(x,y)-位置也存储为菱形
相反,请为每个磁贴尝试以下布局:
y \ x | 0 | 1 | 2 | 3
------+---+---+---+---
0 | A | C | F |
------+---+---+---+---
1 | B | E | |
------+---+---+---+---
2 | D | | |
------+---+---+---+---
| | | |
也就是说,磁贴A
被创建为新磁贴(0,0)
,磁贴B
被创建为新磁贴(0,1)
,等等
使用此表示法,您将获得一个优势,即等轴测显示中的相邻平铺在x方向或y方向上仅相差1
。这将使平铺
列表的初始化步骤更加容易
要将这些坐标映射到等轴测显示位置,请记住位置(0,0)
处的平铺A
位于菱形的顶部。然后,可以计算所有其他分幅相对于该分幅的显示位置:
- x坐标的差异转化为向右和向下移动
- y坐标的差异转化为向左和向下移动
(px,py)
处渲染A
,并且每个平铺都以pWidth
的宽度和pHeight
的高度渲染
然后,可以通过向右移动tile.x
次和向左移动tile.y
次来计算tile
的水平偏移。由于是等轴测视图,因此在每一步中仅偏移宽度的一半
int pxTile = (tile.x - tile.y) * pWidth / 2 + px;
垂直偏移的计算方法与此类似。虽然tile.x
和tile.y
在水平方向上相互抵消(因为左侧和右侧彼此相对),但它们都有助于在垂直方向上向下移动
int pyTile = (tile.x + tile.y) * pHeight / 2 + py;
除非您的游戏进行滚动/缩放,否则您可以计算构造器中每个
磁贴的像素坐标,因为它们只取决于(x,y)的值和常量宽度,px
,py
,pWidth
,而且,pHeight
保持您习惯的表示方式,并以等距方式(即旋转45度)显示瓷砖,不是更容易吗?因此,最上面的磁贴实际上位于(宽度-1,0),下一行的两个磁贴位于(宽度-2,0)和(宽度-1,1)(假设逆时针旋转)?@Thomas尽管这可能是一种更简单的方法,但问题是磁贴仅跟踪其X&Y位置,并存储在列表中。所以渲染时很难计算它们的偏移量。哦,我明白了。出于某种原因,我假设您将使用二维数组作为网格,即使您的代码清楚地指示了一个列表。我的错。我在下面更新了我的答案,以消除这个假设——我认为我提出的总体想法仍然有效。我已经更新了我原来的答案很多。我添加了一段文字,说明使用我建议的(x,y)-坐标编码,计算平铺的渲染偏移量实际上非常容易。谢谢,终于排序好了:)