HGE系列之九管中窥豹(精灵动画)
这次嘚HGE之旅让我们来看看精灵及动画的实现,毕竟对于一款2D游戏引擎来说恐怕精灵和动画不是最重要的,也可算是最重要之一了吧:)
HGE内蔀对于精灵以及动画的实现其实相对简单主要都是有hgeSprite(精灵)和hgeAnimation(动画)这两个类来完成所需的操作,内部使用的接口也都是hge基类所提供的(具体细节请参看源码实现)基本的原理也并无什么特殊的地方:精灵也便是一张贴图,动画也是传统的逐帧动画
好了让我们闲話少叙,先来看一看hgeSprite的内部构造:
先来看看hgeSprite提供的各项功能(对外接口):
以上便是hgeSprite的全部内容看来并不复杂 :) 那么接下来就让我们來看看这hgeSprite的内部实现吧:
首先让我们来看看hgeSprite的构造函数:
接着让我们看一看hgeSprite的渲染函数,篇幅关系在此仅以Render函数为例讲述,其余三个渲染函数原理类似有兴趣的朋友请参看实现源码:
可以看到,渲染的核心便是Gfx_RenderQuad这个API函数了 :)
接着让我们来看看hgeSprite是如何获取包围盒的:
获取包围盒的基本思想便是根据目前quad的大小(考虑缩放以及旋转)来获取一个完整包围其尺寸的最小矩形有点简化的AABB的味道 :)
接着让我們再来看看hgeSprite是如何设置翻转的:
// 如果设置了“热点”翻转以及X轴翻转,则重新计算“热点”X轴坐标
// 如果设置了“热点”翻转以及Y轴翻转則重新计算“热点”Y轴坐标
设置翻转的原理其实非常简单,交换纹理坐标而已 :)
最后让我们来看看hgeSprite是如何来重新设置纹理的:
至此我们基本便将hgeSprite简单剖分了一遭但是单单的精灵有时还是缺乏不少动感,有时我们还需要动画的帮助于是hgeAnimation便诞生了:
依例,让我们首先来看看hgeAnimation的头文件:
hgeAnimation的构造函数不无多少新奇的地方所做的工作基本亦是初始化相关变量。
接着来看看hgeAnimation如何设置播放模式:
哈哈是不是相当簡单,那么让我们再来看看hgeAniamtion是如何设置当前帧的:
从源码实现可以看出hgeAnimation内部使用的是一个“矩阵型”的动画纹理,随着播放帧数的改变内建的这个SetFrame函数会正确的设置相应的纹理坐标。
好了hge的精灵以及动画至此算是讲了一个梗概,更细节的问题大家可以参照源码以及文檔那么最后,下次再见吧 :)