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)-坐标编码,计算平铺的渲染偏移量实际上非常容易。谢谢,终于排序好了:)