| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1495 人关注过本帖
标题:[转帖]游戏编程起源(初学者)Ⅰ
只看楼主 加入收藏
ant3000
Rank: 1
等 级:新手上路
帖 子:188
专家分:0
注 册:2004-6-7
收藏
 问题点数:0 回复次数:9 
[转帖]游戏编程起源(初学者)Ⅰ

游戏编程起源(初学者)Ⅰ

★第一章 Windows编程基础

☆ 简介 本章目的是介绍WINDOWS编程基础。在本章结束时,你应该能够很好的工作了,虽燃可能是简单的WINDOWS程序。你需要有C语言的基础知识,我很少将C++的代码扩充到程序中。当然,由于WINDOWS本身就是面向对象的,一点类的知识是不会对你有什么损害的。如果你不熟悉C++,没有关系,我想你还是能从我这里学到大部分的东西。所有的程序代码都通过了MICROSOFT VISUAL C++6.0的编译,如果你还没有合适的编译器,弄一个同我一样的好了,它还是很棒的。开动吧! ☆ 开始 多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件,要确保使用它们。当然,你还需要其它的标准的C的头文件,象stdio.h,conio.h等。除了这些,你还会经常看到在程序的开始有这样一行代码: #define WIN32_LEANAND_MEAN 它表示Windows的头文件中将拒绝接受MFC的东西,这将加速你的build时间。如果你从没有打算应用MFC在你的游戏编程中,那就使用它吧。如果你以前从没有看过这种声明类型——在#define后,直接加上一个“单词”,那么它的作用就是有条件编译。看看下面的例子:

#ifdef DEBUG_MODE printf("Debug mode is active!"); #endif

意思是:如果程序的开始包含#define DEBUG_MODE,那么就printf(),否则退出。这个对于你跟踪程序的逻辑错误是很有帮助的。

☆ WinMain()函数

DOS下的C语言从main()开始,Windows下的C语言从WinMain()开始,一个空的WinMain()函数是这样的:

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return(0); } 一个函数即使什么也没做,也应该返回一个值。是的,有好多东西我们不熟悉。首先的首先,WINAPI是个什么声明?WINAPI是在windows.h头文件中定义的一个宏,它把函数调用翻译成正确的调用约定。当我们在程序中需要用到汇编语言的时候,我们在来深究它好了,记住,如果要用WinMain(),就必须要有WINAPI。

下一步让我们来看看括号里的四个参数: ◎ HINSTANCE hinstance:HINSTANCE是一个句柄类型的标识符。变量hinstance是一个整数,用于标识程序实例。Windows设置这个参数的值,并把它传递给你的程序代码。很多Windows函数都要用到它。 ◎ HINSTANCE hPreInstance:你不用担心这个参数,它已经被废掉了。它只是为古老的Windows版本服务的。你将还会看到类似的情况。 ◎ LPSTR lpCmdLine:是一个指向字符串的指针,它仅在程序名是从DOS命令行输入或是从Run对话框中输入时才起作用。因此,很少被程序代码所用。 ◎ int nCmdShow:决定了窗口在初始显示时的状态。Windows通常给这个参数分配一个值。通常是SW_打头的一个常量。例如SW_SHOWNORMAL表示默认状态,SW_MAXINIZE或SW_MINIMIZE分别表示最大和最小模式等等。

以上大体上是WinMain()的参数的介绍。下面对变量、参数、常量、类等的命名方法介绍一下。

☆ 匈牙利命名法 【不翻译这一段了,相关的资料很多】

☆ 消息 当你在DOS下编程的时候,你不必担心其它程序的运行,因为DOS是独占模式。但你在Windows平台上编程时,你不得不考虑其它正在运行的程序。鉴于此,Windows通过“消息”来连接操作申请和具体操作。简单的说,就是我们指示程序或程序本身向Windows发出诸如移动窗口、放大窗口、关闭窗口等地申请,Windows再根据申请,考察实地情况,拒绝或发出指令,让程序(计算机)作出相应的动作。再例如,鼠标随时向Windows发出消息,汇报光标位置,左键或右键是否按下等,Windows再根据消息作出相应的反应。总之,无论何时,Windows都要随时掌控所有的消息,而且,Windows是一直不断地接收到各种消息。 这种功能是通过一种被命名为CALLBACK函数类型实现的。不用害怕,消息的传递来,传递去都是由Windows自己完成的,你只要声明一个CALLBACK函数就可以了,就像WINAPI用在WinMain()前一样。如果还没有明白,不要紧,往下看你就明白了。现在,我要离开这个话题一会,因为你只有先建立窗口(Windows),传递消息才有可能实现。

☆ 窗口类 现在谈论一点C++的知识,因为要想建立一个窗口,你就得先建立一个窗口类。窗口类包含所有的有关窗口的信息,如用什么样的鼠标符号,菜单样式等等。开发任何一个窗口程序,都离不开窗口类的建立。为了达到此目的,你必须填写WNDCLASSEX结构。EX的意思是“扩充”的意思,因为有一个老的结构叫作WNDCLASS,这里,我们将使用WNDCLASSEX结构,它的样子如下:

typedef struct _WNDCLASSEX { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; HICON hIconSm; } WNDCLASSEX;

这个结构有不少成员,讨厌的是,你必须为窗口类设置每一个成员。莫发愁,纸老虎一个。让我们来个速成。 ※ UINT cbSize:指定了以字节为单位的结构的大小。这个成员是通过sizeof(WNDCLASSEX)实现的。你将会经常看到它,尤其是你使用了DirectX。 ※ UINT style:指定了窗口的风格。它经常被以CS_打头的符号常量定义。两种或两种以上的风格可以通过C语言中的“或”(|)运算符加以组合。大多数情况我们只应用四种风格,出于对文章长度的考虑,我们只列出这四种。若你还需要其它的,到MSDN里找一下好了。别告诉我你用的不是Visual C++啊! ◎ CS_HREDRAW:一旦移动或尺寸调整使客户区的宽度发生变化,就重新绘制窗口。 ◎ CS_VREDRAW:一旦移动或尺寸调整使客户区的高度发生变化,就重新绘制窗口。 ◎ CS_OWNDC:为该类中的每一个窗口分配一个唯一的设备上下文。 ◎ CS_DBLCLKS:当用户双击鼠标时向窗口过程发送双击消息。 ※ WNDPROC lpfnWndProc:是指向窗口过程的指针。一般都指向CALLBACK函数。如果你没有用过函数指针,简单理解为函数的地址就是函数的名字,名字后面别带括号。 ※ int cbClsExtra:它是为类保留的额外信息 。大多数程序员不用它,你在在写游戏程序时也不太可能用它,所以,设为0好了。 ※ int cbWndExtra:同上一个差不多,设为0好了。 ※ HANDLE hInstance:是指向窗口过程实例的句柄。同时也是WinMain()函数的参数之一。应该设置为hinstance。 ※ HICON hIcon:指向窗口图标的句柄,它通常被LoadIcon()函数设置。在你学会如何在你的程序中使用资源前,你先设置成如下样子:LoadIcon(NULL,IDI_WINLOGO)。当然,还有一些其它的IDI_打头的符号常量,你自己去帮助文件里找吧。

※ HCURSOR hCursor:指向窗口光标的句柄,它通常被LoadCursor()函数设置,在你学会如何在你的程序中使用资源前,你先用Windows默认的吧,LoadCursor(NULL,IDC_ARROW)。 ※ HBRUSH hbrBackground:当你的窗口过程得到消息,要求刷新(或重画)窗口时,至少要用一种纯色或“brush”(画刷)重画窗口区域,画刷是由参数确定的。你可以使用GetStockObject()函数调用几种常备的画刷,如BLACK_BRUSH, WHITE_BRUSH, GRAY_BRUSH等。现在,你就用GetStockObject(BLACK_BRUSH)吧。对不起,你可能觉得我说的太简单了,但我不想把开始弄得太复杂。我在以后的篇幅里会详细讲的,我保证。 ※ LPCTSTR lpszMenuName:如果你想建立一个有下拉菜单的窗口,你得给这个参数赋一个菜单名称(这涉及到资源),由于你还不知道怎么创建菜单,你就先用NULL设置成一个没有菜单的窗口吧。 ※ LPCSTR lpszClassName:很显然,你需要给类起个名字,随你便,如“TMD”。要用双引号引上啊! ※ HICON hIconSm:指向小图标的句柄。小图标用来显示在窗口的标题栏里。要用到LoadIcon()函数,现在,你就用Windows默认的吧,LoadIcon(NULL,IDI_WINLOGO)。 好了,你关于WNDCLASSEX结构知道的差不多了,你可以自己设置它了。下面是一个例子:

WNDCLASSEX sampleClass; // declare structure variable sampleClass.cbSize = sizeof(WNDCLASSEX); // always use this! sampleClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; // standard settings sampleClass.lpfnWndProc = MsgHandler; // we need to write this! sampleClass.cbClsExtra = 0; // extra class info, not used sampleClass.cbWndExtra = 0; // extra window info, not used sampleClass.hInstance = hinstance; // parameter passed to WinMain() sampleClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Windows logo sampleClass.hCursor = LoadCursor(NULL, IDC_ARROW); // standard cursor sampleClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // a simple black brush sampleClass.lpszMenuName = NULL; // no menu sampleClass.lpszClassName = "Sample Class" // class name sampleClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Windows logo again 【“//”后面的我就不翻译了】

我想,你已经有点儿不太崇拜Windows程序员了。言归正传,有一点我得提醒你,注意函数GetStockObject()前的(HBRUSH)类型配置,这是因为GetStockObject()可以调用其它的对象,不仅仅是“brush”,所以你需要一个HBRUSH类型配置。在Visual C++旧版本里不用配置,但新的6.0版本需要它,否则会编译出错。 下一件事是注册这个窗口类,只有这样,你才能创建新的窗口。十分简单,你只需要调用一个RegisterClassEX()函数,它只有一个参数,就是你的窗口类的地址(名字),根据我上面给的例子,这里应该这样: RegisterClassEx(&sampleClass); 嗨,我们的窗口类创建完了,我们可以用它创建一个窗口了。只是时间问题喽!

☆ 创建窗口 待续。。。。

[此贴子已经被作者于2004-06-11 11:01:25编辑过]

搜索更多相关主题的帖子: 起源 转帖 游戏 
2004-06-11 01:25
shlain
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2004-10-18
收藏
得分:0 

谢谢

但有些不懂 从最基本的开始把 要麻烦你了 别笑我啊

Windows编程 它是什么啊 一般用来做什么啊

我们可以E-MAIL联系吗?

我的 E-MAIL:shlainsam@163.com

2004-10-18 22:52
ajey2004
Rank: 1
等 级:新手上路
帖 子:164
专家分:0
注 册:2004-12-30
收藏
得分:0 
有没有vb的
我只会vb

2005-01-11 20:11
wdz4713
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-1-17
收藏
得分:0 
有没有更容易点的啊
别那么的难啊
WINDOWS 到底有多难啊???

2005-02-14 12:03
husan
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-2-17
收藏
得分:0 
好东西,我才学了不到一个月的编程,但是大部分已经可以看懂,楼主辛苦了。
2005-02-20 23:45
bingxue2332
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:446
专家分:0
注 册:2004-11-6
收藏
得分:0 
晕 说是入门就是入门

但是至少消息要知道

C或者C++要知道一个

还有结构体要知道撒


2005-03-12 18:09
thekey008
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2005-3-16
收藏
得分:0 
我是刚学C语言的,有没有更容易一点的啊?

到处看看!
2005-03-20 20:41
thekey008
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2005-3-16
收藏
得分:0 
我找了很久这一类初学者的书,不过不是很简单啊.有没有一本更容易的啊.
有的话,请各位指引啊.先谢了.

到处看看!
2005-03-20 20:47
ko325
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-4-2
收藏
得分:0 
进来学习。

2005-04-02 13:52
fuyu888
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2005-4-14
收藏
得分:0 
这么简单易懂的,现在已经很少见了,楼主花了很多时间才弄到的吧,辛苦 了,谢谢~
还有,我想说,做游戏本来就难,觉得难的多花的时间到基础学习上比较好

------此人由于过于英俊,头像正面被系统永远封印----
2005-04-24 10:18
快速回复:[转帖]游戏编程起源(初学者)Ⅰ
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041254 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved