您的位置:首页 > 其它

游戏开发简单流程1(转贴)

2006-02-03 12:51 330 查看

一、游戏启动界面基础

游戏界面是如何建立的呢?其实先要创建一个独占桌面的窗口,再在窗口上应用DirectDraw调用自己所需的图像,就有了属于自己的游戏界面了。但如何创建一个独占桌面的窗口呢?
首先启动VC.net。点击“文件→新建→项目”菜单命令。将打开“新建项目”对话框,在“项目类型”里选择“Visual C++ 项目”。在模板里选择“Win32 项目”。
输入名称“Win”,点击“确定”将打开“Win32 应用程序向导”对话框。点击“应用程序设置”,选中“空项目”。点击“完成”。现在我们新建了一个空的Win32项目。
然后在右边的“解决方案资源管理器”里右击“源文件”文件夹,在打开的快捷菜单里选择“添加→添加新项”,打开“添加新项”对话框,在“模板”里选择“C++文件”,输入文件名“Win”,点击“打开”便新建了一个Win.cpp源文件。
现在我们可以尝试创建第一个Windows窗口了。运行程序后,会得到一个蓝色的屏幕。
整个程序的结构很简单: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,就先要安装DirectSDK。Direct SDK 9.0可从网上下载(http://www.onlinedown.net/soft/13300.htm)。

1.初始化DirectDraw

DirectDraw是DirectX的一个重要组成部分,它负责2D方面的工作。要让DirectDraw为你做美工,首先要初始化DirectDraw后才能使用。初始化DirectDraw的工作只用做一次,以后就可以直接调用了。
在初始化的程序中,InitDirectDraw()用来初始化DirectDraw,ClearDirectDraw()用来释放DirectDraw对象。

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

我们使用DirectDraw的目的就是要利用它在程序中调入自己的游戏界面。那么在完成了DirectDraw的初始化后,如何利用它在建立的窗口上输入游戏画面。
游戏中少不了的当然是图像。我们现在就来看看怎样把图像调入到普通页面。其实在DirectDraw中实现起来很简单,只要用DDReLoadBitmap(…)函数即可。DDReLoadBitmap(…)在ddutil.cpp中,要使用DDReLoadBitmap(…)就需要先把ddutil.h和ddutil.cpp加入到我们的工程当中,方法如下:
先把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()中,令程序的结构更加清晰。InitGame()中要完成的工作为:
创建背景页面和鼠标页面两个普通页面;
调入背景图像和鼠标图像;
设置鼠标图像的透明色。
在游戏的消息循环中的“刷新游戏页面”其实就是游戏程序主要工作的地方。我们添加一个函数RunGame(),它将在游戏的消息循环的“刷新游戏页面”的位置被调用。RunGame()的工作是:
把背景页面的图像传送到后台缓存;
把鼠标页面的图像传送到后台缓存;
执行换页。

四、了解冒险世界的构成

说起RPG游戏,相信大家都还记得经典的《仙剑奇侠传》和很受欢迎的《轩辕剑》系列吧。游戏中庞大美丽的场景一定给大家留下了深刻的印象。
大家也多少听说过地图编辑器这东西吧?游戏中的场景可以由地图编辑器创建后再在游戏中调入。所以地图编辑器的核心作用就是创建游戏中的场景。现在,就让我们来逐步解读这个冒险世界是如何构成的。

1.场景的组成

简单地讲,场景通常由地面(如草地、泥路),物体(如树木、房子)和生物(如人类、动物、怪兽)所组成。
我们通常把场景分成若干单元格,方便于场景的管理。例如,我们可以把整个场景分成若干个32×32像素的单元格。每个单元格就是场景中的一个坐标。
场景的结构可简单定义为:
struct MapStruct{
char m_chMapName[32]; //场景名称
int m_nMapWidth;  //场景宽度,以单元格为单位
int m_nMapHeight; //场景高度,以单元格为单位
int m_nRoleCount; //场景中的人物个数
RoleStruct m_rolestruct[64]; //角色结构,一个场景最多可以有64个角色
TitleStruct m_titlestruct[256][256];
//单元格结构,一个场景最多可由256×256的单元格组成
};
其中,RoleStruct是角色结构,指明了一个场景中可以容纳的角色数量。TitleStruct是单元格结构,结构内容包括此单元格可否有障碍物,有没有物体,物体的ID等信息。

2.构造地块

场景的地面是由若干个图块组成。在游戏中的场景通常由许多不同类型的图块组成(如水、土地、木板等)。我们可以把这些组成场景地面的图块称为地块。因为游戏中有多种不同类型的地块,所以要为地块定义一个结构,例如,让场景知道哪个坐标的单元格该铺哪种类型的地块。
每在一个单元格铺一块地块,该单元格的结构变量就会记录该地块的ID号。场景就是以单元格结构信息里的地块ID号来铺设各种类型的地块。

3.添加物体

只有地面的场景还是一个单调的世界,我们要在场景上添加一些树木、房子、小山等物体来让世界丰富起来。场景中可以有许多不同类型的物体,需要为物体定义一个结构,用以记录各种物体的属性,当然包括确定该物体的ID值。当在场景的某单元格添加一个物体时,该单元格就记录添加物体的ID值,同时该单元格也就成了一个障碍,人物不能走到这个单元格。

4.实现遮蔽

当场景中的东西多起来的时候新的麻烦就来了。一个场景中有那么多的物体,那么多的角色,怎样合理地组织它们,让它们合理地显示在屏幕上,这是2D游戏中的一个难点。例如,当人物走在树的后面时,树就要遮挡住人物,当人物走在树的前面时则相反。这就要靠遮蔽来解决。下面我们来看看具体如何实现。
(1)遮蔽的原理
对于简单的场景我们可以把它分成3层:地面、物体、人物。而一般场景在调入时的顺序是先调出地面,再放入物体,最后把角色放入。放入角色的时候非常关键,要以人物相对于物体的位置做出合理的遮蔽。在讲解调入人物以前,先来看看如何在场景中调入物体。

上角为起始坐标(0,0),把一棵树放入场景中,其实“着地”的只有(2,5)这个坐标。放入场景时就只考虑把(2,5)这块放在场景的哪个单元格,放入时就是在该单元格中填入这棵树的ID号。如果只考虑这种情况,物体的结构为:
struct ObjectStruct{
char m_chObjectPic[32]; //物体图像的文件名
int m_nID; //物体ID值
int m_nX; //着地的X坐标(图中此值为2)
int m_nY; //着地的Y坐标(图中此值为5)
};

打框部分是这个房子的着地部分,这可不同于上一个物体只有一点着地。我们需要定义一个坐标数组把所有的着地坐标记录起来,还要把着地部分的左上角的坐标记录起来,这是物体的关键坐标。我们应该注意,将物体调入场景时就是把关键坐标Y值最小的物体先放入。所以我们需要修改前面的物体结构,我们把它改为:
struct ObjectStruct{
char m_chObjectPic[32];
int m_nID;
POINT m_nPos[64]; //记录了物体的着地坐标,最多可以有64个记录关键坐标
int m_nKeyX;
int m_nKeyY;
};
(2)放入人物,实现遮蔽
让我们先来看一幅图片。
图中打框部分是物体的遮蔽部分,也就是当有人物“踩”到这些坐标时就要被该物体遮蔽。为此,要在物体结构中加入遮蔽部分的坐标数组。
实现遮蔽具体方法如下:场景调入时,先放入地块,再放入物体。最后放入人物时就要检查人物是否“踩”到了某个物体的遮蔽部分。如果是,就要重新放入该物体。这样物体就可以遮挡住人物了。

五、打造冒险之旅的舞台

说了那么多,相信大家都手痒了,是不是想试一试亲手创造世界的滋味?好的,我们现在就开始动手!

1.设置地图大小

我们首先要选择“文件”菜单下的“新建”命令,打开“新建地图”对话框。
该对话框很简单,输入地图的名称、宽度和高度。点击“确定”按钮后,地图编辑视图变成了黑色,而且用线条划分好每个单元格。现在我们就可以在上面添加地块、物体等游戏元素了!
注意:这里的地图宽度和高度的单位不是“像素”,而是“单元格”。
在地图编辑器左边的“地图工具箱”里点击“添加地块”按钮,出现“添加地块”工具箱。
点击组合框的下拉按钮,选择一个地块,然后在地图编辑视图的任一单元格点一下就会在该单元格铺上你选择的地块了。这里没有删除地块的按钮,大家不要奇怪。当你想在某个单元格上换个地块时,只要选择新的一个地块,然后再点击那个单元格就可以替换原来的地块了。
小技巧:想拥有自己的个性地图吗?好说,如果你有兴趣可以在图像处理软件中设计地块图像(地块图像的大小要为32×32像素,要保存为BMP文件),设计好后放在地图编辑器的“floor”目录下。然后点击“导入地块”按钮,打开“导入地块”对话框,输入地块的图像名(需要加上后缀名“.bmp”)即可导入自己的地块。

2.在地块上添加物品

添加物体与添加地块的方法一样,点击左边“场景工具箱”的“添加物体”按钮,打开“添加物体”工具箱。点击组合框的下拉按钮,选择一个物体,然后就可以放入地图当中了。
物体的着地坐标、遮蔽坐标和关键坐标都已设置好了。点击“添加物体”工具箱的“删除物体”按钮可以删除掉上一次添加的物体。
我们同样也可以通过“添加物体”工具箱的“导入物体”按钮,用前面讲述的技巧方法来创建自己的个性物体。

3.使用角色编辑器

在地图中添加角色之前,先要把角色创建出来。在地图编辑器中集成了角色编辑器,点击“工具→角色编辑器”菜单命令,打开角色编辑器。

角色名字:如“阿King”
角色类型:游戏中的角色有很多种类型,如我们所扮演的主角,在游戏中给我们重要信息的NPC,还有处处为难主角的敌人。在“角色类型”中输入数字“0”代表创建的是游戏的主角,当然这里只能有一个主角;输入数字“1”代表创建的是NPC;输入数字“2”代表创建的是敌人。
关键坐标X:角色的脚底X坐标,也就是角色实际站在地图上的X坐标。
关键坐标Y:角色的脚底Y坐标。

角色图像名:图像必须放在“role”目录下。
图像宽度:角色图像的宽度。
图像高度:角色图像的高度。
单元宽度:角色图像中单个角色图像的宽度。
单元高度:角色图像中单个角色图像的高度。
角色属性:根据具体情况而定。
通过“工具”菜单下的“物品编辑器”命令就可以为主角创建物品了。为了方便和使游戏简单,这里我们不为每个角色都设一个物品箱,在游戏中只有一个主角的物品箱。在物品编辑器中创建的物品都是给主角使用的。

4.添加地图的出口

点击“场景工具箱”的“添加出口”按钮,打开“添加出口”工具箱。在添加出口工具箱中设置好从此出口将到达的目的地图名称(要输入全名,如“scene1.map”),到目的地图后主角应站在哪个坐标,还要设置主角的方向。设置好后在地图编辑器视图上点击一个单元格,然后点击“添加出口”工具箱的“添加”按钮,你选中的单元格就会成为一个出口。通常要设周围几个单元格为同一个出口,这样,才能方便玩家在一个合理的范围内找到出口。
当添加了一个出口后,“添加出口”工具箱的组合框就会出现在你添加的出口上。如果对添加的出口不满意,按“删除出口”按钮就可以删除该出口。

5.保存地图文件

当编辑好一幅地图后,就可以把它保存为地图文件了。点击“文件”菜单下的“保存”命令,打开“保存”对话框。要注意的是,保存的文件名要和创建地图时的地图名一样,地图文件要保存在“map”目录下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: