【四圣龙神录的编程教室】第7章、把面板表示出来吧

原文地址:

http://dixq.net/rp/7.html


一直都是自机在左上角这边很不好玩啊,我们把最基本的框架显示出来看看吧。

首先在GV.h 里把存储面板用的画像表示出来吧。

—————————————————————————————————————————————————————————————————————————————

--GV.h里添加如下语句--


GLOBAL int img_board[40];

—————————————————————————————————————————————————————————————————————————————

顺便一提,作为下一章的准备,我们先把初始化函数准备好吧。
然后,我们先定义下自机运动的范围的区域的显示吧。
FIELD_MAX_X, ~Y 是各种各样的角色的运动领域的大小。
FIELD_X, ~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里计算。
通过count计数的增加,每24作为一个周期。在其中,4张图片循环调用。
正如在data文件里所看到的角色图像那样,角色用4张图片组成一个动作,
下面的式子,就是循环计算角色的图片编号。

—————————————————————————————————————————————————————————————————————————————

--char.cpp改动--


#include "../include/GV.h"


void calc_ch(){
        ch.cnt++;
        ch.img=(ch.cnt%24)/6;
}

—————————————————————————————————————————————————————————————————————————————

要在MainLoop里面调用的函数,声明的时候要写在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 文件里,主循环里的 case 100 里面加上 calc_ch;  就这点改动。  (原文是加上 first_init() ,估计有误)

—————————————————————————————————————————————————————————————————————————————

//--main.cpp改动--

#define GLOBAL_INSTANCE
#include "../include/GV.h"

//主循环里必须做的三大处理
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; //初始化和设置双缓冲模式

    while(ProcessLoop()==0)     //主循环
    {
        switch(func_state)
        {
        case 0:
            load();         //载入数据
            first_ini();	//第一次初始化
            func_state=100;
            break;
        case 100:
            calc_ch();
            graph_main();//主绘画函数
            break;
        default:
            printfDx("未知的func_state\n");
            break;
        }

        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)
            break;                  //按下ESC的话,break
        ScreenFlip();       //交换双缓冲画面
    }

    DxLib_End();//DxLib中止
    return 0;
}
————————————————————————————————————————————————————————————————————————————
运行结果:






本人CSDN博客目录:

http://blog.csdn.net/tidus5


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值