我有一个基于网格的游戏(平台游戏),我把所有东西都放在了瓷砖上。我有坚固和液体的瓷砖。我正试图找到一种很好的方法来使水砖以粗糙的方式模拟水。
目前我有现行系统: 当水砖在另一个水砖上方添加时,它会在下面的水砖上加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 [][][][]
假设游戏运行了一段时间。
任何建议都非常受欢迎!
答案 0 :(得分:0)
也许你可以忘记压力(因为你并没有真正使用它们作为压力)而只是使用bool tryMove或类似的东西。
每个模拟步骤应分为两个子步骤:
瓷砖中的第一个循环:
瓷砖中的第二个循环:
我认为这应该可以解决您的问题。
答案 1 :(得分:0)
如果您有资源支持它,我建议使用递归函数,尝试从上方向左和向右推动切片。如果函数在下面找到另一个图块,则可以尝试将该图块移动到任一侧。最好的方法是开始左右踩,一次一个瓦片。如果它不断找到水砖,那么它就会继续下去。最终,它将用尽瓷砖进行检查(最后在墙上),或者找到一块有可用空间的水砖移动。经过多次迭代后,水应向外推,为较高的水量下降腾出空间。
让我重新说明递归的左右性质。基本上,一旦功能达到水的基础水平,它应该开始选择水瓦片,左右交替。因此,它将首先检查直接左边的瓷砖,然后直接检查右边的瓷砖,然后是两个,然后是两个,等等。如果它找到一个空气砖,它应该做最近的水砖的位移。如果它找到别的东西(通常是墙),它应该放弃那边。一旦它在两侧放弃,你应该考虑其他行为,例如在表面上随机移动的最顶层的水。
如果你真的希望这种行为看起来很自然,我强烈推荐一个随机变量,决定它是先检查左边还是右边。否则你可能最终会出现奇怪的定期重复模式。