第七章 让我们把面板显示出来吧
我们的角色老是在左上角处于被切了一半的状态,看起来很没意思,这一节就让我们把最低程度的框架给搭好吧。
为了保存面板(UI)的图片,首先在GV.h里面先定义变量。
–在GV.h中如下追加-
GLOBAL int img_board[40];
为下一节做准备,我们顺便先准备一个初始化函数吧。
接下来,我们定义表示出角色可以自由运动的领域的范围。
FIELD_MAX_X, FILED_MAX_Y是各种角色可以自由移动的领域的最大尺寸。
FIELD_X, FILED_Y是这一领域的左上角坐标。
下述的数值描述了这样一个角色可运动的区域:从(32,16)坐标开始,横向384纵向448像素的区域。
–define.h变更–
#include "struct.h"
#define FIELD_MAX_X 384
#define FIELD_MAX_Y 448
#define FIELD_X 32
#define FIELD_Y 16
我们使用calc_ch来计算显示角色的图像。
通过递增计数器,以24次递增为一个周期。在此期间有四种类型的图像轮流显示。
如果您看了数据文件中的角色图片的话,您就会明白了,角色是四种图片一个动作,因此我们使用下面的式子来循环计算图片的编号。
–char.cpp变更–
#include "../include/GV.h"
void calc_ch(){
ch.cnt++;
ch.img=(ch.cnt%24)/6;
}
声明在主循环中调用的函数的时候,也要写在function.h中。
–向function.h进行以下追加-
GLOBAL void calc_ch();
在load.cpp中读入面板的图像数据。
至于为何图片用于编号的数字并不是连续的,这并没有什么特别的意义,不过这样编号的话后面的更换图片会方便一点。其实从0开始连续编号也完全没有问题。
–load.cpp变更-
#include "../include/GV.h"
void load(){
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}
设定角色的初始坐标。
–ini.cpp变更–
#include "../include/GV.h"
//最开始的初始化
void first_ini(){
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4;
}
为了描绘面板我们使用graph_board函数。
–graph.cpp变更–
#include "../include/GV.h"
void graph_ch(){
DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}
void graph_board(){
DrawGraph( 0, 0,img_board[10],FALSE);
DrawGraph( 0, 16,img_board[11],FALSE);
DrawGraph( 0,464,img_board[12],FALSE);
DrawGraph(416, 0,img_board[20],FALSE);
}
void graph_main(){
graph_ch();
graph_board();
}
然后仅是在main.cpp的主循环中的case 0中加入“first_ini();”。
–main.cpp变更–
#define GLOBAL_INSTANCE
#include "../include/GV.h"
//循环必须处理的三大过程
int ProcessLoop(){
if(ProcessMessage()!=0)return -1; //过程处理如果发生错误返回-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;//初始化和里画面化
while(ProcessLoop()==0){//主循环
switch(func_state){
case 0:
load(); //载入数据
first_ini();//最开始的初始化
func_state=100;
break;
case 100:
calc_ch();
graph_main();//绘制main
break;
default:
printfDx("错误的func_state\n");
break;
}
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//按下ESC键则跳出循环
ScreenFlip();//里外画面翻转
}
DxLib_End();//DX Library终结处理
return 0;
}
运行结果