现在的位置: 首页 > 综合 > 正文

超级玛丽制作揭秘24角色动画

2013年10月13日 ⁄ 综合 ⁄ 共 2476字 ⁄ 字号 评论关闭

 玩家在进出水管的时候,需要进入水管、从水管中升起两个动画。当动画播放结束后,切换到新的地图。
动画播放过程中,禁止键盘响应,即玩家不能控制移动。

1. 玩家进水管。
地图物品中,水管分两个,进水管(玩家进入地图)和出水管(从别的地图返回)。两种水管对应不同的图片ID:
#define ID_MAP_PUMP_IN 9
#define ID_MAP_PUMP_OUT 10
玩家进入水管的检测:
函数:int GAMEMAP::KeyProc(int iKey)
代码:检测玩家按“下”,如果玩家站在进水管上,开始播放动画
  case VK_DOWN:
   for(i=0;i<iMapObjNum;i++)
   {
    if( LINE_IN_LINE(玩家坐标的下边界,地图物品的上边界))
    {    
     //判断是否站在进水管上
     if(MapArray[i].id == ID_MAP_PUMP_IN)
     {
      //如果站在设置角色动画方式,向下移动
      rmain.SetAni(ROLE_ANI_DOWN);
      iGameState=GAME_PUMP_IN;//设置游戏状态:进水管
      c1.ReStart(TIME_GAME_PUMP_WAIT);//计时2秒
     }
    }
   }
   break;
动画设置函数:void MYROLE::SetAni(int istyle)
代码:
 iAniStyle=istyle; //设置动画方式
 iparam1=0; //参数初始化为0
 iAniBegin=1; //表示动画开始播放
说明: iparam1是动画播放中的一个参数, 根据动画方式不同,可以有不同的含义.

2. 动画播放
玩家角色显示函数:void MYROLE::Draw()
代码:
//判断是否播放动画,即iAniBegin为1
 if(iAniBegin)
 {
  PlayAni(); //播放当前动画
 }
动画播放函数:void MYROLE::PlayAni()
代码:根据不同的动画方式,播放动画
 switch(iAniStyle)
 {
 case ROLE_ANI_DOWN:
  //玩家进入水管的动画,iparam1表示下降的距离
  if(iparam1>31)
  {
   //下降距离超过31(即图片高度),玩家完全进入水管,无需图片显示
   break;   
  }
  //玩家没有完全进入水管,截取图片上半部分,显示到当前的坐标处
  SelectObject(hdcsrc,hBm);
  BitBlt(hdcdest,
   xpos,ypos+iparam1,
   width,height/2-iparam1,
   hdcsrc,
   iFrame*width,height/2,SRCAND);  
  BitBlt(hdcdest,
   xpos,ypos+iparam1,
   width,height/2-iparam1,
   hdcsrc,
   iFrame*width,0,SRCPAINT); 
  //增加下降高度
  iparam1++;  
  break;
 
3. 玩家进入水管后,切换地图
函数:WndProc
代码:在时间片的处理中,当GAME_PUMP_IN状态结束,切换地图,并设置玩家动画:从水管中上升。
   case GAME_PUMP_IN:
    if(c1.DecCount())
    {
     gamemap.ChangeMap();//切换地图
     gamemap.SetGameState(GAME_IN); //设置游戏状态
     c1.ReStart(TIME_GAME_IN);  //计时300秒
     rmain.SetAni(ROLE_ANI_UP);  //设置动画,图片上升
    }
    InvalidateRect(hWnd,NULL,false);
    break;
4. 从水管中上升
动画播放函数:void MYROLE::PlayAni()
代码:根据不同的动画方式,播放动画
 switch(iAniStyle)
 {
 case ROLE_ANI_UP:
  if(iparam1>31)
  {
   //如果上升距离超过31(图片高度),动画结束
   break;   
  }
  //人物上升动画,截取图片上部,显示到当前坐标
  SelectObject(hdcsrc,hBm);
  BitBlt(hdcdest,
   xpos,ypos+32-iparam1,
   width,iparam1,
   hdcsrc,
   iFrame*width,height/2,SRCAND);  
  BitBlt(hdcdest,
   xpos,ypos+32-iparam1,
   width,iparam1,
   hdcsrc,
   iFrame*width,0,SRCPAINT); 
  //增加上升距离
  iparam1++;
//如果上升距离超过31(图片高度)
  if(iparam1>31)
  {
   iAniBegin=0; //动画结束,清除动画播放状态
  }
至此,两个动画方式都实现了。但是,如果在动画播放过程中,玩家按左右键,移动,就会出现,角色一边上升,一边行走,甚至跳跃。怎样解决?如果播放动画,屏蔽键盘响应。
按键响应函数:int GAMEMAP::KeyProc(int iKey)
代码:
 case GAME_IN:
  //如果人物正在播放动画,拒绝键盘响应
  if(rmain.IsInAni())
  {
   break;
  }
这样,在播放过程中,不受玩家按键影响。玩家所有功能全部实现,接下来看一下整个游戏逻辑,且听下回分解。
附:
超级玛丽第一版源码链接:http://download.csdn.net/source/497676
超级玛丽增强版源码链接:http://download.csdn.net/source/584350

抱歉!评论已关闭.