腹泻原因

首页 » 常识 » 问答 » 零基础游戏编程第一块硬骨头,上万字助你掌
TUhjnbcbe - 2025/5/13 18:04:00
北京的白癜风医院有哪些 http://pf.39.net/bdfyy/bjzkbdfyy/

当零基础的你完全理解了前面几节课的内容后,就可以大刀阔斧地写代码了。这一节课,我们要啃下一块硬骨头,这块硬骨头就是完全掌握Windows编程框架,看清楚,是完全掌握。本文有多字,对于零基础的你非常关键,请你务必啃下这块硬骨头,1天看不完,可以分2天看。当然,硬骨头只是对于零基础读者而言的。你可能会问,不是学习游戏编程吗?和Windows编程框架有什么关系?道理非常简单,我们写游戏,是在Windows这个大环境下写的,不管写任何程序,都无法脱离和Windows的关联。所以,学习游戏编程的第一步,就是学习Windows编程框架。

一、理解Windows操作系统的工作原理

对于零基础的你们来讲,没有经过大学系统的学习,很多东西直接讲是比较突兀的,为了充分理解Windows编程框架,我们必须了解Windows的工作原理。

从整体上讲,Windows操作系统主要的任务是管理硬件,并且让自己系统下的软件正确运行。

关于CPU和内存

什么是硬件?如果你拆过电脑,就知道电脑上是有一个一个部件的,而这些部件,就是所谓的硬件。系统管理的硬件非常多,作为一个想要编写程序的人来讲,必须要知道的是CPU和内存。CPU就是计算机计算二进制加法的地方,而内存就不怎么好理解了。你可能见过内存条,也可能没见过,你只需要知道,内存就是内存条提供的。

我们前面讲过,计算机是通过快速的复杂计算,将我们需要的内容显示在屏幕上。不用我讲,你也应该知道,屏幕上显示的内容本来就纷繁复杂,要计算的话,计算量是非常非常庞大的。如此庞大的计算量,会产出非常多的数据,数据非常多就牵扯到存储的问题了。虽然CPU也有一点点的存储功能,但是面对如此多的数据也会显得无能为力。为了解决这个问题,计算机不得不加入内存,目的是存储这些庞大的计算数据。由于CPU随时都可能使用这些数据,所以,主板上CPU和内存是直接相连的。

关于CPU,我想额外说一个内容——什么是CPU的位数?

我们已经知道,CPU是计算二进制加法的,那这个加法是怎么计算的?比如二进制+,CPU是如何计算的呢?这个取决于CPU是几位的。比如,CPU是4位的,4位是可以装下3位的二进制数字的,那么两者相加就是直接相加,这个加法只消耗1次CPU加法时间。如果CPU是1位的,就装不下这3位的二进制数字,就需要把3位二进制分解成1位、1位这种形式,再依次相加。由于数字太长,还需要额外的存储器储存中间结果,综合下来,这个加法将消耗起码10次的CPU时间。

所以,CPU位数越大,计算的速度越快。CPU开始民用的时候,已经有8位了,这个比较早,大部分的读者都没有出生。后来CPU发展到了16位,也就是90年代的样子,像当时的Windows95就是16位的。然后就有了32位的CPU,发展到现在,64位的CPU已经屡见不鲜了。CPU位数再大,也需要配套的操作系统来发挥作用。如果64位的CPU安装了8位的系统,那么CPU剩下的56位就都浪费了。

内存和CPU是一一对应的。几位的CPU,就会把内存分割成几位的。比如8位的CPU,就会把内存以8位为基本单位分割成一个一个独立的“方块”;而16位的CPU就会把内存分成16位的“方块”;32位和64位的CPU是一个道理。CPU会把这些分割出来的“方块”进行编号,编号从0开始,一直到2n,这些编号,就是所谓的内存地址。这样我们就能计算出,32的CPU,最大能支持个地址,也就是4GB的空间。所以,当你的系统是32的时候,8G的内存卡中就有4G空间是浪费掉的。

现在的操作系统基本上都是64位的,而我们写的俄罗斯方块却是32位的,为什么要这样呢?最主要的原因是64位的系统并没有普及,很多人用的还是32位的系统。再者,除非是超大型的3A游戏需要64位的地址外,其他的游戏32位的地址就足够了。而且,32位和64位只是编译的不同,只要你愿意,同样的代码既可以编译成32位的应用程序,也可以编译成64位的应用程序。虽然要改动一些内容,不过改动微乎其微。

Windows应用软件

Windows的第二个主要作用,是让软件正确地运行。Windows有个额外的名称,叫做视窗操作系统。什么意思呢?就是说,Windows和用户的全部交互方式,是以窗口的形式展现的。所以,Windows操作系统,是一个又一个的窗口组成的。

我们在Windows里看到的任何东西,都是一个窗口。打开的应用程序是一个窗口,显示的按钮是一个窗口,各种各样的弹窗也是窗口,右键的菜单还是窗口,就连整个桌面都是窗口。也就是说,Windows是以窗口为基准组合起来的。也正是因为窗口,Windows才能多任务一起运行,我们能边上网、边听歌、边打字。这样虽然方便,但容易出现一个问题:比如我们用键盘输入,系统怎么判定哪一个窗口接收键盘输入呢?

为了解决这个问题,Windows发明了“消息系统”。

什么是消息系统呢?就是说,只要在Windows系统下,要传递任何的信息,都是以消息的形式来传递的。比如,你在键盘上按下了“a”键,就会产生一条消息;鼠标动了一下,又产生一条消息;你打开某个程序,也产生了一条消息。只要Windows操作系统在运行,消息就不会间断。但是,系统一次只能处理一条消息,而消息这么多,只能排着队等着处理了。这种现象还有一个非常形象的名称——消息队列。

想要编程的话,我们需要了解两点:Windows是以窗口组成的,Windows所有的操作都是以消息的形式传递的。

二、游戏程序本质上也是一个窗口

这样你就能理解,我们学习游戏编程为什么要先学Windows框架了,因为游戏程序本质上也是一个窗口。Windows的窗口功能是非常多的,这一点我们已经深有体会。比如我们一般用的办公软件,窗口功能非常强大,各种各样的菜单,各种各样的按钮,各种各样的工具。但是,游戏很少用到窗口的这些功能,毕竟玩家玩游戏主要是为了游戏体验嘛!如果可以的话,我们连这个窗口都不想要,只是迫于Windows系统,我们不得不把游戏放在一个窗口里。

三、Windows下游戏程序的框架

有了上面的铺垫,下面的框架代码就好解释了。我特意花了十几分钟时间写了一个Windows框架,全部的代码如下。

#includewindows.h#includewindowsx.h#includetchar.h//函数声明LRESULTCALLBACKWndProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam);//入口函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPreInstance,LPSTRlpCmdLine,intnShowCmd){//首先定义Windows类WNDCLASSEXw;LPCTSTRwn=_T(我的第一个程序);//清空内存memset(w,0,sizeof(WNDCLASSEX));//赋值w.cbSize=sizeof(WNDCLASSEX);w.style=CS_DBLCLKS

CS_OWNDC

CS_HREDRAW

CS_VREDRAW;w.lpfnWndProc=(WNDPROC)WndProc;w.cbClsExtra=0;w.cbWndExtra=0;w.hInstance=hInstance;w.hIcon=LoadIcon(hInstance,NULL);w.hCursor=LoadCursor(NULL,IDC_ARROW);w.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);w.lpszClassName=wn;w.hIconSm=LoadIcon(hInstance,NULL);w.lpszMenuName=NULL;//注册类RegisterClassEx(w);//创建窗口if(!CreateWindowEx(NULL,wn,L第一个程序,WS_OVERLAPPEDWINDOW

WS_POPUP

WS_VISIBLE,0,0,,,NULL,NULL,hInstance,NULL))return0;//消息循环boolgot;MSGmsg;PeekMessage(msg,NULL,0U,0U,PM_NOREMOVE);while(WM_QUIT!=msg.message){got=(PeekMessage(msg,NULL,0U,0U,PM_REMOVE)!=0);if(got){if(!TranslateAccelerator(msg.hwnd,NULL,msg)){TranslateMessage(msg);DispatchMessage(msg);}}else{//这里是以后渲染游戏的位置/*就是这里,下面的Sleep语句是单独的*/Sleep(1);}}return(int)msg.wParam;}LRESULTCALLBACKWndProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam){HRESULTr=0L;//开始处理消息switch(msg){caseWM_CLOSE:caseWM_DESTROY:PostQuitMessage(0);break;}returnDefWindowProc(hWnd,msg,wParam,lParam);}你可以先编译这个程序。具体的方法如下:

1.打开VS,在文件菜单下单击新建项目,在VisualC++下面选择win32,在右侧的选项中选择win32项目,在下方位置中选择合适的目录(是存放代码等文件的位置,随便选在哪里都可以),然后随便取一个名字,比如,我取了win这个名字。

2.点确定后直接下一步,在这里直接把“空项目”勾上,然后点击完成。这样,一个项目就创建完成了。

3.在解决方案管理器中,右键win这个项目,找到添加,然后选择新建项。

4.在弹出的窗口中选择C++文件(.cpp),随便取个名字就好,比如,我取名win。

5.VS会自动把cpp文件添加到源文件中。由于是空项目,右侧的编辑窗口中是一片空白的。然后,你把上面的代码复制进去。

6.在生成菜单下选择生成解决方案,这段源代码就会进行编译了。

7.编译完成后,在调试菜单下单机启动调试,这个程序就会运行了。由于只是一个框架,窗口中一片空白。你还可以去项目目录里寻找win.exe这个文件直接双击运行,项目目录就是第1步中设置的项目存放目录。

在复制代码的时候,一定要把序号去掉,因为编译器读不懂序号是什么意思,这一点非常关键。

你可能会说,这些代码我看不懂啊!没关系,接下来我逐行进行解释。

四、逐行解读这个游戏框架

1.一般的,程序员喜欢以行来称呼代码,比如一行代码,两行代码这个样子。所以,这里就是第一行代码。这一行代码的意思,是把windows.h这个文件包含进来。怎么理解呢?由于我们建立的是空项目,所以项目里面什么都没有。而电脑是个笨蛋,我们不告诉它要做什么,它就完全不懂我们要做什么。也就是说,我们想要写程序,必须把最最基础的东西告诉电脑,比方说,数字是怎么样变成图像的。而这些基础的东西,Windows系统已经帮我们做好了,既然做好了,我们就可以直接拿来用。实际上,Windows系统已经帮我们做了非常多的事情,而这些事情,已经被Windows做成了一个又一个类似芯片的东西,芯片有接口,其中最主要的接口,全部在windows.h这个文件里。所以,这一句话是告诉电脑,我们接下来写的程序,要用到windows.h文件里的“芯片接口”。

而#include是固定的程序语句(既然是编程语言,所有和计算机沟通的关键单词,都被叫做语句),语句的意思是告诉电脑,我们这个程序,要用到后面括号里面的文件。除了括号,这个语句还可以用””双引号的格式。也就是说

#includewindows.h

#include“windows.h”

的效果是类似的。

2.看懂了第一行,就能看懂这一行代码。第二行和第一行类似,是不是两者有什么关系呢?没错,Windows发现自己的功能越来越强大,一个windows.h文件写得有点太多了,于是把一部分的内容分出来,写在了windowsx.h这个文件中。

3.这里的关键是tchar.h这个文件。这个文件一看就和Windows的功能没有关系,它的主要作用,是为我们接下来使用汉字提供方便。我们都知道,编程用的是英文,所以,中文在很多地方用起来是非常麻烦的,而tchar.h这个文件,刚好帮我们解决了这个问题。

4.这是一行注释。在C++语言里,//后面接的任何内容都是注释,不管是何种符号,都算注释。//是行注释,只要换行,这个注释的功能就失效了。注释仅仅是为了让程序员看懂自己写的东西。我们写的这个框架行代码都没有,要知道很多程序的代码都是上万行,如果不写注释,程序员写到后面,根本就不知道自己前面写了啥,要是出了一个小错误,可能改几天都改不好。注释不是代码,当编译器看到注释的时候,会自动跳过,不去翻译它。

1
查看完整版本: 零基础游戏编程第一块硬骨头,上万字助你掌