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