2.11 Making Meshes Move With cAnimation(动画了吧)
这是Game Core的最后一个了——网格动画。使用cAnimation你可以从x文件中装载一系列的动画并结合cObject来赋以网格生命力。
cAnimation类很小,很像cMesh,cAnimation有一个很小的结构体用来保存动画数据,看看声明:
class cAnimation { protected: long m_NumAnimations; // 动画数量 sAnimationSet *m_AnimationSet; // 动画列表(list) // 从x文件中解析 void ParseXFileData(IDirectXFileData *DataObj, / sAnimationSet *ParentAnim, / sAnimation *CurrentAnim);
public: cAnimation(); // 构造函数 ~cAnimation(); // 析构函数 BOOL IsLoaded(); // 如果动画被装载返回TRUE // 返回列表中动画数量,栈顶动画 // 还有动画长度 long GetNumAnimations(); sAnimationSet *GetAnimationSet(char *Name = NULL); unsigned long GetLength(char *Name = NULL); //装载和释放一个动画 (可以选择性的使用mesh参数) BOOL Load(char *Filename, cMesh *MapMesh = NULL); BOOL Free(); BOOL MapToMesh(cMesh *Mesh); // 映射动画到网格 //设置动画是循环还是不循环 BOOL SetLoop(BOOL ToLoop, char *Name = NULL); }; |
cAnimation,一般使用这四个函数:Load, Free, MapToMesh, SetLoop。
映射一个动画到网格(MapToMesh)是很有必要的,因为它需要找到网格矩阵并改变他。
至于SetLoop, 注意他的Name参数,Name涉及到要循环的动画的名称
动画(Animations)就像框架(farme)和网格(mesh),可以在x文件命名。所以你能够将许多动画打包为一个.x文件,并在引用他们的时候用他们的名字。比如,你的.x文件包含一个叫“Walk”的动画,你可以将字符创“Walk”当作Name参数的值。如果Name设置为NULL,将指定动画列表最顶端的动画。
另一个你需要注意的是cObject类中StartTime参数,它将为动画提供一个开始时间引用值。所以,如果你的动画是基于时间的(比如使用timeGetTime函数),你需要设置StartTime,用来表示动画开始
随后,调用cObject::UpdateAnimation将会使用你提供的时间与StartTime引用的差值,给于你一个clean-cut timing mechanism(硬译:快速刷新吧)(换句话说,就是与其用一个随意的、主管的时间值,不如使用一个精确的基于一个以0秒开始的时间)(这个换句话说也不好理解。。。。)
最后一个例子:
// g_Graphics 是一个已经初始化过的cGraphics 对象 // g_Mesh是一个已经被装载过的cMesh 对象 // g_Object是一个已经被装载过的cObject 对象 cAnimation Anim; //装载动画并循环walk Anim.Load(“Mesh.x”, &g_Mesh); Anim.SetLoop(TRUE, “Walk”); // 将Walk动画应用到cObject g_Object.SetAnimation(&Anim, “Walk”, timeGetTime()); // 开始循环对象,并在每个框架(frame)更新 g_Object.UpdateAnimation(timeGetTime(), TRUE); g_Object.Render(); // 动画用完,记得释放 Anim.Free(); |