【四圣龙神录的编程教室】第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


展开阅读全文

150讲轻松搞定Python网络爬虫

05-16
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。   从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值