【问题标题】:Isometric Tile Generation等距平铺生成
【发布时间】:2012-10-31 00:16:43
【问题描述】:

所以我的问题是,通常当我生成地图时,我会使用以下内容:

for(int x = 0; x < width; x++) {
    for(int y = 0; y < height; y++) {
       tiles.add(new Tile(x, y));
    }
}

您可以做到这一点。 无论如何,我需要以实用的方式在等距/45 度旋转中做到这一点。

说出你要添加的第一个循环 new Tile(width / 2, 0)。

下一个循环,您将添加 new Tile((width / 2) - 1, 0) 和 new Tile((width / 2) + 1, 0)。

我尝试了几种不同的方法来做到这一点,但都没有取得太大的成功。

【问题讨论】:

  • 按照您习惯的方式保持表示方式,并以等距方式(即旋转 45 度)显示图块不是更容易吗?这样最上面的图块实际上在 (width-1, 0),下一行的两个在 (width-2, 0) 和 (width-1, 1) (假设逆时针旋转)?
  • @Thomas 虽然这可能是一种更简单的方法,但问题在于图块仅跟踪其 X 和 Y 位置,并存储在列表中。所以渲染时很难计算它们的偏移量。
  • 哦,我明白了。出于某种原因,我假设您将使用二维数组作为网格,即使您的代码清楚地指示了一个列表。我的错。我在下面更新了我的答案以消除该假设 - 我认为我提出的总体思路仍然成立。
  • 我已经更新了很多我原来的答案。我添加了一个段落,显示使用我建议的 (x,y) 坐标编码,实际上计算图块的渲染偏移非常容易。

标签: java loops isometric


【解决方案1】:

如果我理解正确,您似乎是在尝试为等距游戏表示图块,例如:

为此,您的Tiles 使用以下布局存储其位置的 (x,y) 信息:

y \ x | 0 | 1 | 2 | 3 | 4 | 5 | 6
------+---+---+---+---+---+---+---
   0  |   |   |   | A |   |   |
------+---+---+---+---+---+---+---
   1  |   |   | B |   | C |   |
------+---+---+---+---+---+---+---
   2  |   | D |   | E |   | F |
------+---+---+---+---+---+---+---
      |   |   |   |   |   |   |

等等。

但是,我建议将图块网格的内部表示与其显示方式分离。仅仅因为您想要等距图形并不一定意味着您必须将Tiles' (x,y) 位置也存储为菱形。

相反,请为每个图块尝试以下布局:

y \ x | 0 | 1 | 2 | 3 
------+---+---+---+---
   0  | A | C | F | 
------+---+---+---+---
   1  | B | E |   | 
------+---+---+---+---
   2  | D |   |   | 
------+---+---+---+---
      |   |   |   | 

即tileA创建为new Tile(0,0),tileB创建为new Tile(0,1)

通过这种表示,您将获得优势,即等轴测显示中的相邻图块在 x 或 y 方向上仅相差1。这应该会使您的tiles 列表的初始化步骤更加容易。

要将这些坐标映射到等轴测显示位置,请记住位于位置(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.xtile.y 在水平方向上相互抵消(因为左右相反),但它们都有助于在垂直方向上向下移动。

int pyTile = (tile.x + tile.y) * pHeight / 2 + py;

除非您的游戏进行滚动/缩放,否则您可以在构造函数中计算每个 Tile 的像素坐标,因为它们仅取决于 (x,y) 的值和常量 widthpxpypWidthpHeight

【讨论】:

  • 谢谢,终于搞定了:)
猜你喜欢
  • 2012-12-20
  • 2018-10-28
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多