【四圣龙神录的编程教室】第3章、使用全局变量看看吧

原文地址:

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


那个叫做 GetHitKeyStateAll_2  的按键输入处理函数 ,从刚刚的示例代码里,复制到这里来了。

像刚刚那样,key的处理函数必须是全局函数,

但全局变量在哪里都可能被修改,所以尽量少用比较好。

虽然还是用了全局变量,让我们来试试尽量减少bug发生率的方法。

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

-- key.cpp的改动 --

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

unsigned int stateKey[256];

int GetHitKeyStateAll_2(){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) 
           stateKey[i]++;
        else
            stateKey[i]=0;
    }
    return 0;
}

int CheckStateKey(unsigned char Handle){
        return stateKey[Handle];
}

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


像上面这样,main 文件 和 key 文件分开写。

现在,我们需要调用  ESC 键按下的状态 Key[KEY_INPUT_ESCAPE] 

但是 ,有这个Key 的 stateKey 为了不让其他地方直接访问到,用 CheckStateKey 函数来返回 那个键的序号。

这样,Key 的值被不小心修改的可能性就降低了。

现在,就用上面的封装了的 CheckStateKey 函数来传递Key的序号,来检查一下 Key 的输入状态吧。

另外,其他的文件如果要访问封装的变量或者函数,需要加上 extern 来声明。


// 现在 处理 按键输入

extern int GetHitKeyStateAll_2();

//  返回 接收到的 Key 的序号的输入状态

extern int CheckStateKey(unsigned char Handle);


现在,可以在main.cpp用这种写法,在main 文件内访问key文件内定义的函数了。

除此之外,上一节写的 MainLoop 每次都会写到的,就把它整理到一个 叫ProcessLoop 的函数里面去了。

这不会改变程序的运行。恩,我们来看看修改后的main 文件吧。

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

--main.cpp的改动---

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

//对现在的按键输入进行处理
extern int GetHitKeyStateAll_2();
//根据收到的键的序号,返回现在的输入状态
extern int CheckStateKey(unsigned char Handle);

//主循环里,一定要进行的三大处理
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){       //主循环
        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)
              break;                   //输入ESC的话,退出主循环
        ScreenFlip();//交换双缓冲画面
    }

    DxLib_End();//DxLib终止
    return 0;
}

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


按下ESC就退出的话,就完成了。


本人CSDN博客目录:

http://blog.csdn.net/tidus5


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值