D3D中的2D(CAnimationSprite.ppt_第1页
D3D中的2D(CAnimationSprite.ppt_第2页
D3D中的2D(CAnimationSprite.ppt_第3页
D3D中的2D(CAnimationSprite.ppt_第4页
D3D中的2D(CAnimationSprite.ppt_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DirectX技术,2D游戏框架之CAnimationSprite,概述,CAnimationSprite类用于描述动画精灵。动画精灵也是一种精灵,只是表示精灵的纹理不是固定的一帧,而是由若干帧组成。动画精灵在表现角色动作方面特别有用,比如角色的行走、战斗等动作都不是用固定的一帧图像能表现出来的,有了动画精灵,就可以把多幅图像按照指定的速度播放出来,这样能较好地表达角色的动作行为。下图就是一幅角色的四方向行走图:,在上图中,从上到下总共4行,代表了角色向下、向左、向右、向上行走。每个方向的行走动画都是由4幅大小相同的图片组成。在程序中,只要按一定的速度,循环播放一个方向的4幅图片,就可以形成角色行走的动画。 前面介绍的CSprite类已经具有了将纹理图片中指定的部分显示在屏幕上指定位置的能力。那么,我们只需要扩展CSprite类,为其添加播放控制部分的功能即可。播放控制主要体现在速度控制和纹理坐标截取两方面。 下面我们以表格的形式来描述动画精灵的主要属性和行为:,具体定义见CAnimationSprite.h,部分实现细节,Update函数 CSprite类有一个虚函数Update,这个函数是每帧都会被调用的,用以控制精灵每帧的行为。对于CSprite类来说,它的行为模式是简单的,每帧只需要负责把一张固定的图像渲染到屏幕上即可,所以该函数在CSprite里是空操作。而动画精灵则不同,它需要在每帧里计算自己需要显示哪一帧图片。这个计算包含两方面的意思:一是计算时间,以决定是否该更新到下一帧;二是如果需要更新,下一帧的纹理坐标如何计算。所以CAnimationSprite类需要重写Update函数,在其中主要完成时间计算相关工作,并调用另一个函数SetFrame来计算下一帧的纹理坐标。,在CAnimationSprite类定义的成员变量fInterval使用来记录设定的动画精灵帧频所对应的时间间隔。其计算方法是:fInterval = 1.0 / nFps; 其中nFps是在构造时传递进来的实参,表示希望动画精灵播放的帧频。有了这个时间间隔,在Update函数里要控制播放速度就比较简单了。其方法是:用fSinceLastFrame成员变量记录自从上次更新后到本帧累积流逝的时间,如果这个时间大于fInterval,则更新,并把fSinceLastFrame重置为0;否则,则不需要更新,如下:,void CAnimationSprite:Update(float fDeltaTime) /fDeltaTime是从上帧到本帧系统所流逝的时间 if(!bPlaying) /如果当前设置为不播放,则不作任何操作 return; fSinceLastFrame += fDeltaTime; /加上系统流逝的时间 if(fSinceLastFrame = fInterval) /如果大于设定的时间间隔 fSinceLastFrame = 0; SetFrame(nCurFrame+nDelta); /调用SetFrame函数/设置下一帧的纹理坐标, /其中nDelta可以是1,也可以是-1,分别表示顺序播放和逆序播放 ,SetFrame函数,SetFrame函数计算指定的帧应该怎样在纹理图片上截图。在计算截图时,应该按照从左到右,从上到下的顺序截取图片,如下图:,在上图中,用红绿蓝黄和数字1、2、3、4标出了截取纹理的顺序,1、2、3、4这4幅图片的截取顺序是没有疑问的,但是如果现在要截取第5幅图,应该怎样计算坐标呢?截取第5幅图的坐标怎么计算,要看总帧数的设定。如果总帧数等于4,那么截取到第一行最后一帧图时,就已经取完了帧序列的所有图片,如果再取第5帧,那么就应该回到帧序列的第一帧重新开始下一轮循环,如果总帧数大于4,比如等于16,那么到第5帧时,这一个播放序列没有完成,还必须继续从图片的下一行取图,也就是第二行的第一幅图,如下图所示:,void CAnimationSprite:SetFrame(int n) /参数n代表设置第几帧 int tx1, ty1, tx2, ty2; bool bX, bY, bHS; int ncols = nTexWidth / width; /计算纹理图片分为几列 n = n % nFrames; /将n对总帧数取模 /如果n0,将n+nFrames, /时期取值范围落在0,nFrames之间 if(n 0) n = nFrames + n; nCurFrame = n; /将当前帧设置为n / 下面通过帧n计算纹理坐标 ty1 = ty; tx1 = txStart + n*width;,if(tx1 nTexWidth - width) /如果跨行 n -= (nTexWidth -tx) / width; /n在下一行应该取

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论