角色扮演游戏引擎的设计原理
  角色扮演游戏(RPG)是深受广大游戏迷们喜爱的一种游戏, 它以独特的互动性和故事性吸引了无数的玩家。它向人们提供了超出现实生活的广阔的虚拟世界,使人们能够尝试扮演不同的角色,去经历和体验各种不同的人生旅程或奇幻经历。这些体验都是在现实生活中无法实现的。在玩过许多游戏后,许多玩家都不再仅仅满足于一个游戏玩家的身份,而会思考游戏是如何制作的,并且打算制作一个自己的游戏,网上的各种游戏制作小组更是如雨后春笋般涌现。下面我就给大家介绍一下角色扮演游戏引擎的原理与制作,希望能对游戏制作爱好者有所帮助。

一 游戏引擎的原理

  说到引擎,游戏迷们都很熟悉。游戏引擎是一个为运行某一类游戏的机器设计的能够被机器识别的代码(指令)集合。它象一个发动机,控制着游戏的运行。一个游戏作品可以分为游戏引擎和游戏资源两大部分。游戏资源包括图象,声音,动画等部分,列一个公式就是:游戏=引擎(程序代码)+资源(图象,声音,动画等)。游戏引擎则是按游戏设计的要求顺序的调用这些资源。

二 角色扮演游戏的制作

  一个完整的角色扮演游戏的制作从大的分工来说可以分为:策划,程序设计,美工,音乐制作以及项目管理,后期的测试等。
  策划主要任务是设计游戏的剧情,类型以及模式等,并分析游戏的复杂性有多大,内容有多少,策划的进度要多快等因素。
  程序设计的任务是用某种编程语言来完成游戏的设计,并与策划配合,达到预期的目的。
  美工主要是根据游戏的时代背景与主题设计游戏的场景及各种角色的图象。
  音乐制作是根据游戏的剧情和背景制作游戏的音乐与音效。
  项目管理主要是控制游戏制作的进程,充分利用现有的资源(人员,资金,设备等),以达到用尽量少的资金实现最大的收益。
  后期的测试也是非常重要的一个环节,对于一个几十人花费几个月甚至是几年时间制作的游戏,测试往往能找到许多问题,只有改进程序才能确保游戏的安全发行。
  由于文章主要是讲解游戏程序的制作的,所以策划,美工,音乐制作等方面请读者参考其它文章,下面我就讲讲游戏程序的设计。

(一) 开发工具与主要技术

1.件开发工具

  游戏程序开发工具有很多,在不同游戏平台上有不同的开发工具。在个人计算机上,可以用目前流性的软件开发工具,比如:C,C++,VC++,Delphi,C++ Builder等。由于Windows操作系统的普及和其强大的多媒体功能,越来越多的游戏支持Windows操作系统。由于VC是微软的产品,用它来编写Windows程序有强大的程序接口和丰富的开发资源的支持,加之VC严谨的内存管理,在堆栈上良好的分配处理,生成代码的体积小,稳定性高的优点,所以VC++就成为目前游戏的主流开发工具。

2.DirectX组件的知识

  谈到Windows系统下的游戏开发,我们就要说一下微软的DirectX SDK。
  Windows系统有一个主要优点是应用程序和设备之间的独立性。然而应用程序的设备无关性是通过牺牲部分速度和效率的到的,Windows在硬件和软件间添加了中间抽象层,通过这些中间层我们的应用程序才能在不同的硬件上游刃有余。但是,我们因此而不能完全利用硬件的特征来获取最大限度的运算和显示速度。这一点在编写Windows游戏时是致命的,DirectX便是为解决这个问题而设计的。DirectX由快速的底层库组成并且没有给游戏设计添加过多的约束。微软的DirectX软件开发工具包(SDK)提供了一套优秀的应用程序编程接口(APIs),这个编程接口可以提供给你开发高质量、实时的应用程序所需要的各种资源。
  DirectX的6个组件分别是:
    DirectDraw: 使用页面切换的方法实现动画,它不仅可以访问系统内存,还可以访问显示内存。
    Direct3D: 提供了3D硬件接口。
    DirectSound: 立体声和3D声音效果,同时管理声卡的内存。
    DirectPlay: 支持开发多人网络游戏,并能处理游戏中网络之间的通信问题。
    DirectInput: 为大量的设备提供输入支持。
    DirectSetup: 自动安装DirectX驱动程序。
  随着DirectX版本的提高,还增加了音乐播放的DirectMusic。

3.AlphaBlend 技术

  现在许多游戏为了达到光影或图象的透明效果都会采用AlphaBlend 技术。所谓AlphaBlend技术,其实就是按照"Alpha"混合向量的值来混合源像素和目标像素,一般用来处理半透明效果。在计算机中的图象可以用R(红色),G(绿色),B(蓝色)三原色来表示。假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,设B图象的透明度为alpha(取值为0-1,0为完全透明,1为完全不透明),Alpha混合公式如下:
    R(C)=alpha*R(B)+(1-alpha)*R(A)
    G(C)=alpha*G(B)+(1-alpha)*G(A)
    B(C)=alpha*B(B)+(1-alpha)*B(A)
  R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。应用Alpha混合技术,可以实现游戏中的许多特效,比如火光、烟雾、阴影、动态光源等半透明效果。

4.A*算法

  在许多游戏中要用鼠标控制人物运动,而且让人物从目前的位置走到目标位置应该走最短的路径。这就要用到最短路径搜索算法即A*算法了。
  A*算法实际是一种启发式搜索,所谓启发式搜索,就是利用一个估价函数评估每次的的决策的价值,决定先尝试哪一种方案。如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:
    f(n) = g(n) + h(n)
  这里,f(n)是节点n的估价函数,g(n)是起点到终点的最短路径值,h(n)是n到目标的最断路经的启发值。由于A*算法比较复杂,限于篇幅,在此简单介绍一下,具体理论朋友们可以看人工智能方面的书籍了解详细的情况。

  其它技术还有粒子系统,音频与视频的调用,图象文件的格式与信息存储等,大家可以在学好DirectX的基础上逐渐学习更多的技术。

(二)游戏的具体制作

1.地图编辑器的制作

  RPG游戏往往要有大量的场景,场景中根据需要可以有草地,湖泊,树木,房屋,家具等道俱,由于一个游戏需要很多场景且地图越来越大,为了节省空间,提高图象文件的可重用性,RPG游戏的画面采用很多重复的单元(可以叫做“图块”)所构成的,这就要用到地图编辑器了。我们在制作游戏引擎前,要完成地图编辑器的制作。在 RPG游戏里,场景的构成,是图块排列顺序的记录。首先制定一个场景构成文件的格式,在这个文件里记录构成场景所需要的图块的排列顺序,因为我们已经为每个图块建立了索引,所以只需要记录这些索引就可以了。一个场景的构成,是分成几层来完成的:地面,建筑和植物,家具摆设,和在场景中活动的人物或者物体(比如飘扬的旗帜),按照一定的顺序把它们依次显示到屏幕上,就形成了一个丰富多采的场景。我们可以用数组来表示地图场景的生成过程。

MapData[X][Y]; //地图数据,X表示地图宽度,Y表示地图高度
Picture[num]; //道具的图片,num表示道具的总数
void MakeBackGround() //生成场景函数
{
 int n;
 for( int i=0; i<Y; i++) //共Y行
 for( int j=0; j<X; j++) //共X列
 {
  n=MapData[ i ][ j ]; //取得该位置的道具编号
  Draw( j*32, i*32, Picture[n]); //在此位置(j*32,i*32)画道具
 }
}

2.游戏的模块的划分

  游戏按功能分为:消息处理系统、场景显示及行走系统、打斗系统三大主要部分。其中又以消息处理系统为核心模块,其余部分紧紧围绕它运行。

一:消息处理系统

  消息处理系统是游戏的核心部分。游戏用到的消息处理系统先等待消息,然后根据收到的消息转到相应的函数进行处理。比如:主角碰到敌人后,我们就让程序产生‘打斗消息’,消息处理系统收到这个消息后就会马上转到打斗模块中去。消息处理的大体框架如下:

//定义程序中要用到的变量
DWORD Message; //消息变量
WinMain() //进入程序
{
 初始化主窗口;
 初始化DirectDraw环境,并调入程序需要的图形、地图数据;
 while( 1 ) //消息循环
 {
  switch( Message )
  {
   case 行走消息: 行走模块();
   case 打斗消息: 打斗模块();
   case 事件消息: 事件模块();
  }
 }
}

二:场景显示及行走系统

  作为RPG游戏,其所有事件的发生几乎都是和场景有关,例如:不同的地方会碰到不同的敌人、与不同的人对话得知不同的事情等。鉴于这部分的重要性,我们可再将它划分为:背景显示、行走 和 事件发生 三个子模块,分别处理各自的功能。下面进行具体分析。

(一)背景显示
  程序运行后,先读取前面地图编辑器制作的场景所需要的图块的排列顺序,按照排列顺序将图象拼成一个完整的场景,一般做法是:在内存中开辟一到两个屏幕缓存区,事先把即将显示的图象数据准备在缓存区内,然后一次性搬家:把它们传送到真正的屏幕缓冲区内。
  游戏用到的图片则事先制作好并存于另外的图形文件中。地图编辑器制作的场景文件仅仅是对应的数据,而不是真正的图片。在游戏中生成场景就是地图编辑的逆过程,一个是根据场景生成数据,而另一个是根据数据生成场景。

(二)行走
  要让主角在场景中行走,至少要有上、下、左、右四个行走方向,每个方向4幅图(站立、迈左腿、迈右腿、迈左腿),如图:游戏中一定要将图片的背景设为透明,这样在画人物的时候就不会覆盖上背景色了(这一技术DirectDraw中只要用SetColorKey()函数将原图片背景色过滤掉就行了)。我们让主角位置不动,而使场景移动,即采用滚屏技术来实现角色在场景上移动。这样角色一直保持在屏幕的正中间,需要做的工作只是根据行走方向和步伐不停变换图片而已。行走时的障碍物判断也是每一个场景中必定要有的,有一些道具如树木、房屋等是不可跨越的。对此我主要用一个二维数组来对应一个场景,每一个数组值代表场景的一小格(见图3)。有障碍的地方,该数组的对应值为1,可通过的地方的值为0。

(三)事件发生
  事件发生原理就是把相应事件的序号存储在地图的某些格子中,当主角一踏入这个格子就会触发对应事件。例如:在游戏开始时,主角是在他的家里。他要是想出去的话,就需要执行场景切换这个处理函数。我们假定该事件的编号为001,那么在地图上把家门外路口处的格子值设为001。这样主角走到路口时,编号为001的场景切换函数就会被触发,于是主角便到了下一个场景中。程序具体如下:

void MessageLoop( int Msg ) //消息循环
{
 switch( Msg )
 {
  char AddressName[16]; //数组AddressName[16]用来存储主角所在地点的名称
  case ADDRESS == 001: // 由ADDRESS的值决定场景值(出门)
  ScreenX=12; ScreenY=0; //初始化游戏背景位置
  Hero.x=360; Hero.y=80;//主角坐标
  Move();//主角移动函数
  //以下程序用来显示主角所在地点
  sprintf(AddressName,"下一幅游戏场景的名称");
  PrintText(lpDDSPrimary, 280, 330,AddressName , RGB(255,255,255));//在屏幕上显示出场景的名称
  break;
 }
}

三:打斗系统

  绝大多数的RPG都是有战斗存在的,因此,打斗系统就成为RPG系统中很重要的一环。有不少RPG游戏采用回合制打斗方式,因为实现起来较为简单。和打斗紧密相关的是升级,通常在一场战斗结束后,主角的经验值都会增加。而当经验值到达一定程度时,角色就升级了。
  上面我简要的介绍了角色扮演游戏的制作,由于写这篇文章的目的是让读者对角色扮演游戏的制作有一个基本的了解,所以读者朋友们可以研究相关资料。

3D游戏引擎设计与实现(5)
今天终于实现了UI的显示,但还是比较初步的,已经可以显示按钮在窗口上,还没有添加事件响应,不过也会很快实现的.到此,基本上UI方面没有什么大的问题,还要解决输入法方面问题,因为在游戏中可能要输入中文,让所有游戏玩家可以相互聊天.
         接着下来,就是全部写UI部份,然后再写好窗口模式和全屏模式的相互转换,还要检查设备是否丢失等等.在写查找3D设备显示模式时的代码,还是非常的傍大.经过一个晚上不断地努力,总算实现出来了.
         到目前为止,这个3D引擎可以显示基于纹理的UI.还有很多东西在后面,还需要不断地努力.

3D游戏引擎设计与实现(6)
经过几天编写,3D游戏引擎的架构代码大体架构已经搭好。

       下面来每个模块说明:
l          加载程序
Engine/MM3DMain.exe
l          DLL管理模块
Engine/bin/MM3DRun.dll
l          引擎管理模块
Engine/bin/MM3DEngine.dll
l          UI模块
Engine/bin/MM3DGameUI.dll
l          渲染模块
Engine/bin/MM3DRender.dll
l          文件管理模块
Engine/bin/MM3DFileSystem.dll
l          游戏逻辑功能模块
Engine/bin/MM3DGame.dll
l          游戏AI功能模块
Engine/bin/MM3DGameAI.dll
上面就是每个模块的DLL,分别实现相应的功能和接口,所有DLL都是通过接口来实现对外功能。已经可以让程序运行起来,创建了基于窗口的模式。
3D游戏引擎设计与实现(7)
       昨天在调试代码时,发现大量占用CPU资源,不知那里出什么问题,这个可以真是无从下手,正在苦脑时,突现发现,为什么不用帧速率来看看显示了多少帧。接着下来就添加帧速率上去,在调试时输出,发现每秒钟只有2到5帧,为什么会这么少的呢?又要从哪里下手去找出为什么这么慢的原因。只能用最笨的办法了,首先查看设备类型,因为它决定主要因素。接着去创建D3D设备的函数里调试,发现创建设备类型的参数是REF,就是使用标准设备,用软件模拟的,心里想:不慢才怪呢。所有东西都是用软件实现。原因肯定是在这里了,接着就跟踪为什么不能创建HAL类型的设备。最后找到了原因,就改正过来,结果显示到60多帧了。总算解决了一个问题。
       在调试窗口与全屏模式时,也经常出现调试程序和VC死锁问题,看来这种切换是不能单步调试,只能写LOG实现调试了。
3D游戏引擎设计与实现(8)
      

3D游戏引擎设计与实现(9)
游戏的地图文件格式是非常重要的一种格式,设计得好与坏,都关系到读写和渲染速度。如果保存的信息过少,就会导致渲染时花费大量的时间在计算。就目前主流的3D游戏,都会用这种思想:就是能预先计算的东西,就要先计好,不是在游戏中实现计算。比如用BSP树来保存冲突检测,保存可见性等,都是为了提高渲染速度。
       在CS的BSP文件格式中也是这样的,先计算好所有场境的BSP数据,这样就可以快速渲染。起先我还不知道什么叫BSP,就得赶紧去学习什么叫BSP。看看那本计算机图形学原理的书,原来只是用来保存面的可见性。BSP就是Binary Space Partition(ing)。这个文件里除了保存BSP树的数据外,还有使用到的纹理信息,模型信息等。
3D游戏引擎设计与实现(10)
<iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-8561492367794229&dt=1188963425109&lmt=1188963425&prev_fmts=160x90_0ads_al_s&format=336x280_as&output=html&correlator=1188963424890&url=http%3A%2F%2Fdev.zhishiku.com.cn%2Fgamedev%2F4107.shtml&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=000000&color_border=FFFFFF&ad_type=text_image&ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dgb2312%26bs%3D3D%25D3%25CE%25CF%25B7%25D2%25FD%25C7%25E6%25C9%25E8%25BC%25C6%25D3%25EB%25CA%25B5%25CF%25D69%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3D3D%25D3%25CE%25CF%25B7%25D2%25FD%25C7%25E6%25C9%25E8%25BC%25C6%25D3%25EB%25CA%25B5%25CF%25D610%26ct%3D0&cc=49&ga_vid=36960212.1188963425&ga_sid=1188963425&ga_hid=1006124554&flash=9&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency">      经这几天的努力,已经把UI,D3D设备管理完成了,接着要开始写其它部份。要写哪部份才更好呢?我想肯定是先考虑怎么样渲染世界里所有的物品。要渲染物品得确定使用什么模型文件。现在可以选择的有好几种格式,第一种最方便的,应是用X的文件格式,因为D3D已经把它完全封装好。第二种是使用MDL文件格式,就是HL的格式。第三种就是QUAKE3使用MD3的格式。其实每种格式都有自己的优点和缺点,就看着自己喜欢用那种格式,看起来还是比较难选择的。
     经过不断地考虑,想试着使用MDL的文件格式。因为我没有美工,至少可以拿当前的CS的资源来实现一下,比较现实一点。    
     目前暂时不考虑加载的资源的内存管理方面,先实现加载模式文件作为第一步,然后再考虑怎么样显示这些物体在场境里。说到场境,主要分为两大类:室内和室外。每种场境都要分开来实现,室内场境比较好实现,因为就是在一个四方体的盒里,粘贴上不同的纹理来实现。室外的就比较麻烦,因为要有天空,树木,花草以及地表。
     今天身体不大舒服,有点发热,可能要过几天才写这个了。

角色扮演游戏引擎的设计原理相关推荐

  1. 角色扮演游戏引擎的设计原理--转自MOVE2008

    角色扮演游戏引擎的设计原理--转自MOVE2008 角色扮演游戏引擎的设计原理 角色扮演游戏(RPG)是深受广大游戏迷们喜爱的一种游戏, 它以独特的互动性和故事性吸引了无数的玩家.它向人们提供了超出现 ...

  2. RPG游戏引擎的设计原理

    角色扮演游戏(RPG)是深受广大游戏迷们喜爱的一种游戏, 它以独特的互动性和故事性吸引了无数的玩家.它向人们提供了超出现实生活的广阔的虚拟世界,使人们能够尝试扮演不同的角色,去经历和体验各种不同的人生 ...

  3. 高性能游戏服务器架构设计,一种高性能大型多人在线角色扮演游戏服务器架构设计.doc...

    一种高性能大型多人在线角色扮演游戏服务器架构设计 一种高性能大型多人在线角色扮演游戏服务器架构设计摘要:大型多人在线角色扮演游戏(Massively Multiplayer Online Role P ...

  4. 角色扮演游戏(RPG)-------之谈

    角色扮演游戏(RPG)是深受广大游戏迷们喜爱的一种游戏, 它以独特的互动性和故事性吸引了无数的玩家.它向人们提供了超出现实生活的广阔的虚拟世界,使人们能够尝试扮演不同的角色,去经历和体验各种不同的人生 ...

  5. 《物质世界 (Outward)》证明不必压缩制作大型角色扮演游戏的时间

    <物质世界>是一款雄心勃勃的开放世界角色扮演游戏 (RPG),设计这款游戏的公司规模只有您预期的三分之一.游戏中的一切都是动态的,拥有许多炫酷的系统设计,大家可以分屏合作掌控整个场景.参与 ...

  6. 《剑与电——角色扮演游戏设计艺术》读书笔记(二)

    第6章 它是活的!!!活的!!让玩你游戏的人感到震惊 游戏剖析:1.游戏至少需要包含两个玩家.因为一个角色扮演游戏总是需要一些反对的力量去积极地对抗玩家.没有反对就没有斗争,而没有斗争你所拥有的就不是 ...

  7. 核爆rpg手机版_好嗨游戏:不玩吃亏 ,20款全世界最佳移动RPG角色扮演游戏(上)...

    文章首发于:好嗨游戏 RPG(角色扮演游戏)毫无疑问是有史以来最好的游戏类型了,它也是兼容性最好的游戏类型,可以和其他各种类型结合形成新的有趣的游戏,比如在MOBA游戏中融入RPG的元素,同时它也比其 ...

  8. 《Android 游戏开发大全(第二版)》——6.4节角色扮演游戏

    本节书摘来自异步社区<Android 游戏开发大全(第二版)>一书中的第6章,第6.4节角色扮演游戏,作者吴亚峰 , 于复兴 , 杜化美,更多章节内容可以访问云栖社区"异步社区& ...

  9. JAVA 实现《模式策略的角色扮演游戏》游戏

    前言 <模式策略的角色扮演游戏>游戏是自制的角色扮演游戏.选择两个角色,然后进行PK,可用来学习JAVA的接口,继承和多态. 主要设计 事先设计好英雄,血量和相关技能. 为了让玩家能与程序 ...

最新文章

  1. 深度学习在机器人视觉中的局限与优势(综述)
  2. DFT-软件篇 from 陈新武
  3. MFC中小笔记(三)
  4. [转]PHP程序61条面向对象分析设计的经验原则
  5. 双线性插值理论与代码实例
  6. 知识点025-服务器的基础优化脚本
  7. mysql关联力控_力控软件和三菱PLC的通讯模块通讯设定
  8. 惠普103a微信打印服务器,惠普发布微信打印小程序,丰富云打印解决方案
  9. mumu模拟器命令安装apk
  10. Node.js 网页瘸腿稍强点爬虫再体验
  11. 富文本编辑器ueditor——找不到ueditor.all.js以及ueditor.all.min.js文件
  12. 【大厂面试】面试官看了赞不绝口的Redis笔记(三)分布式篇
  13. strut2框架搭建
  14. android:kotlin语言开发再也不用findViewById与ButterKnife
  15. java android studio 安卓开发 - 使用java发送邮件
  16. Legacy Code Tool
  17. 【离散椭圆弧】将椭圆弧按弧长等分为一定数量弧上点
  18. 《JAVA 中的 -> 是什么意思?》
  19. Python爬虫练习 爬取网络小说保存到txt
  20. antv-x6 vue流程图编辑器demo

热门文章

  1. 如何修复硬盘坏道(360)
  2. 初识CityEngine
  3. stm32中cubmx+keil+proteus+虚拟串口+串口助手的使用
  4. 简单实现并查集(基于数组和基于树)
  5. 微信小程序:全局状态变量的使用
  6. Python自动化运维之一(Python入门)
  7. 移动端点击加qq好友和加入qq群
  8. 同款蓝牙耳机为什么会串联_蓝牙耳机凭什么成网红明星标配时尚单品?揭秘三大原因...
  9. UnicodeMath编码教程(转载)
  10. 什么情况下产品要做CQC认证