游戏图形化技术入门——掌握DirectX编程(上)
技术与开发
编者按:前面,大家学习了网络游戏的主流开发语言C++以及程序的灵魂——算法和数据结构。然后,我们也教会了大家如何让自己开发的游戏兼容Windows平台。从本期开始,我们进入网络游戏开发的实战阶段,首先我们从DirextX图形界面编程开始。
许多游戏开发的初学者都认为学习游戏图形编程就是要学习DirectX。其实不然,DirectX只是微软为了方便游戏开发而开发的一套游戏开发库,它包括了图形组件(Direct3D)、输入组件(DirectInput)、音频组件(DirectMusic)、网络组件(DirectPlay)等。但不使用DirectX我们也完全可以实现同样的功能,如图形方面可以使用OpenGL,网络方面可以使用WinSock。因此,首先要提醒大家的是,不要认为游戏图形编程只能依靠DirectX。但事实上, DirectX的确是一套很强大的游戏开发库。现在就让我们一起打开DirectX的大门吧!
硬件的“指挥官”——DirectX
DirectX处于应用程序与硬件之间。应用程序指的是我们开发的游戏,如果使用的是图形组件,硬件指的是显卡。我们指示DirectX要完成某个功能,如果硬件支持这个功能,DirectX会调用显卡驱动程序来完成(硬件加速)。如果硬件不支持这个功能,DirectX会使用软件模拟(软件模拟)。显然,软件模拟会比硬件加速慢很多。
DirectX其实是一些COM接口。也许你使用过DirectX,但从来不知道COM是什么。不用惊讶,是的,不懂得COM也完成可以使用DirectX。但如果你要深入了解DirectX就要学习COM的相关知识了。
1.Direct3D
现在,3D游戏已慢慢成为网络游戏的主流了。如著名的《魔兽世界》,炫丽逼真的3D游戏界面,吸引了千千万万的玩家。如果你正在想编写像《魔兽世界》般如诗如画的游戏界面,我不得不泼你的冷水,开发3D游戏并不是那么简单的!好在Direct3D已帮我们做了大量的工作,那样开发3D游戏就相对轻松很多了。Direct3D是我们下一篇的主题。
2.DirectInput
如果你玩过网络游戏,你一定对“左手按着键盘,右手握着鼠标”这两个动作很熟练。要控制游戏,DirectInput可以帮我们处理键盘鼠标的输入。不仅如此,DirectInput还可以处理操纵杆,实现有趣的力反馈。
3.DirectMusic
如果让你塞住双耳度过一天,相信你会很难受。同样,如果游戏里没有可以影响玩家情绪的音乐,就会显得相当的沉闷。国内著名的角色扮演游戏《仙剑奇侠传》,许多人认为它的成功百分之六十来自于它那些扣人心弦的音乐。DirectMusic在游戏开发中扮演着音乐演奏家这一重要角色。
4.DirectPlay
现在国内的单机游戏市场一片冷淡,这让笔者很失望。但不得不承认,网络游戏已取得压倒性的胜利,我们这系列文章的主题也是网络游戏。DirectPlay应用于网络传输,但早期的DirectPlay版本效率很低,以至于游戏开发者们都宁愿使用WinSock。DirectX8.0版开始,微软对DirectPlay整个模块都重新进行了构造,比起以前的版本有了很大的进步。
不可跳过的2D游戏开发
3D网络游戏已慢慢成为主流,我们还在讲2D的知识是不是太落后了呢?现在许多人都太过于急躁了,也许是3D游戏的魅力太大,以至于大多数初学者都想跳过2D这一环,直接学习3D游戏开发。其实我们学习2D游戏编程,主要是学习编程思路,学习游戏开发从2D游戏学起是一个很好的选择。而且,《梦幻西游》是一款很成功的2D网络游戏,不是吗?
DirectX中的DirectDraw应用于2D图形,我刚开始接触DirectX也是从DirectDraw开始的。可惜微软从DirectX8.0版开始便不再更新DirectDraw了,DirectDraw一直只停留在7.0版,不过不要紧,它依然可以工作得很好。我们在DirectX 9.0版中仍可以使用DirectDraw7.0。
1.双缓冲动画技术
也许你早已了解,所谓的动画,只是一些静态图片快速切换所做出来的视觉效果。应用于游戏,实现动画效果的一般方法是先清屏,在屏幕画上第1幅图像,再清屏画上第2幅图像,然后第3幅、第4幅……依此类推,人眼看上去就像是屏幕上的图像在“动”。但这样的动画难免会出现闪烁,这样的效果并不是我们想要的。
现在我们来看看DirectDraw是如何实现动画效果的。DirectDraw为我们准备了两张页面,一张是主页面,另一张称为后台页面。我们在屏幕上看到的永远只是主页面,而后台页面是不可见的。实现动画的原理是:先在后台页面画图像,然后把后台页面和主页面换回来,即原来的主页面成了后台页面,原来的后台页面成了主页面,这样在原来的后台页面画的图像就会显示在屏幕上。然后,又在现在的后台页面画图像,画好后又换页。如此循环下去就会产生顺畅的动画效果。由于是在后台页面画好了图像后才执行换页,所以不会产生闪烁。在DirectDraw中,称后台页面为后台缓存。
在游戏中实现动画效果时,除了主要用到的主页面和后台缓存外,还有一种页面叫做普通页面。它的作用是用于存放图像。基本上,是先把普通页面的图像传送到后台缓存,再执行换页操作。
DirectDraw实现动画的原理如图1:

2.应用DirectDraw
在开始使用DirectDraw前要做一些准备工作,这些准备工作看起来很烦琐,但只需要做一次,以后便可重复使用。
(1)创建DirectDraw对象
在使用DirectDraw前,必须先创建一个DirectDraw对象。下面是一个DirectDraw7对象,DirectDrawCreateEx函数用于创建DirectDraw对象。
LPDIRECTDRAW7 lpdd = NULL;
DirectDrawCreateEx(NULL,(void**)&lpdd,IID_IDirectDraw7,NULL);
DirectDrawCreateEx函数返回DD_OK表示DirectDraw对象创建成功。
(2)设置协作级
这里所说的设置协作级,是指设置我们的游戏与Windows的协作。游戏分为全屏模式与窗口模式。在全屏模式下,游戏占据了整个屏幕,我们是直接写到视频设备里的。而在窗口模式下,我们的游戏表现出来只是Windows桌面的一个窗口,这样DirectDraw必须更多地与Windows进行协作。
DirectDraw设置协作级使用的是SetCooperativeLevel函数。
HRESULT SetCooperativeLevel(HWND hwnd, DWORD dwFlags);
hwnd无疑就是我们游戏的窗口句柄,dwFlags是协作级标志,把游戏设置成全屏模式或窗口模式就是在这个值里设置相应的标志位。
(3)设置显示模式
设置好协作级后便可以设置游戏的显示模式了。DirectDraw为我们提供的SetDisplayMode()函数可以方便地设置游戏的分辨率和游戏以多少位的颜色显示。
HRESULT SetDisplayMode(
DWORD dwWidth, //设置显示模式的宽度
DWORD dwHeight, //设置显示模式的高度
DWORD dwBPP, //设置模式的颜色的位数
DWORD dwRefreshRate, //设置屏幕的刷新率,设为0表示使用默认值
DWORD dwFlags
);
(4)创建主页面与后台缓冲
做了那么多的工作,似乎DirectDraw还没有提供一块画板。还记得上面所说的双缓冲动画技术吗?DirectDraw的主页面便是显示在显示器的页面,如果你不使用双缓冲技术,在主页面画图会直接在显示器上显示出来。在创建主页面时可以指定是否使用后台缓冲,如果使用,成功创建主页面后,可以从中提取出后台缓冲页面。
(5)普通页面
DirectDraw除了主页面和后台缓冲之外,还有普通页面。普通页面主要用于存放游戏里用到的图像,如游戏背景和游戏角色。假设有一个游戏背景的普通页面和一个游戏角色的普通页面。先清空后台缓冲,然后把游戏背景图像传送到后台缓冲,再把游戏角色图像传送到后台缓冲,最后进行换页。这便完成了游戏里的一帧。
我没有给出相关函数的详细说明和全部的代码,我只是想让大家对DirectDraw有个感性的认识。如果有兴趣深入研究,我推荐《Windows游戏编程大师技巧(第二版)》这本书。
关键色
我们知道,图像文件都是以一个矩形存放的。但在游戏里的图像,如游戏角色,一间房子,一棵树,这些都不是矩形的形状。那么,如何把一个图像里的一些多余像素去掉呢?一种常用的技术是使用关键色,所谓的关键色,是指“不被显示出来”的颜色。如一棵树的图像,树以外的其他像素设置成一种特定的颜色值,在游戏中绘制这棵树时,如果像素点为这种特定的颜色值便不绘制出来。
图2是一个使用关键色的例子。

图像混合
在玩游戏的时候,很多时候我们会发现,当游戏角色走到一些遮挡物后面时,如走到一间房子后面。我们会发现这间房子好像有一个透视镜一样,角色半透明地显示出来。这是一种图像混合技术,在游戏当中应用得很广,图3是一个例子。

如要以50%的透明度混合两幅图像,混合出来的图像等于第一幅图像的颜色值乘以0.5加上第二幅图像的颜色值乘以0.5。
正确的学习途径
学习DirectX与2D游戏开发可以从书籍《Windows游戏编程大师技巧(第二版)》与国内知名游戏开发网站www.gameres.com中获得许多帮助。需要花一个月左右时间去了解DirectX与DirectDraw。当你有所了解后并不能说你就可以编写2D的角色扮演游戏(RPG)了。再深入学习,你会发现2D游戏并不是那么简单。如RPG游戏,游戏地图分为90度角与45度角,之中的算法很值得去研究。游戏角色在游戏场景里行走,遮挡算法是必需的。总的来说,学习2D游戏开发大概需要三个月的时间。
当对DirectDraw有所了解后,写一个小型的RPG游戏是很好的练习方法。
附:学习书籍推荐
《Windows游戏编程大师技巧(第二版)》
本书介绍了Windows下进行游戏编程所用到的各方面知识。包括了Win32编程、DirectX的基础知识、2D图形和算法、游戏编程技术和数据结构、多线程编程、人工智能,物理建模等。