2.11 Making Meshes Move With cAnimation(动画了吧)

 

2.11 Making Meshes Move With cAnimation(动画了吧)

这是Game Core的最后一个了——网格动画。使用cAnimation你可以从x文件中装载一系列的动画并结合cObject来赋以网格生命力。
cAnimation
类很小,很像cMeshcAnimation有一个很小的结构体用来保存动画数据,看看声明:

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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值