java - 等距图 block 生成

标签 java loops isometric

所以我的问题是,通常当我生成 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 ,例如:

enter image description here

为此,您的 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.xtile.y 在水平方向上相互抵消(因为左右方向相反),但它们都有助于在水平方向上向下移动垂直方向。

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

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

关于java - 等距图 block 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13149483/

相关文章:

java - 在 fragment 和列表 fragment 之间切换会导致错误

java - 在 java 中寻找 "does everything buffer"- 决定使用 Netty

java - 在java中将枚举类型作为参数传递

php - 循环检查表中是否存在并生成随机字符串

algorithm - 交错等距探路者

java - 如何在 Java 11 中读取 HttpRequest 的正文?

JavaScript 循环性能 - 为什么将迭代器递减到 0 比递增更快

css - Joomla - 我可以在# of modules 之后添加代码吗?

javascript - 如何使用canvas在javascript上制作一个游戏,使 Sprite 看起来在跳跃

python - 如何在 Python 中渲染一个等距的基于图 block 的世界?