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

时间:2010-10-22 21:06:04

标签: grid simulation tiles

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

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

目前的情况如下:

[0]   <- This water tile has 0 in pressure.
[1]   <- This water tile has 1 in pressure.

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

示例:

[0]
[1][1]

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

[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.

我是否可以实施一些更智能的系统来做到这一点?

以下是限制:

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

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

我通常的测试案例是:

[]
[] should become [][]

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

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

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

任何建议都非常受欢迎!

2 个答案:

答案 0 :(得分:0)

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

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

瓷砖中的第一个循环:

  1. 如果以下空格是免费的,请将tryMove设置为true,完成此图块。
  2. 如果上面有tile,请将tryMove设置为true,否则将tryMove设置为false。
  3. 如果有任何邻居试图移动,请将tryMove设置为true。
  4. 瓷砖中的第二个循环:

    1. 如果尝试移动并且下面的空间是免费的,请向下移动平铺,设置 tryMove为false,完成tile。
    2. 如果试图移动并且可以侧向移动(自由空间向左或向左移动) 右边)将邻居tryMove设置为false,移动它,将此tryMove设置为false,完成tile。
    3. 我认为这应该可以解决您的问题。

答案 1 :(得分:0)

如果您有资源支持它,我建议使用递归函数,尝试从上方向左和向右推动切片。如果函数在下面找到另一个图块,则可以尝试将该图块移动到任一侧。最好的方法是开始左右踩,一次一个瓦片。如果它不断找到水砖,那么它就会继续下去。最终,它将用尽瓷砖进行检查(最后在墙上),或者找到一块有可用空间的水砖移动。经过多次迭代后,水应向外推,为较高的水量下降腾出空间。

让我重新说明递归的左右性质。基本上,一旦功能达到水的基础水平,它应该开始选择水瓦片,左右交替。因此,它将首先检查直接左边的瓷砖,然后直接检查右边的瓷砖,然后是两个,然后是两个,等等。如果它找到一个空气砖,它应该做最近的水砖的位移。如果它找到别的东西(通常是墙),它应该放弃那边。一旦它在两侧放弃,你应该考虑其他行为,例如在表面上随机移动的最顶层的水。

如果你真的希望这种行为看起来很自然,我强烈推荐一个随机变量,决定它是先检查左边还是右边。否则你可能最终会出现奇怪的定期重复模式。