花几分钟写的一个游戏动画循环

 
///关键帧结构
typedef struct KsyFrame
{
 DWORD time;  //关键帧时间
 D3DXMATRIX  matTransformation; //关键帧的模型变换矩阵(动画)

}sKeyframe;

sKeyframe g_KeyFrmaes[4]=
{
 //keyframe0 ,0ms
 {
  0,
  D3DXMATRIX
  (
   1.000000f, 0.000000f, 0.000000f, 0.000000f,
   0.000000f, 1.000000f, 0.000000f, 0.000000f,
   0.000000f, 0.000000f, 1.000000f, 0.000000f,
   0.000000f, 0.000000f, 0.000000f, 1.000000f
  )
 
 },

 //keyframe1,40ms
 {
  400,
  D3DXMATRIX
  (
   0.000796f, 1.000000f, 0.000000f, 0.000000f,
   -1.000000f, 0.000796f, 0.000000f,0.000000f,
   0.000000f, 0.000000f, 1.000000f, 0.000000f,
   50.000000f, 0.000000f, 0.000000f, 1.000000f
   )

 },

  //keyframe2,80ms
  {
   800,
   D3DXMATRIX
   (
    -0.999999f,  0.001593f, 0.000000f, 0.000000f,
    -0.001593f, -0.999999f, 0.000000f, 0.000000f,
    0.000000f,  0.000000f, 1.000000f, 0.000000f,
    25.000000f, 25.000000f, 0.000000f, 1.000000f
   ) 
  },

  //keyframe3,120ms
  {
   1200,
   D3DXMATRIX
   (
    1.000000f, 0.000000f, 0.000000f, 0.000000f,
    0.000000f, 1.000000f, 0.000000f, 0.000000f,
    0.000000f, 0.000000f, 1.000000f, 0.000000f,
    0.000000f, 0.000000f, 0.000000f, 1.000000f
   )
  }
};  //定义了4帧的关键动画。其中第3帧和第0帧的变换矩阵一样,为了使动画能进入循环状态


///动画循环函数
void DoFrame()
{
 //获取程序启初始启动时间
 static DWORD start_time=timeGetTime();

 //程序运行时间
 DWORD run_time=timeGetTime()-start_time;

 //得到一个从0到1200ms之间变化的毫秒数,以定位程序当前所处的关键帧
 run_time %=(g_KeyFrmaes[3].time+1);

 //当前帧 ,从第0帧开始
 DWORD keyframe=0;

 //获取当前的关键帧
 for(int i=0;i<4;++i)
 {
  if(run_time>=g_KeyFrmaes[i].time)
   //更新当前帧
   keyframe=i;
 }

 //获取下一帧
 DWORD nextKeyframe=(keyframe==3)?keyframe:(keyframe+1);

 ///插值运算,获取当前时间的模型变换矩阵

 //计算两个关键帧之间的时间差 
 DWORD timediff=g_KeyFrmaes[nextKeyframe].time-g_KeyFrmaes[keyframe].time;
 if (!timediff)
 {
  timediff=1;
 }

 //插值时间
 float scalar=(float)(run_time-g_KeyFrmaes[keyframe].time/timediff);

 D3DXMATRIX matInt = D3DXMATRIX(g_KeyFrmaes[nextKeyframe].matTransformation) -
  D3DXMATRIX(g_KeyFrmaes[keyframe].matTransformation);

 //插值变换矩阵

 matInt*=scalar;

 //计算当前时间相对于当前帧keyframe的模型变换矩阵
 matInt+=g_KeyFrmaes[keyframe].matTransformation;

 //模型变换
 g_pd3dDevice->SetTransform(D3DTS_WORLD,&matInt);

 

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值