电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

详述RPG游戏引擎的设计原理


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

一 游戏引擎的原理

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

二 角色扮演游戏的制作

一个完整的角色扮演游戏的制作从大的分工来说可以分为策划程序设计美工音乐制作以及项目管理后期的测试等

策划主要任务是设计游戏的剧情类型以及模式等并分析游戏的复杂性有多大内容有多少策划的进度要多快等因素

程序设计的任务是用某种编程语言来完成游戏的设计并与策划配合达到预期的目的

美工主要是根据游戏的时代背景与主题设计游戏的场景及各种角色的图象

音乐制作是根据游戏的剧情和背景制作游戏的音乐与音效

项目管理主要是控制游戏制作的进程充分利用现有的资源(人员资金设备等)以达到用尽量少的资金实现最大的收益

后期的测试也是非常重要的一个环节对于一个几十人花费几个月甚至是几年时间制作的游戏测试往往能找到许多问题只有改进程序才能确保游戏的安全发行

由于文章主要是讲解游戏程序的制作的所以策划美工音乐制作等方面请读者参考其它文章下面我就讲讲游戏程序的设计

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

.件开发工具

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

.DirectX组件的知识

谈到Windows系统下的游戏开发我们就要说一下微软的DirectX SDK

Windows系统有一个主要优点是应用程序和设备之间的独立性然而应用程序的设备无关性是通过牺牲部分速度和效率的到的Windows在硬件和软件间添加了中间抽象层通过这些中间层我们的应用程序才能在不同的硬件上游刃有余但是我们因此而不能完全利用硬件的特征来获取最大限度的运算和显示速度这一点在编写Windows游戏时是致命的DirectX便是为解决这个问题而设计的DirectX由快速的底层库组成并且没有给游戏设计添加过多的约束微软的DirectX软件开发工具包(SDK)提供了一套优秀的应用程序编程接口(APIs)这个编程接口可以提供给你开发高质量实时的应用程序所需要的各种资源

DirectX的个组件分别是

DirectDraw 使用页面切换的方法实现动画它不仅可以访问系统内存还可以访问显示内存

DirectD 提供了D硬件接口

DirectSound 立体声和D声音效果同时管理声卡的内存

DirectPlay 支持开发多人网络游戏并能处理游戏中网络之间的通信问题

DirectInput 为大量的设备提供输入支持

DirectSetup 自动安装DirectX驱动程序

随着DirectX版本的提高还增加了音乐播放的DirectMusic

.AlphaBlend 技术

现在许多游戏为了达到光影或图象的透明效果都会采用AlphaBlend 技术所谓AlphaBlend技术其实就是按照Alpha混合向量的值来混合源像素和目标像素一般用来处理半透明效果在计算机中的图象可以用R(红色)G(绿色)B(蓝色)三原色来表示假设一幅图象是A另一幅透明的图象是B那么透过B去看A看上去的图象C就是B和A的混合图象设B图象的透明度为alpha(取值为为完全透明为完全不透明)Alpha混合公式如下

R(C)=alpha*R(B)+(alpha)*R(A)

G(C)=alpha*G(B)+(alpha)*G(A)

B(C)=alpha*B(B)+(alpha)*B(A)

R(x)G(x)B(x)分别指颜色x的RGB分量原色值从上面的公式可以知道Alpha其实是一个决定混合透明度的数值应用Alpha混合技术可以实现游戏中的许多特效比如火光烟雾阴影动态光源等半透明效果

.A*算法

在许多游戏中要用鼠标控制人物运动而且让人物从目前的位置走到目标位置应该走最短的路径这就要用到最短路径搜索算法即A*算法了

A*算法实际是一种启发式搜索所谓启发式搜索就是利用一个估价函数评估每次的的决策的价值决定先尝试哪一种方案如果一个估价函数可以找出最短的路径我们称之为可采纳性A*算法是一个可采纳的最好优先算法A*算法的估价函数可表示为

f(n) = g(n) + h(n)

这里f(n)是节点n的估价函数g(n)是起点到终点的最短路径值h(n)是n到目标的最断路经的启发值由于A*算法比较复杂限于篇幅在此简单介绍一下具体理论朋友们可以看人工智能方面的书籍了解详细的情况

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

(二)游戏的具体制作

.地图编辑器的制作

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

MapData[X][Y] //地图数据X表示地图宽度Y表示地图高度

Picture[num] //道具的图片num表示道具的总数

void MakeBackGround() //生成场景函数

{

int n;

for( int i=; i<Y; i++) //共Y行

for( int j=; j<X; j++) //共X列

{

n=MapData[ i ][ j ]; //取得该位置的道具编号

Draw( j* i* Picture[n]); //在此位置(j*i*)画道具

}

}

.游戏的模块的划分

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

消息处理系统

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

//定义程序中要用到的变量

DWORD Message; //消息变量

WinMain() //进入程序

{ 初始化主窗口;

初始化DirectDraw环境并调入程序需要的图形地图数据

while( ) //消息循环

{ switch( Message )

{ case 行走消息: 行走模块();

case 打斗消息 打斗模块();

case 事件消息 事件模块();

}

}

}

场景显示及行走系统

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

(一)背景显示

程序运行后先读取前面地图编辑器制作的场景所需要的图块的排列顺序按照排列顺序将图象拼成一个完整的场景一般做法是在内存中开辟一到两个屏幕缓存区事先把即将显示的图象数据准备在缓存区内然后一次性搬家把它们传送到真正的屏幕缓沖区内

游戏用到的图片则事先制作好并存于另外的图形文件中地图编辑器制作的场景文件仅仅是对应的数据而不是真正的图片在游戏中生成场景就是地图编辑的逆过程一个是根据场景生成数据而另一个是根据数据生成场景

(二)行走

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

(三)事件发生

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

void MessageLoop( int Msg ) //消息循环

{switch( Msg )

{char AddressName[]; //数组AddressName[]用来存储主角所在地点的名称

case ADDRESS == : // 由ADDRESS的值决定场景值(出门)

ScreenX=; ScreenY=; //初始化游戏背景位置

Herox=; Heroy=;//主角坐标

Move();//主角移动函数

//以下程序用来显示主角所在地点

sprintf(AddressName下一幅游戏场景的名称);

PrintText(lpDDSPrimary Address>

break;}

}

打斗系统

绝大多数的RPG都是有战斗存在的因此打斗系统就成为RPG系统中很重要的一环有不少RPG游戏采用回合制打斗方式因为实现起来较为简单和打斗紧密相关的是升级通常在一场战斗结束后主角的经验值都会增加而当经验值到达一定程度时角色就升级了

上面我简要的介绍了角色扮演游戏的制作由于写这篇文章的目的是让读者对角色扮演游戏的制作有一个基本的了解所以读者朋友们可以研究相关资料

上一篇:Swing写的简单的计算器

下一篇:Map的一种遍历方式