做个RPG游戏主人翁(28)

软件世界

  一天,强健的阿志正在村里闲逛,突然被村中的阿King叫住。还未等阿志停下,阿King已经丢出了一堆任务。谁让阿志身强力壮呢,碍于情面,阿志只有硬着头皮接受了任务,开始了一个人的冒险之旅……

  从这期的连载开始,阿志就要带大家一快儿进入上面所叙述的冒险世界了。大家将详细了解如何从零开始开发一款基本的RPG游戏。使用的开发工具为:Visual C++.net2003和DirectX SDK 9.0。

  在第一篇里,阿志将带领大家从认识Windows窗体开始,到DirectDraw的应用,一步步为冒险之旅拉开序幕──创建属于自己的游戏启动界面。

  第一篇 拉开冒险的序幕

  一、游戏启动界面基础──空白窗口的创建

  游戏界面是如何建立的呢?其实先要创建一个独占桌面的窗口,再在窗口上印DirectDraw调用自己所需的图像,就有了属于自己的游戏界面了。但如何创建一个独占桌面的窗口呢?让我们接着往下看。

  我们在Windows里所看到的程序都是以窗口的形式出现在我们面前的。要创建Windows程序首先就要创建窗口。要创建一个窗口就要先创建一个窗口类,然后填写窗口类的各属性。填写完成后还要注册这个窗口类,注册成功后就可以创建这个窗口类的窗口对象了。而游戏中的窗口和普通的Windows桌面程序相比,主要的区别就是它独占了Windows桌面,将整个屏幕纳入了自己的处理范围。

  首先启动VC.net。单击菜单:文件→新建→项目。将打开“新建项目”对话框,在“项目类型”里选择“Visual C++ 项目”。在模板里选择“Win32 项目”(如图1)。输入名称“Win”,单击“确定”将打开“Win32 印程序向导”对话框。单击“印程序设置”,选中“空项目”(如图2)。单击“完成”。现在我们新建了一个空的Win32项目。

  然后在右边的“解决方案资源管理器”里右击“源文件”文件夹,在打开的快捷菜单里选择“添加→添加新项”,打开“添加新项”对话框,在“模板”里选择“C++ 文件”,输入文件名“Win”,单击“打开”便新建了一个Win.cpp源文件。

  现在我们可以尝试创建第一个Windows窗口了。将网上的代码输入(程序1,下载地址:http://www.cpcw.com/28/game11.txt),运行程序后,会得到一个蓝色的屏幕。别以为这是“蓝屏”,放心,不会死机的,我们只是把窗口的背景色设为了蓝色而已。

  程序重点结构解释

  整个程序的结构很简单:InitWindow()负责初始化、创建与显示窗口。先定义一个WNDCLASS结构的变量,给出窗口的各属性。然后用RegisterClass注册一个窗口类。再用CreateWindow()创建一个窗口。最后用ShowWindow()显示窗口,UpdateWindow()更新窗口。

  其中用到了Windows消息循环,示例代码如下:

  while(GetMessage(&msg,NULL,0,0))

  消息循环

  {

  TranslateMessage(&msg); //将msg结构传给Windows,进行一些键盘转换

  DispatchMessage(&msg); //又将msg结构回传给Windows,Windows将该消

  } //息发送给窗口函数WndProc,

  WndProc()是一个窗口函数,PostQuitMessge(0)传送一个退出消息。

  提示:Windows消息机制是Windows程序开发中事件的驱动机制,程序之间就依靠它传递消息。

  二、载入自己的画面──DirectDraw的印

  在使用DirectDraw之前,先要简单了解一下DirectX SDK。它是微软开发的一套专为编写游戏用的开发库,而DirectDraw是它的一个组成部分,主要是为二维游戏开发服务的。

  要使用DirectDraw,就先要安装Direct SDK。Direct SDK9.0可从网上下载(http://www.onlinedown.net/soft/13300.htm)。

  1.初始化DirectDraw

  DirectDraw是DirectX的一个重要组成部分,它负责2D方面的工作。要让DirectDraw为你做美工,首先�*跏蓟疍irectDraw后才能使用。初始化DirectDraw的工作只用做一次,以后就可以直接调用了。(初始化代码下载地址:http://www.cpcw.com/28/game12.txt)

  在初始化的程序中,InitDirectDraw()用来初始化DirectDraw,ClearDirectDraw()用来释放DirectDraw对象。

  2.在DirectDraw中调入和输出图像

  我们用DirectDraw的目的就是要利用它在程序中调入自己的游戏界面,DirectDraw中调入图像的原理参见图3。那么在完成了DirectDraw的初始化后,我们来看看如何利用它在建立的窗口上输入游戏画面。

  游戏中少不了的当然是图像。我们现在就来看看怎样把图像调入到普通页面。其实在DirectDraw中实现起来很简单,只要用DDReLoadBitmap(…)函数便行。DDReLoadBitmap(…)在ddutil.cpp中,要使用DDReLoadBitmap(…)就要先把ddutil.h和ddutil.cpp加入到我们的工程当中(ddutil.h和ddutil.cpp的下载地址:http://www.cpcw.com/28/ddu.rar)。方法如下:先把ddutil.h和ddutil.cpp放在我们的工程目录下,然后点击菜单的“项目→添加现有项”,选择工程目录下的ddutil.h和ddutil.cpp就行了。最后当然还要在程序中敲入“#include ”ddutil.h””。

  现在我们就可以使用DDReLoadBitmap(…)来调入BMP图像了,如下:

  DDReLoadBitmap(页面名,”图像名”);

  把图像调入之后,就要传送图像。

  下例是把lpDDSBack页面的rect矩形范围内的图像传送到lpDDSBuffer页面(坐标为(0,0))上,lpDDSBack没设置透明色:

  RECT rect;

  rect.top=0;

  rect.left=0;

  rect.right=300;

  rect.bottom=200;

  lpDDSBuffer->BltFast(0,0,lpDDSBack,&rect,NoKey);

  三、梦想起步──亲手打造启动界面

  有了前面创建Windows窗口和DirectDraw应用的基础,我们终于可以亲手打造自己的游戏启动界面了。

  首先要准备一幅背景图像和一幅鼠标图像。我准备的背景图像名为“Image.bmp”,大小为800×600;鼠标图像名为“mouse.bmp”,大小为22×22。

  先把准备好的两幅图像放入工程的目录中。为程序添加一个普通页面,这是用于鼠标图像的:

  LPDIRECTDRAWSURFACE7 lpDDS

  Mouse; //鼠标图像页面

  然后创建一个初始游戏的函数InitGame()。它负责游戏中所有的初始化工作,所以初始化DirectDraw也属于InitGame()的工作。我们把函数InitDirectDraw()放入InitGame()中,令程序的结构更加清晰。(单独完成DirectDraw初始化工作的程序代码下载地址:http://www.cpcw.com/28/game14.txt)

  程序重点结构解释

  InitGame()中要完成的工作为:

  1.创建背景页面和鼠标页面两个普通页面

  2.调入背景图像和鼠标图像

  3.设置鼠标图像的透明色

  在游戏的消息循环中的“刷新游戏页面”其实就是游戏程序主要工作的地方。我们添加一个函数RunGame(),它将在游戏的消息循环的“刷新游戏页面”的位置被调用。

  RunGame()的工作是:

  1.把背景页面的图像传送到后台缓存

  2.把鼠标页面的图像传送到后台缓存

  3.执行换页

  完整的程序代码下载地址:http://www.cpcw.com/28/game15.txt

  运行程序后的结果如图4:拥有了自己的游戏启动界面是不是让人很有成就感呢?

  本期程序下载地址:http://www.cpcw.com/28/game1.rar

  游戏开发工具的选择

  游戏开发除了VC++外,Delphi和VB也可以利用,但考虑到现在大多数游戏开发都会和硬件底层打交道,VC++就成为了现在游戏开发的主流工具。DirectX SDK是微软为在Windows平台上快速开发高质量的游戏程序所开发的开发库。因此,我们这次使用的开发工具就是Visual C++.net2003和DirectX SDK 9.0。

  Direct SDK在VC++中的安装

  下载SDK并安装后,并不是立刻就可以在VC++中利用它了,要想在VC++中利用SDK还要如下设置一番:

  启动VC.net,点击菜单:工具→选项。将会打开“选项”对话框,选择:项目→VC++目录。在“显示以下内容的目录”里选择“包含文件”,然后新建一个路径,例如你的SDK装在D盘的根目录下就输入目录为“D:\DXSDK\Include”。再在“显示以下内容的目录”里选择“库文件”,新建一个路径,输入“D:\DXSDK\Lib”。这里需要注意的是要把“D:\DXSDK\Include”和“D:\DXSDK\Lib”两个路径分别拉到路径列表的最上面。

  为了可以在我们的程序中使用DirectDraw,先用#include <ddraw.h>把ddraw.h包含到我们的程序中。然后把dxguid.lib,ddraw.lib,dxerr9.lib,winmm.lib加入工程中(如图5)。步骤如下:单击菜单:工程→属性。打开“属性页”对话框,选择“链接器(Link)→输入(Input)”选项卡,在“附加依赖项”输入框输入“dxguid.lib ddraw.lib dxerr9.lib winmm.lib”。输入方法是:输入完一个加一个空格再输入第二个。

  在游戏程序中常用到的API函数

  1.MessageBox(HWND hWnd,LPCTSTR lpText,LPCSTR lpCaption,UINT uType)

  显示一个消息窗口

  2.ShowCursor(bool)

  显示/隐藏鼠标图标,ShowCursor(TRUE)显示鼠标图标,ShowCursor(FALSE)隐藏鼠标图标。

  3.GetCursorPos(POINT*)

  取得鼠标的坐标,

  4.SetCursorPos(x,y)

  设置鼠标的坐标