Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有效地处理所有游戏磁贴更新?_Java_Algorithm_Graphics_Libgdx_Tile - Fatal编程技术网

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

Java 有效地处理所有游戏磁贴更新?,java,algorithm,graphics,libgdx,tile,Java,Algorithm,Graphics,Libgdx,Tile,在我的基于平铺的自上而下的游戏中,有点像Terraria,我需要在特定情况下有效地更新平铺。我目前正在处理的环境是绘制瓷砖之间的连接 通过连接,我的意思是根据每个瓷砖的位置在其顶部绘制一个覆盖层,因此如果瓷砖位于一个角上,它将具有一个角覆盖层,该角覆盖层连接到其他覆盖层。有点像Minecraft中的连接纹理,而不是任何瓷砖游戏中最有可能的连接纹理 我现在面临的问题是如何处理更新覆盖。例如,如果销毁一个磁贴,则必须更新所有相邻磁贴的覆盖,因为不再有要连接的磁贴。这一部分很简单,因为我可以这样做:

在我的基于平铺的自上而下的游戏中,有点像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]需要更新,会发生什么情况

是否有其他解决方案来处理更新瓷砖覆盖


任何帮助都将不胜感激

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


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

PS:我在想Terraria。我猜他有某种模式应该连接到相邻的瓷砖,思考管道,您不希望管道尝试连接到任何现有的磁贴。@radgeRayden我将尝试此方法并返回给您func中的第一行也是递归的。@user2746020 oops是的,我已修复此问题