Grid 二维网格水/液体模拟(基于platformer瓷砖)
我有一个基于网格的游戏(platformer),我把所有东西都建立在瓷砖上。我有固体和液体的瓷砖。我正试图找到一种好方法,让水砖以粗糙的方式模拟水 目前我拥有当前的系统: 当一个水砖添加到另一个水砖的上方时,它会向下方的水砖添加1。数字表示压力 以下是目前的情况: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. 这里有一个更大的例子,在添加了几块水砖之后:
[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或类似的东西 每个模拟步骤应分为两个子步骤: 瓷砖中的第一个循环:
我认为这应该可以解决您的问题。如果您有足够的资源来支持它,我建议使用一个递归函数,尝试从上方向左和向右推瓷砖。如果函数在下面找到另一个磁贴,它可以尝试将该磁贴移到任意一侧。最好的方法是开始左右移动,每次移动一块瓷砖。如果它一直在寻找水砖,那么它就会继续前进。最终,它将要么用完瓷砖进行检查(最终在墙上),要么找到一块有自由空间移动的水瓷砖。经过多次迭代后,水应该向外推进,为更高的水下落腾出空间 让我重新分类递归的左-右性质。从本质上说,一旦函数到达了水的基准面,它就应该开始选择水瓷砖,左右交替。因此,它将首先直接向左检查瓷砖,然后直接向右检查瓷砖,然后向左检查两个瓷砖,然后向右检查两个瓷砖,等等。如果它发现一个空气瓷砖,它应该对最近的水瓷砖进行置换。如果它发现了其他东西(通常是一堵墙),它应该在那一边放弃。一旦两边都放弃了,你就应该考虑其他的行为,比如在水面上随机游荡的最上层的水。p> 如果你真的想让行为看起来很自然,我强烈建议使用一个随机变量来决定它是先检查左边还是右边。否则,你可能会以奇怪的规律性循环模式结束
[]
[] should become [][]
[]
[]
[] should become [][][]
[]
[][][] should become [][][][]