基于动画原理的提高


  既然上面的 游戏的“内幕”已经掌握,那么我们来看看在上一节中涉及的“武器”和基本知识。或许本篇所涉及的东西是基于理论的多数,但是,这将为理解在后面即将写的程序部分会打下很好的基础的。所以咬咬牙,看完吧!(啊?没有牙了啊?大家应该鼓掌吧!连牙都没有长齐的“3、4点种的太阳”都开始学习了,你们还有理由吗?恩?是大娘啊?那更应该值得学习了!跑题:)
 


  首先要介绍的第一位主角是 Windows 编程中的必要元素: RECT 。是英语 rectangle 的简写,意思是矩形。它有什么用呢?我们在上面不是讲到了动作的分解动作吗?我们看右图:


  这个图就是一个简单的行走动作分解图,复杂的可能有10帧左右哦:)那么怎么在程序中实现自动在纸上画出正确的图片呢?(其实我一直在考虑是否将这部分内容加上,因为实在太基本了。但是每个人都这么想的话,基础的谁来教呢?算了,让别人的口水淹死我吧!)假设您已经有点 C++ 语言的基础了。这个教我教的话,说不过去吧:)请看下面的代码:


#define m_Width   32   // 每个动作的 宽度  

 #define m_Height  48   // 每个动作的 高度  

   
  





 void ShowThePic()  

 { 

     static RECT rect;               // 矩形对象,用于精确定位所要的当前动作  

     static int CurrentFrame = 0;    // 当前动作的编号  

     static int Direction = 0;       // 当前的方向  

     rect.top = Direction; rect.bottom = (Direction+1)*m_Height;       // 对当前矩形的大小定义,数学的问题哦  

     rect.left = CurrentFrame; rect.right = (CurrentFrame+1)*m_Width;  // 根据英文的意思也可以知道在给谁赋值  

     BltPicToScreen();               // 一个伪函数,作用是将当前矩形内的图形复制到屏幕上。  

     CurrentFrame++;  

     if( CurrrentFrame==3 ) 

         CurrentFrame = 0; // 这个步骤能够保证动作的循环  

 }




  不知道这么个函数你能否看懂。之所以要采用 static 静态变量,是因为我们这个函数程序要循环运行。如果直接写个 int 的话,每次执行都会被赋回原值 0,那么图片就不会变了。 


  上面这段代码其实并不是那么理想。因为程序自己在那儿一个劲地运行,完全没有我们控制的份儿。别急!来看下面这份修改过的伪代码: 

#define m_Width   32   // 每个动作的 宽度  

 #define m_Height  48   // 每个动作的 高度  



 void ShowThePic()  

 { 

     static RECT rect;     // 矩形对象,用于精确定位所要的当前动作  

     static int CurrentFrame = 0; // 当前动作的编号  

     static int Direction = 0;    // 当前的方向  

     rect.top = Direction; rect.bottom = (Direction+1)*m_Height; //对当前矩形的大小定义,数学的问题哦  

     rect.left = CurrentFrame; rect.right = (CurrentFrame+1)*m_Width; //根据英文的意思也可以知道在给谁赋值  

     BltPicToScreen();     // 一个伪函数,作用是将当前矩形内的图形复制到屏幕上。  



     if( LeftArrowDown() ) // 如果 左箭头 被按下  

     {  

         Direction = 1;    // 赋值方向为 1  

         CurrentFrame++;  

     }  



     if( RightArrowDown() )  

     {  

         Direction = 3;  

         CurrentFrame++;  

     }  



     if( UpArrowDown() )  

     {  

         Direction = 2;  

         CurrentFrame++;  

     }  



     if( DownArrowDown() )  

     {  

         Direction = 0;  

         CurrentFrame++;  

     }  



     if(CurrrentFrame==3) 

         CurrentFrame = 0; // 这个步骤能够保证动作的循环  

 }




  经过这么一修改,问题再次得到解决。上面的代码就能够响应用户的操作了。当然,你这么直接在程序里输入这些代码是不行的:)因为是“伪代码”。你得根据实际情况,自己相应地做些修改,才能使程序运行! 


  (题外话:不晓得这么进行教学,你是否能够一点一点的积累到知识?这种教程是不是合适?请到论坛内发表意见,我真的很想能够摸索出大家接受的方法,有利教学) 


  欢迎回到教程中来!有人或许会问,为什么这么麻烦要把图形放在这么个图片里头,不一个动作一个图啊?呵呵,想想,那要多少图片啊,很难于管理的。况且,这样并不能避免使用这种常用手法,因为 RECT 已经是一个成员。游戏里不能不用他的!