我的世界怎么有火?
“火”其实是一个很复杂的概念,在现实世界中我们看见的“火”,实际上是高温物体由于热传递而发生的温度升高现象;但是在游戏中,“火”被抽象成了一种状态显示——也就是只要我设定某个方块处于“着火”状态,那么该方块的显示效果就会变为“着火的图形+烟的效果”。所以问题就变成了如何模拟出这种效果。
因为对于MC来说最直观的表达方式就是贴图了(当然也可以使用文本信息),那么问题就变成如何给一个方块设置贴图,使得其呈现“着火”的状态。 首先排除烧焦的树桩和岩浆池,因为这些物体的底层框架本身就已经被设置为“燃烧”的样式。我们要做的是如何让它们看起来像是在燃烧,而不是让它们真的变成能够燃烧的东西。我们可以采用两种方法来完成这个效果。
第一种是直接把要显示为“燃烬”状态的方块,其纹理直接替换为燃烬的图标即可,这样的优点是很直观,缺点是因为所有同类型的方块都使用一样的贴图,所以很难表现出火焰那种灼烧的感觉(也就是很难表现火焰的温度)。
第二种方法是向上方添加一个烟雾效果的贴图,这样上方的透明区域就会呈现出烟的效果,同时我们需要调整下方纹理的高度,使得其能够跟上方的烟层完美衔接。 如果使用了这种方法,那么就还需要解决一个问题:如何使同一块布料上的火焰高度保持一致呢?(否则的话,由于上下烟层的原因,火焰会高低不一,显得很不自然)。对此MC实现了两个参数来控制火焰的高度:SmokeVolum和FlamingHeight,前者用于控制整块布料上所有火焰的上限高度,而后者则用于调节单个火焰的高度. 如果不需要精确的控制,则可以简单的将FlamingHeight的数值调整到0.2左右(如果是基岩版,则需更调整为0.15),然后通过设置不同块上的SmokeVolum的大小来调节每个火焰的高度。
当遇到岩浆池以及烧焦的树桩这类原本底层框架就带有火焰的物体时,如果直接使用上述的替换法或者添加法都会造成无法修复的bug。这时就需要另外的方法来实现正确的显示效果。
MC实际上借助了另一个隐藏的功能:对于带有多种嵌套的数据结构,MC可以允许使用者一次性设置最外层数据结构的值,然后自动传递到内部。例如,这里可以一次性设置好火焰的smokevolum,然后再把该数据传递至基岩,最终实现每块基岩上面都有符合要求的火焰。