在基于图块的游戏中更新照明

时间:2013-09-01 21:40:33

标签: java tile lighting

我一直致力于为我正在开发的基于块的游戏制作照明系统(想想Terraria),而且我对它的某一点感到有点难过。更新块时,其亮度级别也会根据其相邻(相邻)块的亮度进行更新。

现在考虑一下这种情况:一名玩家在地下挖洞,将一块远在地下的地块暴露在阳光下。这使得它的亮度为16中的16,其邻居的亮度为15.然而,如果玩家再次填充该洞,则该区块将保持16级的亮度。我的第一个想法是“审核“通过检查块的亮度与其邻居之间的差异不超过一个单位来更新块时的亮度级别,但事实证明这是无效的。

我能想到的唯一解决方案是专门检查放置的块是否暴露在阳光下,如果是这样,请将其下方的块的亮度更新为16中的15个。但是,这样做不会有效在某些情况下解决问题,并且相邻块由于其相邻块而不能降低亮度。也许我只需要退一步再看看问题,但我想我可能会在此期间发布。有没有人有关于如何解决这个问题的建议?

2 个答案:

答案 0 :(得分:1)

根据我的经验,最不容易出错和(奇怪)最快的方法就是清除可能受影响的最大范围内的所有光线(在你的情况下为+ -16)并重新计算它们。

添加光时的迭代方法可以得到很好的效果,但我发现它要慢得多;可能是由于在运行算法时维护需要更新和添加/删除的块列表的开销。在消除光线时,迭代方法也容易出错,因为当你发现光线可以“漏回”时;以前在14光线下的一个区块失去与太阳的连接,因此重新计算;在附近找到一块光13并将自己的光设置为12(而不是将它们全部设置为零)。

我使用的解决方案是清除所有光线水平然后向下扫描;从每个块上方的9个块(3D,3个块,2D)中收集光。对于不直接在上方的8个(或2D中的2个)块,光被衰减,并且将光级设置为来自这9个块的最大值。这允许光以最大45度的角度向下传播;这可能会产生相当刺眼的阴影,可能是也可能不是你想要的。重复向上扫描可以减轻刺眼的阴影,因为无论阳光如何,都可以施加所有模块的最小光照度。

答案 1 :(得分:0)

我认为用流程图解释是最容易的:

enter image description here