角色扮演游戏引擎的设计原理



游戏引擎原理

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

2角色扮演游戏制作

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

()开发工具和主要技术

1.件开发工具

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

2.DirectX组件知识

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

3.AlphaBlend技术

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

4.A*算法

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

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

( 2)游戏具体制作

1.地图编辑器制作

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



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

2.游戏模块划分

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

:消息处理系统

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

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

2:场景显示及行走系统

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

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

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

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

voidMessageLoop(Msg)//消息循环
{
 switch(Msg)
 {
  charAddressName[16];//AddressName[16]用来存储主角所在地点名称
  ADDRESS001://由ADDRESS值决定场景值(出门)
  ScreenX=12;ScreenY=0;//化游戏背景位置
  Hero.x=360;Hero.y=80;//主角坐标
  Move;//主角移动
  //以下用来显示主角所在地点
  sprf(AddressName,\"下幅游戏场景名称\");
  PrText(lpDDSPrimary,280,330,AddressName,RGB(255,255,255));//在屏幕上显示出场景名称
  ;
 }
}

3:打斗系统

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

Tags: 

延伸阅读

最新评论

发表评论