2D网格水/液模拟(基于平台砖)

raR*_*aRa 6 simulation grid tiles

我有一个基于网格的游戏(平台游戏),我把所有东西都放在了瓷砖上.我有坚固和液体的瓷砖.我正试图找到一种很好的方法来使水砖以粗糙的方式模拟水.

目前我有现行系统:当水砖在另一个水砖上方添加时,它会在下面的水砖上加1.数字表示压力.

这就是目前的样子:

[0]   <- This water tile has 0 in pressure.
[1]   <- This water tile has 1 in pressure.
Run Code Online (Sandbox Code Playgroud)

如果我在底部附近添加另一个水砖,它会从左侧,右侧和上方搜索是否有水砖,并继承其周围的最大压力.

例:

[0]
[1][1]
Run Code Online (Sandbox Code Playgroud)

添加少量水砖后,这是一个更大的例子:

[0][0]
[1][1][1][1]
[2][2][2][2][2]
Run Code Online (Sandbox Code Playgroud)

然后我制作压力等于或大于1的每个水瓦片如果有自由空间则尝试向左/向右移动,然后将压力设置为0并检查是否可以从邻近的水瓦片中继承压力(如果有的话).

除了从顶部移除水瓦片的情况之外,该系统工作得非常好.

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

[1][1][1][1]
[2][2][2][2][2] 
Run Code Online (Sandbox Code Playgroud)

然后我们有压力为1的顶行,现在应该有0,底行应该有1.

是否有一些更智能的系统我可以更好地实现这一点?

以下是限制:

每个图块只能检查其邻居图块.平铺可以定义任何功能.Tile可以有任何变量来存储数据.

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

我通常的测试案例是:

[]
[] should become [][]

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

  []
[][][] should become [][][][]
Run Code Online (Sandbox Code Playgroud)

假设游戏运行了一段时间.

任何建议都会受到欢迎!

小智 0

也许你可以忘记压力(因为你并没有真正将它们用作压力)并简单地使用 bool tryMove 或类似的东西。

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

瓷砖中的第一个循环:

  1. 如果下面的空间是空闲的,则将 tryMove 设置为 true,完成此图块。
  2. 如果上面有图块,则将 tryMove 设置为 true,否则将 tryMove 设置为 false。
  3. 如果任何邻居尝试移动,请将 tryMove 设置为 true。

瓷砖中的第二个循环:

  1. 如果尝试移动且下方空间空闲,则向下移动图块,将 tryMove 设置为 false,完成图块。
  2. 如果尝试移动并且可以侧向移动(向左或向右的自由空间),则将邻居 tryMove 设置为 false,移动它,将此 tryMove 设置为 false,完成平铺。

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