初探Windows窗体程序(上)2D游戏制作从入门到入土。
这个相对于我那个小游戏入门就显得比较专业了,但是仍然会给源码,关注可以下载相应的模板,模板是给全的。###感谢老司机(一个人)###
First
了解下游戏的过程吧,一般来讲游戏分下面几种状态
游戏状态(game_state)
#define Game_Menu 0 //游戏菜单
#define Game_Ready 1 //游戏加载
#define Game_Play 2 //游戏进行
#define Game_Pause 3 //游戏暂停
#define Game_Over 4 //游戏结束
就是这几个,所以在编程中,我们可以用一个int型变量来记录当前的游戏状态:
int game_state = Game_Menu;
Game_Play可延伸为Game_Play_Common和Game_Play_Boss甚至更多,这样做可以区分普通关卡和boss关卡。读者也可以采用枚举类型(enum)来储存游戏状态。
(二)认识WINAPI WinMain函数
这个函数就类似于DOS(控制台)程序中的int main()函数一样,它是窗体程序的入口。
一般来说,WinMain里有以下三部曲:
1.注册窗口 2.创建窗口 3.进入主事件循环
让我们来看一下WINAPI WinMain的函数原型:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
接下来让我们来看一下每个参数:
●hInstance:这是一个Windows为应用程序生成的实例句柄。句柄是什么呢?句柄是一种特殊的智能指针 。它可以指向一个窗口,一个场景设备等等,而不是我们普通的指针。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。而实例句柄又是什么呢?实例就是一个用来跟踪资源的指针或数,hInstance就像一个名字或地址一样,跟踪应用程序。
●hPrevInstance:这个是Windows旧版本里使用的实例句柄,现在已经不再使用了,但在WinMain的函数头里还是没有去除。
●lpCmdLine:这是一个空值终止字符串,和main(int argc,char **argv)函数中的命令行参数相似,由于我们在游戏制作中使用得较少,这里就不详细介绍。
●nCmdShow:这个参数在启动过程中被传递给应用程序,带有如何打开主应用程序的信息,不过这个参数在游戏制作中同样使用得较少,也不详细介绍。
当然,如果现在你看不懂,可以理解,读者可以先接着看下面的内容,待会再回来消化。
- 注册窗口
就像账号一样先要注册才能登录,注册窗口就是向Windows申请建立一个窗口,并且窗口的样式由制作者决定。注册窗口的过程就像填一张表格,填完之后把表格交给Windows,让Windows按照表格上的内容创建窗口。
那这张表格是什么呢?就是WNDCLASSEX数据结构,我们看下Windows头文件的定义:
typedef struct WNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
通过设置各个参数,就可以设置窗口的格式啦!让我们来看看是怎样的:
●cbSize:这是一个非常重要的参数,它是WNDCLASSEX结构本身的大小,可能读者会问,为什么需要知道结构的大小?原因是当这个结构作为一个指针被传递的话,其他函数在运行时就不必计算该类的大小,会提高速度。因此,我们这样写就可以了: