浅析游戏引擎开发 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 的引擎。本文限于篇幅部分环节省略, 部分程序代码没有给出。