区块(格子)游戏技术:如何处理区块间的过渡

Posted on 2008-09-10 11:17  kscner  阅读(324)  评论(0)    收藏  举报

     首先,这里说的“地形”指的是在地图中显示的背景图片或有层次的图形。“地形”可能指的是普通的地形,比如森林草地等等,但在科幻游戏中,地形可能指的是金属地面或者是其他星球的什么东西。

我们的问题

     区块之间过渡问题是怎么产生的呢?当只有一种地形的时候,我们放置的时候要让同种地形之间互相匹配并且看上去非常自然。比如一个森林区块,他应该和其他的森林区块匹配,以便摆放的时候使彼此之间没有缝隙。那么当一个森林区块周围放置的是山川或者是草地的时候该怎么办?假如没有“过渡”的话那么就会看上去非常的僵硬和不自然。

图示1:没有过渡的地形

     对于这个问题的一种解决办法是创建一种专门的区块,这种专门的区块把每种地形的一部分组合到同一个区块中,但是,对于所有区块之间的过渡而由此产生的这种专门区块的数量将会随着区块种类的变多而急剧增加。一开始好象还不太明显,但是,哪怕只有两种地形区块,这种专门的过渡区块的数量也是惊人的。比如一个方形区块(格子),他就有8种可能的过渡方向:每条边和每个拐角。比如简单的“森林-草地”,他就会需要256种这样的专门的过渡区块(格子),假如你有10种不同的地形,那么创建如此数量庞大的区块将是不可能的任务。

     我们可以通过使用一些带有透明属性的"过渡区"块达到精简的目的,使用更少的区块实现更多的变化.这样"森林"区块就能够覆盖任何其他的地形区块了,但是对每一种地形对应的256种"过渡"仍然是非常多的.

     那么,如何对把数量裁减到可以接受的范围呢?这就是接下来需要讨论的.

解决办法

     首先,我们对每一种地形区块引入一个"优先级"的概念.当两种不同地形区块在交汇的时候,总有一种要覆盖另一种,比如森林区块碰到草地区块时,森林区块就应该遮住草地区块,在这里我们假设森林区块的优先级比草地的高,而实事上也应该是这样.

     实际中,我们使用如下从高到低的优先级:丛林,森林,山脉,小丘,沼泽,沙漠,草地,河流.注意,这种优先级并不一定是反映他们在现实或者游戏中的相对高度,山脉的高度(海拔)可能要高于森林,我们这么做只是让他们看上去更加自然罢了.

图示2:带有地形优先级的区块

     接下来我们要开始着手减少过渡区块的数量.通过分离"边过渡"和"角过渡"可以大量的减少过渡区块的数量.正如我们之前提到的,每一个单独的地形区块会有八个不同方向的"过渡":4条边加上4个角.因此会有16种可能的边过渡和16种角过渡,通过组合这些过渡就能够实现之前需要的256种过渡的效果,而此时我们真正需要的过渡区块只有32种,这大量的减少了我们的工作量.

     我们使用一个二进制的数来作为我们的模板,西边的那条边我们定义在第0位上,北1位,东2位,南3位.同样的,对于角我们也做类似的规定.在图示3中展示了我们如何对实际的地形区块进行安排.假如我们认为当某个方向上有边的时候该方向所对应的二进制数的位置上就为1,否则为0.因此,我们可以看见,从左到右对应的二进制数依次为:0000, 0001, 0010, 0011, 0100...

图示3:地形过渡模板

 图示4将展示如何在实际中运用上述模板

图示4:实际的草地过渡

     现在,使用这种方法绘制地图只需要两个步骤了,对于每一个地图单元,需要绘制基本的地形,然后按照优先几由低到高,进行"过渡"区块的覆盖.但是,为了减少需要的过渡区块的数量,仍需要做一些额外的工作.因为大部分的过渡区块是透明背景的,实际的工作会比看上去的简单.

    最直接的步骤就是使用之前建立的优先级,为边和角分配的二进制位置,统计出需要的过渡区块.从本质上讲,对于每一个地图单元,检查所有可能的邻接地形.每一个过渡区块的信息只需要一个8位的二进制数,4位边4位角,刚好是一个字节.因此,对应的9种区块所需要的区块信息总共只有9个字节.一种对应一个字节.

     你可以事先计算好区块信息并存储在地图中,或者实在运行时计算出来.在地图显示时,我只计算当前显示的部分,因为大部分时候地图显示的总是一小部分,则有助于减少存储压力.

     下面来看个例子,对于一个山丘地形的区块,我们只需要考虑比他优先级高的区块比如:丛林,森林,山川.图示5展示了一个以山丘为中心的地图区域.

图示5:地形改造的前后

 

总结

     做一些事先的准备并且使用一些技巧,就能够创作出具有专业效果的地图,当我们绘制地图变得复杂的时候,我们就应该考虑能否减少需要的素材以及增加系统的灵活性来进行弥补.

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3