【问题标题】:Efficiently handling all game tile updates?有效处理所有游戏图块更新?
【发布时间】:2014-05-09 04:11:46
【问题描述】:

在我的基于图块的自上而下游戏中,有点像泰拉瑞亚,我需要在特定情况下有效地更新图块。我目前正在处理的情况是在图块之间绘制连接。

通过连接我的意思是根据每个图块的位置在每个图块的顶部绘制一个叠加层,因此如果图块位于角落,它将有一个角叠加层连接到其他叠加层。有点像 Minecraft 中的连接纹理,而不是任何瓷砖游戏中的连接纹理。

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

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

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

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

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] 需要更新,会发生什么?

是否有任何其他解决方案来处理更新图块覆盖?

任何帮助将不胜感激

【问题讨论】:

  • func 中的第一行也是递归的..
  • @user2746020 哎呀,我修好了

标签: java algorithm graphics libgdx tile


【解决方案1】:

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

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

【讨论】:

  • PS:我在想泰拉瑞亚。
  • 我猜他有某种模式应该连接到相邻的瓷砖,想想管道,你不想要一个试图连接到不存在的瓷砖的管道。
  • @radgeRayden 我会试试这个并回复你
猜你喜欢
  • 2013-07-25
  • 2016-05-12
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多