java - 高效地处理所有游戏图 block 更新?

标签 java algorithm graphics libgdx tile

在我的基于图 block 的自顶向下游戏中,有点像 Terraria,我需要在特定情况下有效地更新图 block 。我目前正在处理的情况是在图 block 之间绘制连接。

我所说的连接是指根据每个图 block 的位置在每个图 block 的顶部绘制一个叠加层,因此如果图 block 在一个角上,它就会有一个角层叠加层连接到其他叠加层。有点像 Minecraft 中的连接纹理,而不是最有可能在任何拼贴游戏中连接的纹理。

我现在遇到的问题是如何处理覆盖更新。例如,如果我破坏了一个瓦片,则必须更新所有相邻瓦片的叠加层,因为不再有瓦片可以连接。这部分很简单,因为我可以做这样的事情:

updateOverlay(x+1, y);
updateOverlay(x-1, y);
updateOverlay(x, y+1);
updateOverlay(x, y-1);

这就是问题所在。如果当我调用 updateOverlay(x+1, y) 时会发生什么情况,这种变化的叠加使得与该图 block 相邻的图 block 需要叠加更新,如果一个那些相邻的瓷砖会导致同样的事情吗?然后是一串巨大的更新。

我尝试了类似下面的递归实现:

public boolean updateOverlay(int x, int y){
   changeOverlayAccordingly();

   if(overlayHasChanged) return true;

      updateOverlay(x+1, y);
      updateOverlay(x-1, y);
      updateOverlay(x, y+1);
      updateOverlay(x, y-1);

   return false;
}

if(overlayHasChanged) 语句本应阻止无限递归循环的发生,但它实际上没有做任何事情,因为我仍然遇到堆栈溢出错误。此外,问题的递归解决方案可能不是最好的,因为它不会那么稳定。

再一次,我知道我可以只更新所有相邻的叠加层并完成它,但是如果这些更新导致需要更多更新怎么办?

   [2]   [6]
[1][x][3][5][8]
   [4]   [7]

为了进一步说明我的观点,请看上图。

如果 [x] 是正在更新的原始叠加层,则 [1] [2] [3] 和 [4] 也将被更新。但是,如果 [3] 更改为 [5] 也需要和更新,会发生什么情况?如果 [5] 随后发生变化,使得 [6] [7] 和 [8] 需要更新,会发生什么情况?

是否有任何其他解决方案来处理更新图 block 叠加层?

任何帮助将不胜感激

最佳答案

您需要的是正确看待事物。优先考虑某些更新,您将避免无限循环。我会尝试自上而下更新它,然后检查是否一切正常;然后,只是调整一些点。

但是,那么,为什么你甚至需要更新链上的东西?如果它是一次一个方 block 的操作,则不可能在大于一个方 block 的半径上发生变化。 (请解释,我会相应地进行编辑)。如果它涉及破坏相邻的图 block ,请尝试从中心到边界,忽略指向中心的 block 。

关于java - 高效地处理所有游戏图 block 更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23556472/

相关文章:

java - 如何将 Action 列表器添加到 jmenuitem

java - for循环在JSP中的83之后停止输出

python - 使用 Python 查找音节

java - 如何在Java8中过滤列表?

java - 以编程方式为 FrameLayout 的子项设置 layout_gravity?

string - 将一个字符串转换为另一个字符串的成本最低

algorithm - 降低 DP 算法时间复杂度的一般技巧

java - 如何防止 JPanel 被更新?

graphics - Wavefront OBJ 格式 -> 组和 usemtl 命令

iOS 加载 16bit 单 channel 图像