浅析游戏引擎开发

1  引言
电脑游戏作为一种娱乐方式越来越为人们所接受。即时通讯开发对于电脑游戏来说, 游戏引擎是用于控制游戏功能的
主程序, 如接受玩家控制信息的输入, 选择合适的声音以合适的音量播放等。2D 游戏或者3D 游戏, 不管游
戏是怎样的形式(是角色扮演游戏、即时策略游戏、冒险解谜游戏或是动作射击游戏) 都有类似的起控制作
用的代码。游戏引擎相当于游戏的框架, 框架打好后, 关卡设计师、建模师、动画师可往里填充内容。
2  需求分析
游戏引擎是一个很复杂的系统, 在这个设计中主要涉及到了以下几项功能:
(1) 光影处理: 光影处理是用来处理游戏场景中光源对游戏中的人、地、物所影响变化的效果。
(2) 物理系统: 用于模拟现实生活中的物体物理运动的一个系统。
(3) 碰撞检测: 碰撞检测在游戏引擎中如此重要, 原因是现实生活中随处都有碰撞的发生。
(4) 画影成像: 这是游戏引擎一项必不可少的功能, 否则在游戏中将看不到游戏的图像。
(5) 输入与输出: 提供给玩家与游戏交互的功能, 这也是游戏与电影的区别。
3  系统设计
311  功能设计
作为一个游戏引擎, 它必须是可用的、稳定的、可维护的。它的主要功能有如下几点:
(1) 图像处理: 曲线绘制, 图像成像, 阴影生成, 粒子效果。
(2) 输入处理: 鼠标和键盘数据处理, 游戏文件装载, 脚本读取。
(3) 输出处理: 游戏信息输出, 玩家信息显示, 游戏存档建立, 音乐、音效输出, 图像输出。
(4) 游戏逻辑处理: 控制剧情发展, 控制人物移动, 控制画面显示。
312  结构设计
游戏引擎开发采用的是三层结构模型:
第一层是游戏引擎的基础, 它包括图像处理系统, 输入输出系统和音乐、音效系统。
第二层是接口层, 设定上层与底层的访问接口。
采用接口技术的好处就是更新底层实现的时候, 只要接口不被修改, 那么就不需要改动上层代码, 实现
系统层次化结构提高了系统的可维护性与可重用性。
·55 ·
第三层是游戏工具库, 在这里提供了游戏开发的一些辅助工具, 主要是封装了一些对底层实现的操作。
它包括地图编辑器、脚本解析器、人物对话模块、角色类、NPC 类和物品类等等一些在游戏中用到的模块。
313  游戏引擎的IPO 图
图1  IPO 图
图2  引擎整体结构图
4  系统实现
411  引擎开发基础和开发环境配置
41111  引擎开发工具的选择
在本次开发游戏的引擎开发中, 我们使用DirectXSDK开发包与VC + + 610 编译器。
41112  游戏开发的核心知识
游戏开发需要多方面的知识, 它包括很多非计算机专业和计算机专业方面的知识。开发一个游戏引擎,
最基本的数据结构的知识是必不可少的, 如队列、堆栈、数组、链表、树、递归等等。
数字建模是数学的术语, 也是计算机游戏的术语。一般情况下游戏中的每一个对象, 人物、动物和植物
包括水、气体等非生物都要进行数字建模。
412  引擎图像子系统的实现
41211  采用图片拼接的方式来编辑地图, 将待绘页面分成n 个单元格, 在每个单元格中贴入我们想要的对
象部分, 贴入后设置该图块的属性。
41212  图像子系统的功能分析
需求: 实现2D 贴图、地图合成、序列动画、基本图形图像绘制、屏幕渲染、画面显示、粒子系统。
413  引擎的输入输出子系统与声音控制子系统
·56 ·
41311  输入输出方式
在windows 中获取鼠标和键盘信息是使用消息方式来获取的。在游戏中, 同样也是使用消息方式来获取
键盘和鼠标信息。因为, 游戏的输入不仅由用户来提供操作键盘和鼠标消息, 有时候比如在剧情发展的时
候, 需要虚拟键盘和鼠标消息来自动化游戏的进行; 有时我们要对键盘和鼠标的消息进行处理来实现一些效
果, 比如当鼠标移动到屏幕的边缘时, 我们要滚动地图。这样就必须实现实时的截获鼠标和键盘消息, 然后
处理。
41312  输入输出子系统的实现步骤
在这里使用的是DirectX 的DirectInput 库来完成输入消息截取的。游戏的运行过程大致可以分成擦除、
移动、绘制、等待、重复这几个步骤。
确定了在什么位置获取输入后, 接下来就要看具体的实现过程了。DirectInput 和DirectDraw 一样是虚拟
设备, 也就是说不管底层的硬件是如何实现的, 只要符合标准的接口, 都可以通过DirectInput 来获取输入。
DirectInput 的实现过程是Win32 应用程序→Direct 输入→HEL (硬件仿真层) 或HAL (硬件抽象层) →硬件设
备驱动→设备。理论上DirectInput 可以支持所有的输入设备如鼠标、键盘、游戏摇杆、方向盘、踏板等, 但
在本文中用到的只有键盘和鼠标, 所以只要获取键盘和鼠标消息即可。
下面是设置DirectInput 的基本步骤:
(1) 通过调用DirectInput8Create ( ) 来创建IDirectInput 接口, 返回值是IDirectInput8 接口。
(2) 查询设备的GUID
(3) 调用CreateDevice () 传递一个GUID : GUID SysKeyBoard 主键盘的GUID ; GUID SysMouse 主鼠标的
GUID。
(4) 设置设备的协作等级, 通过调用IDirectInputDevice8 : : SetCooperativeLevel () 来完成。
(5) 调用SetDataFormat () 来设置每一个设备的数据格式。
(6) 使用IDirectInputDevice8 : : SetProperty () 设置你想要的任何设备的性能。
(7) 调用IDirectInputDevice8 : : Acquire () 来获取设备, 即与设备关联。
(8) 调用IDirectInputDevice8 : : GetDeviceState () 来获取设备的数据, 在这里有两种方式实现数据采集方
式, 一是直接模式; 二是缓存模式。
41313  声音子系统实现的步骤
实现音乐和音效处理, 我们用到的是Directx 中的DirectSound 和DirectMusic 库。DirectSound 是控制音效
的, DirectMusic 是控制音乐播放的, 它是一种新的基于DLS 数据的实时音乐编排和回访技术。
操作DirectSound :
(1) 初始化DirectSound , 声明DirectSound 对象, 调用DirectSoundCreate ( ) 创建DirectSound 对象。
(2) 设定协作等级, 调用SetCooperativeLevel () 函数, DirectSound 一共有四个协作等级: 普通级、优先
级、排他级和Write Primary 级。
(3) 建立缓冲, 声明DirectSound 缓冲, 调CreateSoundBuffer () 来创建缓冲对象。
(4) 把声音写入缓冲, 锁定( Lock () ) 、写入、解锁( Unlock () ) 。
(5) 控制声音播放: 播放声音, 调用play () 函数; 停止播放声音, 调用stop () 函数; 控制音量, 调
SetVolume () 函数; 调整频率, 调用SetFrequency () 函数; 改变声道平衡, 调用SetPan () 函数。
414  游戏工具库开发
41411  地图编辑器与脚本解析器的概述
地图编辑器与脚本解析器是游戏开发的重要工具, 它们综合利用底层的操作来实现游戏开发过程中比较
高级的功能。
41412  地图编辑器的作用与功能介绍
地图编辑器主要的功能是创建、编辑和保存游戏场景地图文件。游戏场景地图一般分为三层结构, 地面
层、物体层、天空层。地面层是用来贴入游戏场景的最底层图片的, 如土地, 沙漠, 草地这些都可以归结到
·57 ·
地面层; 物体层在这里不单单是一层, 物体层可分为上层和下层, 上层的物体可以遮挡人物, 下层的物体可
以阻挡人物, 所以在设计中把人物定位在物体的下层; 天空层是用来作效果处理的, 如想实现天黑效果, 你
不得不在物体层的上面加上一张黑色图片。创建一张游戏场景地图主要有以下几个步骤: (1) 装载进入背景
图; (2) 显示背景图; (3) 在图上画出格子; (4) 在某一格子贴入确定的景物; (5) 设置景物属性; (6) 保
存地图
41413  地图编辑器技术实现
41414  脚本解析器技术实现
5  测试
在游戏引擎开发完之后, 游戏的创作就由设计师与美工来完成。首先, 创作游戏剧本, 确定了剧本之
后, 我们就要对剧本进行分镜处理, 确定在什么场景出现什么人物, 和什么样的人物有什么样的对话; 其
次, 使用地图编辑器来制作游戏场景地图; 最后, 编写游戏的脚本文件, 编写时要确定关卡和事件发生地
点, 人物对话就按分镜处理后的剧本就可以了。
6  结论
综上完成了一个通用的2DRPG游戏引擎的基本功能。该引擎的主要特点是采用了模块化设计思想来构
建引擎的底层程序, 因此该引擎具有较强的扩展性和可维护性。该引擎的工具库具有高度的可重用性, 只需
经过少许的改动就可以适应新格式地图的编辑。该游戏引擎是按照网络游戏引擎设计的, 所以游戏引擎可以
进一步的升级为一个网络游戏的引擎, 用于网络游戏客户端程序的开发。如果对引擎的底层图形系统进行优
化, 可以将引擎升级为215D 的引擎。本文限于篇幅部分环节省略, 部分程序代码没有给出。