3D战斗游戏之基于数据库的精灵动画篇1
在完成运动模式的准备工作后,接下来我们将聚焦于解决精灵动画的问题。
精灵动画指定方式
在Cocos引擎中,对3D精灵动画的支持可以通过时间或帧数来指定。
通过时间指定
若一个动作的时间范围是从0.1秒到0.3秒,可使用以下语句指定该动画:
auto animate = Animate3D::create(animation, 0.1f, 0.3f);
通过帧数指定
若该动作对应的帧数是第12帧到第20帧,则可使用如下语句指定:
auto animate = Animate3D::createWithFrames(animation, 12, 20);
传统动画序列处理的不足
我们已经了解了基本的精灵动画指定方法。在一般程序中,通常会将动画序列直接写在代码里。这种方式存在明显的弊端,例如每添加一个精灵或一个动作,都需要对程序进行修改。以FantasyWarrior3D的相关代码为例:
-- init Mage animations=============================
do
Mage._action = {
idle = createAnimation(file, 206, 229, 0.7),
walk = createAnimation(file, 99, 119, 0.7),
attack1 = createAnimation(file, 12, 30, 0.7),
attack2 = createAnimation(file, 31, 49, 0.7),
specialattack1 = createAnimation(file, 56, 74, 0.2),
specialattack2 = createAnimation(file, 75, 92, 0.2),
defend = createAnimation(file, 1, 5, 0.7),
knocked = createAnimation(file, 126, 132, 0.7),
dead = createAnimation(file, 139, 199, 0.7)
}
end
基于数据库的精灵动画解决方案
为了解决上述问题,我从自己的程序中抽取了一个思路与大家分享。由于我的程序规模较大,完整抽取实现流程不太现实,所以这里仅分享思路。
在第一章中,我们提到boss是通过数据库定义的,并且有一个配套的boss_action
数据库,用于存储某个boss的序列动作。下面详细说明具体操作。
我们继续使用FantasyWarrior3D的mage.c3b
模型,并沿用上述Lua代码中的帧序列,这样可以节省不少工作量。
1. 在boss库添加记录
首先,在boss库中添加一条新记录,指定一个新boss使用mage.c3b
模型,并设置渲染文件的缩放比例等参数。
2. 在boss_action库添加动作记录
接下来,这是本节的重点。在boss_action
库中,将mage的动作信息录入。本次我们采用按帧定义动画的方式,暂时不填写时间参数,仅填写各个动作的名称、开始帧数和结束帧数。
至此,我们已经完成了基于数据库的精灵动画定义。那么,如何在程序中依据数据库记录实现各个动作的播放呢?这个问题将在下一节继续探讨。
mage在程序中的实现
这里展示一下mage在我的程序中的实现效果。之前的小白人模型不太美观,换上mage模型后,视觉效果有了一定提升。
帧数信息调整
后来经过仔细观察,发现mage模型的动作衔接不顺畅,存在明显的跳帧现象。这可能是因为直接抄袭Lua代码中的帧数信息存在问题。重新整理后的帧数信息如下(此处应补充重新整理后的帧数信息)。这些帧数据的特点是,每个动作完成后都会回到idle状态的姿势,这样在配合状态机进行切换时,就可以避免跳帧现象的产生。