游戏引擎开发技术简析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2007年第8期福建电脑
游戏引擎开发技术简析
宋宇,谭浩
(电子科技大学计算机科学与工程学院四川成都610054)
【摘要】:该游戏引擎的开发技术主要使用的语言是C++,结合DirectX9开发包,并综合运用软件工程思想,人工智能,计算机图形学等知识。该引擎的主要工作是在游戏中进行碰撞运算,数字建模,物体成像,玩家的角色控制等等操作,以及处理音乐音效等必要的功能。
【关键词】:游戏引擎;DirectX开发包;地图编辑器;角色扮演
1.引言
作为一种大众的娱乐方式,电脑游戏已经越来越为人们所接受。而对于电脑游戏来说,游戏引擎是用于控制游戏功能的主程序,游戏引擎和游戏之间的关系就象一部汽车和汽车引擎之间的关系。不同型号的汽车可以采用相同的引擎,不同的游戏也可以采用相同的游戏,而且汽车的外型、材料、颜色都可以不同就象不同游戏有不同的人物模型和场景一样。游戏引擎实现诸如接受玩家控制信息的输入,选择合适的声音以及合适的音量播放等。不管是2D游戏还是3D游戏,不管是什么类型的游戏(角色扮演游戏<RPG>、即时战略游戏<RTS>、冒险解迷游戏<AVG>或是动作射击游戏<STG>)都有类似的控制作用代码。游戏引擎是整个游戏的框架,框架设计好之后,才能进行关卡设计动画设计以及建模等。
2.需求分析
经过不断的进化,如今的游戏引擎已经发展为一套由多个子系统共同构成的复杂系统,几乎涵盖了开发过程中的所有重要环节,在这个设计中主要涉及到了以下几项功能:
(1)光影处理:光影处理是用来处理游戏场景中光源对处在其中的人、物、地所影响变化的效果。
(2)碰撞检测:碰撞探测是物理系统的核心部分,它可以探测游戏中各物体的物理边缘。
(3)物理系统:用于模拟现实生活中的物体物理运动系统的一个系统。
(4)动画:如果没有动画功能,现在的游戏将会是枯燥的。
(5)渲染:渲染是引擎最重要的功能之一,渲染引擎在引擎的所有部件当中是最复杂的,它的强大与否直接决定着最终的输出质量。
(6)输入和输出:负责玩家与电脑之间的沟通,处理来自键盘、鼠标、摇杆和其它外设的信号甚至还有网络代码。
3.系统设计
3.1功能设计
作为一个游戏引擎,它必须是可用的,稳定的,可维护的。它的主要功能共有以下几点:
(1)图像处理:图像成像,曲线绘制,阴影生成,粒子效果。
(2)输入处理:鼠标和键盘数据处理,游戏文件装载,脚本读取。
(3)输出处理:游戏信息输出,玩家信息显示,游戏存档建立,音乐音效输出,图像输出。
(4)游戏逻辑设计:控制游戏剧情发展,控制人物移动,控制画面显示。
3.2结构设计
游戏引擎开发采用的是三层结构模型:
第一层是整个游戏引擎的基础,它包括图像处理系统,输入输出系统和音乐音效系统。
第二层是接口层,设定底层与上层的接口。
采用接口技术的好处是在更新底层实现的时候,只要接口不被修改,那么上层代码就不需要被改动,实现了系统层次化结构并提高了系统的可维护性和可重用性。
第三层是游戏工具库,在这里提供了游戏开发的一些辅助工具,主要是封装了一些对底层实现的操作。这些工具包括地图编辑器,脚本解析器,人物对话模块,Player类,NPC类以及物品类等等一些在游戏中用到的模块。
3.3游戏引擎的IPO图
图1IPO图
图2引擎整体结构图
4.系统实现
4.1引擎开发基础和开发环境配置
4.1.1引擎开发工具的选择
在本次开发游戏的引擎的开发中,我们使用DirectXSDKKit与VC++6.0编译器。
4.1.2游戏开发的核心知识
游戏开发需要很多方面的知识,这包括很多计算机专业以及非计算机专业方面的知识,如编程语言,数学基础,逻辑思维,文学功底,艺术修养等等。当然,开发一个游戏引擎,最基本的数据结构的知识是必不可少的,如堆栈,队列,树,数组,链表,指针等。
数学建模既是数学上的术语同时也是计算机游戏的术语。通常情况下游戏中的每个对象,人物、动物、房屋、植物包括水,光线,气体等都要进行建模。
4.2引擎图像子系统的实现
4.2.1可以采用图片拼接的方式来编辑地图,把待绘制页面
31
2007年第8期福建电脑
划分为n个单元格,在每个单元格中贴入我们需要的对象部分,并在贴入后设置该图块的属性。
4.2.2图像子系统的功能分析
需求:实现地图合成,2D贴图,序列动画,屏幕渲染,画面显示,基本图形图像绘制以及粒子系统。
4.3引擎的输入输出子系统与声音控制子系统
4.3.1输入输出方式
Windows中是使用消息方式来获取键盘和鼠标消息的。当然,在游戏中也是使用消息方式来获取键盘和鼠标消息。因为在有的游戏中,游戏的输入不仅由用户来提供操作键盘和鼠标消息,在剧情发展的时候需要虚拟键盘和鼠标消息来自动化游戏的进行,有时我们要对键盘和鼠标的消息进行处理来实现一些效果,比如当鼠标移动到屏幕的边缘时,要滚动地图。这样就必需实时的截获鼠标和键盘消息,然后处理。
4.3.2输入输出子系统的实现过程
在这里使用的是DirectX9的DirectInput库来完成输入消息截取的。游戏的运行过程大致过程可以分为擦除、移动、等待、重复这几个步骤。
确定了在什么位置获取输入以后,接下来就是具体的实现过程了。DirectInput和DirectDraw同样是虚拟设备,也就是说不管底层的硬件是如何实现的,只要是符合标准的接口,都可以通过DirectInput来获取输入。DirectInput的实现过程是Win32应用程序àDirectX输入àHEL(硬件仿真层)或者是HAL(硬件抽象层)à硬件驱动设备à设备。理论上DirectInput可以支持所有的输入设备比如鼠标、键盘、游戏手柄、方向盘、踏板等,但在本文中用到的只有键盘和鼠标,所以只要获取鼠标和键盘消息就可以了。
以下是设置DirectInput的基本过程:
(1)通过调用DirectInput9Create()来创建IDirectInput接口,返回值是IDirectInput9接口。
(2)查询设备的GUID。
(3)调用CreateDevice()来传递一个GUID:GUID_SysKey-Board主键盘的GUID,GUID_SysMouse主鼠标的GUID。
(4)调用IDirectInputDevice9::SetCooperativeLevel()来完成设备的协作等级的设置。
(5)调用SetDataFormat()来设置每一个设备的数据格式。
(6)使用IDirectInputDevice9::SetProperty()来设置你想要的任何设备的性能。
(7)调用IDirectInputDevice9::Acquire()来获取设备,即与设备关联。
(8)调用IDirectInputDevice9::GetDeviceState()来获取设备的数据,有两种方式来实现数据采集,一是直接模式,二是间接模式。
4.3.3声音子系统实现的步骤
实现音乐和音效处理,我们用到的是DirectX中的Direct-Music和DirectSound库,DirectMusic是控制音乐播放的,Direct-Sound是控制音效的,它是一种新的基于DLS数据的实时音乐编排和回访技术。
操作DirectSound:
(1)初始化DirectSound声明DirectSound对象调用Direct-SoundCreate()创建DirectSound()对象。
(2)设定协作等级,调用SetCooperativeLevel()函数,Direct-Sound一共有四个协作等级:普通级、优先级、排他级和White_Primary级。
(3)建立缓冲,声明DirectSound缓冲,调CreateSoundBuffer()来创建缓冲对象。
(4)把声音写入缓冲,锁定(Lock())、写入、解锁(Unlock())。
(5)控制声音播放:播放声音,调用play()函数;停止播放声音,调用stop()函数;控制音量,调用SetVolume()函数;调整频率,调用SetFrequency()函数;改变声道平衡,调用SetPan()函数。
4.4游戏工具库开发
4.4.1地图编辑器与脚本解析器的概述
地图编辑器和脚本解析器是游戏开发中的重要工具,它们综合利用底层的操作来实现游戏开发过程中比较高级的功能。4.4.2地图编辑器的作用与功能介绍
地图编辑器,顾名思义,就是用来编辑地图的工具,它的主要功能就是创建、编辑和保存游戏场景地图文件。一般游戏场景地图分为三层结构,地面层、物体层、天空层。地面层是用来贴入游戏场景的最底层图片的,如土地,沙漠,草地等都可以归结到地面层;物体层在这里不单单是一层,物体层可分为上层和下层,上层的物体可以遮挡人物,下层的物体可以阻挡人物,所以在设计中把人物定位在物体的下层;天空层是用来做效果处理的,如想实现天黑效果,你不得不在物体层的上面加上一张黑色图片。创建一张游戏场景地图主要有以下几个步骤:(1)装载进背景图;(2)显示背景图;(3)在图上画出格子;(4)在某一格子贴入确定的景物;(5)设置景物属性;(6)保存地图。
4.4.3脚本编辑器的作用与功能介绍
我们为什么要进行脚本解析器设计呢?其目的主要是解决外挂通用性的问题,我们知道有些游戏运行商时常会调整或扩增其游戏中的一些数据。如果我们把这些信息硬编码在程序中,那么游戏运行商每修改一次数据,我们就要重新更改与编译外挂一次,这为外挂的推广使用带来了极大的不便。另外,脚本解析器也是作为智能AI处理的一个部分,游戏行为的实现很大一部分依赖于脚本代码的书写。因此设计脚本解析器与游戏脚本指令体系是十分重要的,其中脚本指令体系更为重要。
5.测试
在游戏引擎开发完成以后,游戏的创作就由设计师和美工来完成。首先,创作游戏剧本,确定了剧本之后,我们就要对剧本进行分镜处理,确定在什么场景出现什么人物,和什么样的人物有什么样的对话;其次,使用地图编辑器来制作游戏场景地图;最后,编写游戏的脚本文件,编写时要确定关卡和时间发生地点,人物对话就按分镜处理后的剧本就可以了。
6.结论
综上完成了一个通用的2DRPG游戏引擎的基本功能,该引擎的主要特点是采用了模块化设计思想来构建引擎的底层程序,因此该引擎具有较强的扩展性和可维护性。该引擎的工具库具有高度的可重用性,只需要经过少许的改动就可以适应新格式地图的编辑。该游戏引擎是按照网络游戏引擎设计的,所以游戏引擎可以进一步的升级为一个网络游戏的引擎,用于网络游戏客户端程序的开发。如果对引擎的底层图形系统进行优化,可以将引擎升级为2.5D的引擎。本文限于篇幅有限,部分程序代码没有给出。
参考文献:
1.AndreLaMothe.TricksoftheWindowsGameProgramming[M].中国电力出版社,2004.
2.StephenPrata(美).C++PrimerPlus[M].人民邮电出版社,2002.
3.唐明理.学VC编游戏[M].四川电子音像出版中心,2004.
4.JohnVlissides.DesignPatterns[M].机械工业出版社,1995.
5.荣钦科技.游戏设计概论[M].北京科海电子出版社,2003.
6.StephenCDewhurst.C++程序设计陷阱[M].中国青年出版社,2003.7.DavidJ.Kruglinski.VisualC++技术内幕.清华大学出版社,1999.
32