欢迎光临散文网 会员登陆 & 注册

c++开发rpg游戏——动画组件

2023-05-17 20:48 作者:阔落咸鱼mod  | 我要投稿

动画组件要实现的基本功能是:可以加载、播放、暂停指定的动画。动画的原理是对图像的连续播放,每一张图像则为一帧。首先放上动画系统的头文件。

动画组件头文件

动画播放在游戏中的实现并不是在一个方法里顺序绘制动画的每一帧,然后绘制结束就退出函数。而是只负责判断目前是否更新帧。如果当前没有到达帧更新的条件,则函数结束。

具体原因是,在整个游戏的运行中,Event()函数负责接受处理事件,Update()函数负责更新游戏数据,Draw()函数则负责绘制当前帧。一次循环只绘制一帧。如果将动画放在一个函数里实现,那么在播放动画的过程中游戏里其他所有行为都得等待动画结束(即这个函数运行结束)才能处理。显然这是不符合要求的。


游戏的无限循环结构

另外一个重要问题是游戏的帧率和动画播放的帧率是相对独立的。拿走路动画来说,走一步的动画只有3帧,游戏帧率是60fps,如果游戏帧率=动画帧率,那么在1秒内人物的走路动画会播放20次,也就是人走20步,那腿的摆动频率就很魔怔。因此每个动画都需要设置自己单独的帧率。在动画结构体内用mAnimFPS来保存该数据。

动画的核心是图片,为了节约资源,应当把每一帧集成到一张图片上加载。因此mAnimTextures就保存图片地址。此外还要知道这张图里集成了多少帧(或者说关键帧),因此用整型变量frame来保存。

有的时候,一张图片可以集成了多个动画,那么只要给出你要加载的动画在图片里的起点位置,系统就默认从此处切出宽度为帧宽度*帧数,高度为帧高的图片作为动画集成图。该坐标用AnimPosInTex保存。

以上就是一个动画结构体的定义。动画组件类将对动画实现控制。

动画组件继承组件类,同样是挂载到物体上运行。动画组件使用mAnims存储多个动画,并随时可以调用。由于播放动画是满足条件才更新帧的设计,所以需要一些私有成员来保存动画播放进度,PlayingAnim保存当前正在播放的动画,任何对动画的操作必须在检查该指针是否为空之后。同时为了控制动画的播放,就需要IsPause成员来记录动画状态是暂停还是播放。

以下函数是动画组件的核心函数,游戏的每一帧都会执行这个方法。本质上就是判断mCurrFrame是否自增。内容很简单,不做过多说明。

动画组件核心函数
动画效果


c++开发rpg游戏——动画组件的评论 (共 条)

分享到微博请遵守国家法律