[上篇:物体的绘制及遮挡运算][下篇:让场景更生动]
特别感谢八爪鱼工作室 为本文提供精灵图案,及为我设计中的引擎提供测试用精灵动画
在游戏设计方面的英文资料中,经常看到 Sprite 一词,表示游戏中的运动的物体. 我暂时使用这个词的直译"精灵"来表述问题;-)
这里,我使用了更广泛的定义,凡是在这个引擎里,运用多帧位图来表现的同一单位对象, 都将其称之为精灵.所以玩家操纵的是精灵,NPC 是精灵,而地面上燃烧的火堆及墙上等火把, 远距离攻击的武器,比如箭(如果游戏中有此设计的话)都是精灵.在这个精灵的范畴, 我们可以再将其细分:
关于静止的精灵,比较好处理,只需要在每次刷新屏幕时,按照正确的位图重画它即可.至于遮挡问题, 和运动精灵一起处理.
需要仔细分析的运动的精灵,暂时我只写精灵的遮挡处理和简单的运动.更复杂的超出了图象引擎的范畴, 属于战斗引擎.当然我喜欢 Diablo 的战斗形式,那样,战斗引擎和图象引擎是没有明显得划分的.
精灵绘制时的遮挡处理和上篇讲述的物体绘制基本相同,问题也是集中在判断对象前后的问题. 不同的是,精灵的处理后于物体的绘制,所以绘制方案有略微不同. 同层次之间的处理可套用上篇的做法,先对屏幕上所有精灵位置排序,然后从后向前对每个精灵进行处理. 对具体的精灵,我们可以先将其画在应该在的位置,检索出剪裁矩形的屏幕坐标在其下方,且与之有相交部分 的物体.设定精灵的剪裁矩形为绘图时的剪裁框(所有落在剪裁框外的点不绘制). 依次绘制上一步找出的可能遮挡精灵的物体,由于设置了剪裁框,所以重新绘制的物体不会破坏屏幕的其它部分, 具体步骤可以见图中详解.
![]() |
→ | ![]() |
→ | ![]() |
→ | ![]() |
精灵的运动是比较复杂的,因为在坐标移动时还伴有位图的变换,这里先做初步讨论.更多的工作, 比如动作的切换,行走路径的搜索...留在战斗引擎部分实现.
精灵可能作出不同的动作,要得到生动的效果,连行走,跑动,站立,及其这几种状态之间的过渡, 都需要不同的动画表现.更不提复杂的战斗动作.我的做法是,处理每一类动作,设计一函数, 和相关的数据结构.精灵在同一时间只有一种动作状态,将对应的函数指针及结构指针在游戏主循环中 赋予精灵,然后循环处理屏幕上等所有精灵. 而象跑动到停止这样的过渡动作的处理函数里能自己修改 精灵的运动状态值,从而达到自动处理.
以最基本的行走动作为例,为了使精灵能全方向运动,至少要设计 8 组动画, 使用时,
由运动方向最接近哪个设计好的角度来决定使用某组画面.(这里再次感谢
八爪鱼工作室
为我调试这个引擎而设计的精美的精灵行走动画)
btw,按我的观点,行走动画至少要有 5 帧画才能有说得过去的效果,
可惜许多 RPG 都是用 3 帧画来表现这个 :-( 而八爪鱼工作室寄给我的几组动画,设计都非常精良,
无论从人物制作,还是从动作设计上来讲 ;-) (我很喜欢,这里放一组给大家欣赏)
据说这是他们将于明年春节左右推出的 RPG《杀气》中敌人之一的造型,
相信那将是个美工一流的游戏,明年的国产游戏定会给玩家一些新的感受.