博文
游戏编程起源(初学者)Ⅶ(2006-01-30 11:53:00)
摘要:★ 第四章 DirectX入门
☆ 简介
啊哈!今天是个好日子,知道为什么吗?因为今天我们要接触到令人敬畏的DirectX。它比Windows GDI要快好几倍,可用于不同的语言和多种平台,支持从绘制象素到高级3D图象,从播放简单声音到数字音乐,从键盘控制到反震手柄……它给你游戏编程所需的一切(有点夸张)。当然了,它是巨大的,需要好几本书才能含盖它的全部。先不要去担心我在这里所教给你之外的数不清的知识,毕竟我把你推到了起跑线上。
阅读本章,你需要前几章的知识和C语言的知识,由于我们还要谈到组件对象模型(COM),它是面向对象系统的基础,你最好还要有一点儿C++的知识。没有也不太要紧,我在讲到这处时会照顾你的。反正你记住,使用DirectX并不需要多少C++的知识。开始吧!
☆ 什么是DirectX?
DirectX是游戏制作者的API(Application Development Interface)。它是一组允许你直接控制计算机硬件设备的软件。如果你的硬件支持DirectX,并且你用硬件加速你的程序,这就意味着一个字——快。不用担心你的硬件知识,你不会真正的接触到它们。我们是通过硬件抽象层(HAL)和硬件仿真层(HEL)来保证设备无关性和让你的程序正常运行。
DirectX由很多组件构成,每一个都有特定的用途。组件DirectDraw是最为重要的一个,因为所有的图形都要用到它,它是2D图形的引擎,3D图形也同样离不开它。DirectDraw是我们今天就要说的。其它的组件是:
▲ DirectSound:提供硬件和软件的声音混合与回放。
▲ DirectMusic:处理基于消息的音乐数据。它支持乐器数字接口(MIDI)并为创建交互式音乐提供创作工具。
▲ DirectPlay:使得通过调制解调器链接或通过网络来与应用程序相连成为可能。
▲ Direct3D:是一个三维图形包,它提供一个高级的保留模式(Retained Mode)接口,这使得你能够实现一个完整的三维图形系统。它还包含一个低级的即时模式(Immediate Mode)接口,使得应用程序获得对渲染管线的完全控制。
▲ DirectInput:为包括游戏杆、鼠标、键盘和游戏控制器在内的输入设备提供支持。它还为反馈游戏......
游戏编程起源(初学者)Ⅵ (四) (2006-01-28 12:20:00)
摘要:以上就是第一个函数。下面说说第二个函数StretchBlt(),简单的说,位图实际的拉伸或压缩就是通过它来实现的。函数的一般形式如下:
BOOL StretchBlt(
HDC hdcDest, // handle to destination device context
int nXOriginDest, // x-coordinate of upper-left corner of dest. rectangle
int nYOriginDest, // y-coordinate of upper-left corner of dest. rectangle
int nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
HDC hdcSrc, // handle to source device context
int nXOriginSrc, // x-coordinate of upper-left corner of source rectangle
int nYOriginSrc, // y-coordinate of upper-left corner of source rectangle
int nWidthSrc, // width of source rectangle
int nHeightSrc, // h......
游戏编程起源(初学者)Ⅵ (三)(2006-01-28 12:19:00)
摘要:☆ 用GDI显示位图
记得我告诉过你位图是很容易操纵的,因为Windows本身就是位图。现在让我们看看到底有多容易吧!用GDI显示位图需要四个基本的步骤:
1、得到你要操作的窗口的DC句柄。
2、获得位图的句柄。
3、为位图创建设备上下文。
4、传送位图。
你已经知道第一步怎么做了,以前我也间接提到过第二步的做法,但没有具体说。我说过通过函数LoadBitmap()可以得到位图资源的句柄,但它有些过时了,有一个更灵活的函数LoadImage()取代了它,现在让我们看看怎么使用这个新函数。原形如下:
HANDLE LoadImage(
HINSTANCE hinst, // handle of the instance containing the image
LPCTSTR lpszName, // name or identifier of image
UINT uType, // type of image
int cxDesired, // desired width
int cyDesired, // desired height
UINT fuLoad // load flags
);
如果函数调用失败,返回NULL。成功,你得到位图的句柄,意味着你就可以从资源或外部文件调用位图了。注意,这个函数还可以取得光标、图标的句柄,所以返回类型只是简单的HANDLE。在Visual C++6.0中,你需要用HBITMAP类型定义位图的句柄变量,否则编译器会生气的。例如:
HBITMAP hBitmap;
hBitmap =LoadImage(……);
下面是LoadImage()......
游戏编程起源(初学者)Ⅵ (二)(2006-01-28 12:14:00)
摘要:☆ 绘制象素
终于到了本章的戏肉儿!只要你取得了显示设备上下文的句柄,就可以用GDI绘制象素了。记住,要调用GetDC()取得句柄。绘制单个的象素,不出意外的话,你就用SetPixel()函数:
COLORREF SetPixel(
HDC hdc, // handle to device context
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);
返回类型COLORREF是我们没有讲过的。它不是一个结构,但是在表格0x00bbggrr里是一个32位的值。Bb是蓝色成分的8位值,gg是绿色,rr是红色。高字节00没有用,总是00。让我们看看函数里面的参数:
※ HDC hdc:你将要GetDC()得到的DC句柄。(DC就是设备上下文)你只能调用GetDC()一次,然后其它的函数也可以用这个DC句柄了。你每次绘制单个象素不用再取得新的DC句柄了。
※ int X,Y:是象素的x和y坐标。是在客户区的坐标,(0,0)即是窗口客户区左上角的坐标,不是屏幕左上角的坐标。
※ COLORREF crColor:象素的颜色。设置象素的颜色,用RGB()宏最简单。RGB()括号中的三个值分别是红色、绿色和蓝色,各个颜色的值可从0-255间取,不同的值组合成不同的颜色。
如果函数调用成功,将返回一个颜色,就是你要绘制的象素的颜色。由于视频硬件的限制,返回的颜色可能与调用函......
游戏编程起源(初学者)Ⅵ (一)(2006-01-28 12:10:00)
摘要:☆ 关闭你的应用程序(关闭窗口)
有三个消息看起来差不多,都是处理关闭的事情的。它们是WM_DESTROY,WM_CLOSE,和WM_QUIT。它们的确很相似,但你需要知道它们之间的不同!一个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,如果你愿意,向用户提出是否真的退出。你知道让用户作确认或有错误出现或有什么应该注意的事情发生的时候,往往弹出一个消息框。消息框的制作是很容易的,由于它用途广泛,我们还是介绍一下:
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
这些参数,尤其是最后一个,需要一些解释:
※ HWND hWnd:过一会儿我将向你介绍一个不含有它的函数,我保证。
※ LPCTSTR lpText:这是将要显示在消息框里的文本。你可以用\n等调整一下格式。
※ LPCCTSTR lpCaption:这是显示在消息框标题栏里的文本。
※ UINT uType:这个参数可以联合使用几个不同的标记。这些标记可以根据你的目的选择,有好多MB_打头的标记供你选择,联合使用时要用“|”分隔开。下面列出了一些常用的:
……按钮类
◎ MB_ABORTRETRYIGNORE:建立有“Abort”、“Retry”、“Ignore”按钮的消息框。
◎ MB_OK:建立有“OK”按钮的消息框。
◎ MB_......
游戏编程起源(初学者)Ⅴ(2006-01-26 12:37:00)
摘要:★第三章 跟踪你的窗口和使用GDI
☆ 简介
如果你看过了头两章,你或许已经在问我什么时候能给你讲一点有成就感的东东呢?OK,时候到了。这次我们将学习WINDOWS GDI(图形设备接口)和其它一些相关的东西,象响应用户输入和处理Windows产生的一些消息。至于显示图形,我们将接触三个课题:文本显示,绘制象素,显示位图。我们先来研究一下几个Windows消息的细节。
重复的话:你需要C语言的基础知识,最好看过上两章。由于本章将使你能做一个具体的图形DEMO,有一个源代码例程附在本章后面。是用Visual C++写的和编译的,所以吗,最好同我保持一致哦!好了,开动吧!
☆ 设备上下文
在第一章里,我们创建和注册了一个窗口类,其中有一行定义了窗口的风格(功能),是这个样子:
sampleClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; // standard settings
其中三个属性是很一般的,但这个——CS_OWNDC,需要解释一下。如果你记得,我曾经告诉过你这个属性允许窗口有自己独特的设备上下文,但直到现在,我们还没有具体的讲,OK,时间到了,开讲!
设备上下文是一个结构,是一个表现一组图形对象和属性的结构,还有一些输出设备的设置和属性。使用设备上下文允许你直接操纵图形,不用考虑低级细节。Windows GDI是一个图形翻译系统,是介于应用程序和图形硬件之间的一层。GDI可以输出到任意的兼容设备,不过最常使用的设备是视频监视器、图形硬拷贝设备(如打印机或绘图仪),或者是内存中的图元文本。GDI函数能够绘制直线、曲线、封闭的图形和文本。所有访问GDI的Windows函数都需要一个设备上下文句柄作为参数。感谢上帝,这是非常容易做到的。你若想得到一个窗口的设备上下文句柄,你可以用这个函数:
HDC GetDC(
HWND hWnd // handle to a window
);
很简单,是不是?所有你做的是,把要操作的窗口的句柄传递给它,然后返回一个设备上下文句柄。如果你传递的是NULL,将返回整个屏幕的设备上下文(DC......
游戏编程起源(初学者)Ⅳ(2006-01-26 12:35:00)
摘要:☆ 字符串表
字符串表是我最喜欢的资源类型。正象你所想的:一个充满字符串的庞大表格。字符串表有很多用处。你可以用它存储你的文件名称,游戏中的人物对话,消息框中的文本,菜单中的文本等等。在资源脚本里建立一个字符串表很容易,就像这样:
STRINGTABLE
{
// entries go here
}
一个字符串表由几部分组成:一个标识字符串的数字;紧跟着一个逗号;然后是加了双引号的字符串本身。字符串表里的字符串被允许使用溢出符号,如
或 。注意,字符串表本身并没有标识符,所以每个程序只能有一个字符串表。一个简单的字符串表可能象下面这个样子:
// program information
STRINGTABLE
{
1, "3D Space Game v1.0"
2, "Written by The Masked Coder"
3, "(C) 2000 WienerDog Software"
}
从程序的字符串表里调用字符串,将使用——你可能猜到了——LoadString()函数。这是它的原形:
int LoadString(
HINSTANCE hInstance, // handle to module containing string resource
UINT uID, // resource identifier
LPTSTR lpBuffer, // pointer to buffer for resource
int nBufferMax // siz......
游戏编程起源(初学者)Ⅲ(2006-01-25 16:01:00)
摘要:★ 第二章 使用Win32程序资源
☆ 简介
欢迎继续收看!通过本章题目可能你已经猜出了本章论题,我将教会你在Windows程序中使用资源。简单的讲,资源即数据,它们通常是和程序的EXE文件相关联的,但是它们又是独一无二的。首先,资源在运行过程中不能被修改。它们实际上都是只读文件,而且程序代码不能够直接访问它们。另外,资源并不在程序的数据区内。在装入时,程序资源通常在某个磁盘文件中,直到程序需要它们时才被装入。使用资源是一件很容易的事情,并且它的妙处无穷。Windows为我们提供了大量的资源类型,但我们这里只学一些最常用,最容易的:图标(icon)、光标(cursor)、位图(bitmap)、菜单(menu)和字符串(string)。此后,我还将教你建立自己风格类型的资源,使你为所欲为。(好像挺诱人哦!)
重复一下,要想看懂本章,你得有点C语言的基础。C++有时用一用,但不影响你学习本章内容。并且我假定你已经读过了上一章内容“Windows编程基础”。我还是用Microsoft Visual C++的编译器,怎么样?出发吧!
☆ 资源脚本
在进行细节之前,我们要先搞懂怎样要编译器知道它所要编译的资源类型。方法是使用称之为资源脚本的特殊文件,它是一个简单的文本文件,可以手工编辑,也可以让Visual C++自动编辑,或者你用其它的自动编辑器编辑。无论如何,资源脚本文件要有一个.rc的扩展名。大多数的脚本文件都从定义资源行开始,最简单的资源行通常要用到资源类型,就像这样:
[identifier] [resource type] [filename]
【标识符】 【资源类型】 【文件名称】
标识符可以用两种方式表示:一种是能表示资源意思的字符串,另一种是在资源相对应的头文件中用#define定义过的数字常量。如果你选择数字常量,这通常是一个好主意,别忘了把相应的头文件加入到你的资源脚本。资源脚本使用C语言风格的文件格式好像比较容易理解。以下是一个比较简单的资源脚本实例:
#include "resource.h"
// icons
ICON_MAIN ICON myicon.ico
// bitmaps
IMG_T......
游戏编程起源(初学者)Ⅱ(2006-01-25 15:59:00)
摘要:☆ 创建窗口
好消息,创建窗口你所要做的只是调用一个CreateWindowEx()函数。坏消息是,这个函数有好多的参数。嘿!把刀放下,有话好说吗!真的不难,做事情总得走走形式嘛!以下是函数原形:
HWND CreateWindowEx(
DWORD dwExStyle, // extended window style
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu, or chil......
游戏编程起源(初学者)Ⅰ(2006-01-25 15:56:00)
摘要:前言
这是一部非常棒的初学者入门游戏编程教材。虽然目前3D游戏大行其道,但是对于想急切入门的初学者来说2D游戏的编程是最好的开始,因为它屏蔽了繁杂的数学理论,同时又给于了初学者一些游戏编程的概念。当然如果你选择3D游戏开发为起步,那也不是一件坏事。就像初学C语言和C++语言时的选择一样。开始学习这游戏编程教材前,首先得学会C++/C的一些必要语句用法,对编程语言的熟练程度直接影响到你写出的代码的质量。
你还在用TC么?那么请你马上仍掉它吧,现在开始下面的教材里都是在VC中编写和编译的。如果你对VC很陌生,没关系它很友善,而且你也只需知道一点小小的操作即可以开始你的游戏编程之旅。在此祝你旅途愉快。
原著作者的邮箱:ironblayde@aeon-software.com 要用英文给作者发信哦!
原著作者的ICQ:53210499
【译:傻马乱踢:howsee@163.com】
【水平有限,诚心一片◆傻马乱踢】
★第一章 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在......