原文地址:
接下来,画个人自机试试吧。
为此,我们首先得定义个结构体,把自机所需的变量都定义好。
自机的结构体,定义成如下这样。
——————————————————————————————————————————————————————————————————————
--struct.h改动--
//自机相关的结构体
typedef struct{
int flag; //标志
int cnt; //计数
int power; //火力
int point; //点数
int score; //得分
int num; //残机数
int mutekicnt; //无敌状态的计数
int shot_mode;//射击模式
int money; //金钱
int img; //图像
int slow; //是否为慢速模式
double x,y; //坐标
}ch_t;
——————————————————————————————————————————————————————————————————————
把这个构造体的定义,写在 struct.h 文件里面。
里面定义的东西有点多,但无需全部记住。
自机有着各种各样的数据呢,火力啊,得分啊,目前的射击模式啊。。。
总之,我们就先把这些都准备好。现在我们只关心坐标,
反正我们先记住,自机的构造体里面有double 型的x 和 y 的变量。
接下来,我们需要读取自机的图片了。我们用img_ch这个变量,来表示图片的句柄(Handler)
自机的图片,是12张一套的。因为龙神录里面有变身,所以这里需要两套图片。
int img_ch[2][12];
像这样,定义好变量后,就可以使用了。把变量在main 文件里面定义好之后,
在下面的load.cpp 用extern 声明一下,然后就可以使用了。
————————————————————————————————————————————————————————————————————
--load.cpp改动--
#include "../include/GV.h"
extern int img_ch[2][12];
void load(){
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}
—————————————————————————————————————————————————————————————————————
在上面的路径下,确认图片是否存在。上面的函数读入的含义是,
总共是12张图片,横着4张,竖着3张,长宽为 73-73 像素的,存放到 img_ch[0] 里面去。
如果不理解的话,去官方主页的参考手册页面(reference page),确认下这个函数的使用方法吧。
那么,画图的函数 graph.cpp 也需要改动了。
再声明一个 graph_main 函数,方便在 main 文件里整个调用。
——————————————————————————————————————————————————————————————————————
--graph.cpp改动--
#include "../include/GV.h"
extern ch_t ch;
extern int img_ch[2][12];
void graph_ch(){
DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}
void graph_main(){
graph_ch();
}
——————————————————————————————————————————————————————————————————————
然后,是最重要的main.cpp文件了。
——————————————————————————————————————————————————————————————
--main.cpp改动--
#define GLOBAL_INSTANCE
#include "../include/GV.h"
//现在的按键输入的处理
extern int GetHitKeyStateAll_2();
//根据收到的按键序号,返回这个键现在的输入状态
extern int CheckStateKey(unsigned char Handle);
//数据的载入
extern void load();
//主绘制函数
extern void graph_main();
int img_ch[2][12]; //自机的图片12张 X2(变身用)
ch_t ch; //自机的结构体
//主循环里必做的三大操作
int ProcessLoop(){
if(ProcessMessage()!=0)
return -1; //Process 处理出错的话,返回-1
if(ClearDrawScreen()!=0)
return -1; //清理画面出错的话,返回-1
GetHitKeyStateAll_2(); //对现在的按键输入进行处理
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//窗口模式
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0)
return -1; /初始化和设置双缓冲
load();//载入数据
while(ProcessLoop()==0){ //主循环
graph_main(); //绘制函数
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)
break; //输入ESC的话,break
ScreenFlip(); //交换双缓冲画面
}
DxLib_End();//DxLib终止
return 0;
}
——————————————————————————————————————————————————————————————
运行结果:
显示像上面这样的话,就完成了。在左边可以看到一点点的自机。
哎呀,不要啊。怎么 main函数变得这么难读了 啊~~
不过不要紧,我们在下一章里把它整理的漂亮一些吧。
本人CSDN博客目录: