有效处理所有游戏磁贴更新?

时间:2014-05-09 04:11:47

标签: java algorithm graphics libgdx tile

在我的基于磁贴的自上而下的游戏中,有点像Terraria,我需要在某种情况下有效地更新磁贴。我目前正在处理的情况是在瓷砖之间绘制连接。

通过连接我的意思是根据每个图块的位置在每个图块的顶部绘制一个叠加层,因此如果图块位于一个角上,它将有一个角落叠加层连接到其他叠加层。有点像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]需要更新,会发生什么?

是否有其他解决方案可以处理更新磁贴覆盖图?

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

你需要的是把事情放在眼里。优先考虑某些更新,您可以避免无限循环。我尝试自上而下更新,然后检查一切是否正常;然后,只是调整一些点。

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