让 2D 游戏的光线更真实


阅读本文之前, 为了使你对软件逐点计算光线的可操作性信服, 请阅读云风拙作 2D 游戏中的光照. 里面阐述了在 Pentium200 以上机型上, 实现全屏多光源光线处理的一种技术手段. 当然我们有理由相信采用3D硬件来实现这些将更为迅速. 而本文不谈实际的程序操作, 而仅仅对上文提到的方法作一次实际运用, 大家可以看到 2D 游戏中控制光线是一件多么美妙的事情 :-) 祝愿国产的 Diablo II 早日问世 (希望它是出在云风手上, 因为工程已经在运作中)

我们的效果是瞄准 Diablo II 的, Diablo I 中那种按 Tile 制作的明暗变化的技术被抛弃. 当我们采取更小的 Tile, 乃至逐点计算的时候, 一个 Object 一个单一的亮度的方法不会给人 更高的视觉享受了. 这里云风提出自己的方案:

先预制作游戏中需要的光源的光圈. (比如表示视野的渐变椭圆, 火烛的闪烁变化的动态光圈等等) 我们先暗场景中的要求打开这些光源, 即绘制这些光圈到屏幕上, 使用 风魂将非常方便, 因为你不必考虑光线叠加等问题, 而且将获得接近理论速度极限的效率 ;-)

让我们备份一下这张光照图 (也可以用其他方法完成下面的操作, 而不必备份这张图) 取出每个物体的底线每个点的亮度值, 我们可以利用这些值来对每个物体表面的亮度作渐变处理. 就这么简单, 但是是说的容易作起来难. 为了高速处理, 云风提出光照图是实际屏幕 1/2 宽的方案. 这加快了速度也加大了相关函数编写的难度, 加上此类处理相当消耗时间, 必须写出高效的汇编代码. 庆幸的是, 云风已经辛苦一个人, 造福全社会 ^_^ 风魂 0.13 即将推出, 像渐变绘制物体的亮度图等烦琐的汇编工作已经完成, 并请信任云风的编码水准 ;-) 您需要作的是展开想象力作出更完美的游戏.(例如可以加入光线遮挡等等)

下面看看激动人心的附图吧, 这就是我们能完成的效果:

效果图(40,055字节)

注意看墙壁上平滑的亮度变化, 是不是和 Diablo I 里简单的光线变化感觉不同? :-D

最后说些与主题无关的东西, 为风魂做点广告. 从这张图可以注意到风魂 0.13 将支持的其它的一些新特性: 比如, 左下的小人虽然很小,但轮廓并没有黑边和锯齿, 这是风魂新增加了 Alpha 轮廓的支持. 而各墙那影子是半透明的, 它不是简单的调用风魂以前的Alpha 混合的几何函数绘制或是一个透明的精灵, 而是云风专门新建的影子结构和相关高速代码哟 ;-) 当然这张图上还有些细节诸如透明的窗纸等, 就不是新鲜东东了.