基于动画原理的提高

基于动画原理的提高


  既然上面的 游戏的“内幕”已经掌握,那么我们来看看在上一节中涉及的“武器”和基本知识。或许本篇所涉及的东西是基于理论的多数,但是,这将为理解在后面即将写的程序部分会打下很好的基础的。所以咬咬牙,看完吧!(啊?没有牙了啊?大家应该鼓掌吧!连牙都没有长齐的“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 已经是一个成员。游戏里不能不用他的! 


  哇,口水干了。(其实是手累了:)我们下回再见吧。 


  下回预告: 
  少年侦探柯南为了查清楚事情的真相,他......(?还真的预告啊?) 
  不好意思,习惯性用语了:)在下回,我会讲一下,如何将今天的代码整合到程序中去。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值