Grid 二维网格水/液体模拟(基于platformer瓷砖)

Grid 二维网格水/液体模拟(基于platformer瓷砖),grid,simulation,tiles,Grid,Simulation,Tiles,我有一个基于网格的游戏(platformer),我把所有东西都建立在瓷砖上。我有固体和液体的瓷砖。我正试图找到一种好方法,让水砖以粗糙的方式模拟水 目前我拥有当前的系统: 当一个水砖添加到另一个水砖的上方时,它会向下方的水砖添加1。数字表示压力 以下是目前的情况: [0] <- This water tile has 0 in pressure. [1] <- This water tile has 1 in pressure. 这里有一个更大的例子,在添加了几块水砖之后:

我有一个基于网格的游戏(platformer),我把所有东西都建立在瓷砖上。我有固体和液体的瓷砖。我正试图找到一种好方法,让水砖以粗糙的方式模拟水

目前我拥有当前的系统: 当一个水砖添加到另一个水砖的上方时,它会向下方的水砖添加1。数字表示压力

以下是目前的情况:

[0]   <- This water tile has 0 in pressure.
[1]   <- This water tile has 1 in pressure.
这里有一个更大的例子,在添加了几块水砖之后:

[0][0]
[1][1][1][1]
[2][2][2][2][2]
然后,我让每一块压力等于或大于1的水砖尝试向左/向右移动,如果有自由空间,然后将压力设置为0,检查它是否可以从相邻的水砖继承自身周围的压力(如果有)

这个系统工作得很好,除了从顶部移除水砖的情况

如果我从上一个示例中移除顶部水砖:

[1][1][1][1]
[2][2][2][2][2] 
然后我们有了压力为1的最上面一行,现在应该是0,最下面一行应该是1

是否有更智能的系统可以让我更恰当地实现这一点

以下是限制条件:

每个磁贴只能检查其相邻磁贴。 平铺可以定义任何函数。 磁贴可以有任何变量来存储数据

你们能想出一个比我更好的系统吗

我通常做的测试用例是:

[]
[] should become [][]

[]
[]
[] should become [][][]

  []
[][][] should become [][][][]
假设游戏运行一段时间


欢迎提出任何建议

也许你可以忘记压力(因为你并不是真的把它们当作压力来使用),简单地用一个bool tryMove或类似的东西

每个模拟步骤应分为两个子步骤:

瓷砖中的第一个循环:

  • 如果下面的空间可用,请将tryMove设置为true,完成此平铺
  • 如果上面有平铺,请将tryMove设置为true,否则将tryMove设置为false
  • 如果任何邻居试图移动,请将tryMove设置为true
  • 瓦片中的第二个循环:

  • 如果尝试移动并且下面的空间可用,请向下移动平铺,设置 尝试移动到假,完成瓷砖
  • 如果尝试移动并且可以侧向移动(向左或向右释放空间) 右)将邻居tryMove设置为false,移动它,将此tryMove设置为false,完成平铺

  • 我认为这应该可以解决您的问题。

    如果您有足够的资源来支持它,我建议使用一个递归函数,尝试从上方向左和向右推瓷砖。如果函数在下面找到另一个磁贴,它可以尝试将该磁贴移到任意一侧。最好的方法是开始左右移动,每次移动一块瓷砖。如果它一直在寻找水砖,那么它就会继续前进。最终,它将要么用完瓷砖进行检查(最终在墙上),要么找到一块有自由空间移动的水瓷砖。经过多次迭代后,水应该向外推进,为更高的水下落腾出空间

    让我重新分类递归的左-右性质。从本质上说,一旦函数到达了水的基准面,它就应该开始选择水瓷砖,左右交替。因此,它将首先直接向左检查瓷砖,然后直接向右检查瓷砖,然后向左检查两个瓷砖,然后向右检查两个瓷砖,等等。如果它发现一个空气瓷砖,它应该对最近的水瓷砖进行置换。如果它发现了其他东西(通常是一堵墙),它应该在那一边放弃。一旦两边都放弃了,你就应该考虑其他的行为,比如在水面上随机游荡的最上层的水。p> 如果你真的想让行为看起来很自然,我强烈建议使用一个随机变量来决定它是先检查左边还是右边。否则,你可能会以奇怪的规律性循环模式结束

    []
    [] should become [][]
    
    []
    []
    [] should become [][][]
    
      []
    [][][] should become [][][][]