1、 青岛农业大学 毕 业 论 文(设计) 题 目: 基于GML的2D游戏设计 姓 名: 学 院: 理学与信息科学学院 专 业: 电子信息科学与技术 班 级: 2010.2 学 号: 20102957 指导教师: 宋
2、洁 2014年 6 月 1 日 目 录 1前言 1 2 系统开发概述与需求分析 2 2.1 系统开发概述 2 2.1.1 系统开发背景 2 2.1.2 项目开发目的和意义 2 2.2 需求分析 2 2.2.1 系统需求 2 2.2.2 技术分析 3 2.3 可行性分析 3 3 系统技术介绍 4 3.1 GML语言概述 4 3.2动态链接库介绍 4 3.3 数据结构介绍 4 3.4优化渲染引擎模式(Shader Model) 5 4 系统总体设计 6 4.1利用GML的设计思想以及整体规划 6 4.2
3、系统功能结构设计 6 5 系统详细设计及代码实现 8 5.1设计说明 8 5.2地形信息的实现 8 5.3玩家的逻辑操作 11 5.3.1角色移动的实现 11 5.3.2环境交互的实现 12 5.3.3角色攻击的实现 13 5.4剧情演出的实现 16 5.4.1自创标记语言 16 5.4.2 时间轴 17 5.5 A*寻路算法以及敌人AI的实现 17 5.6外部资源加载以及资源的打包 18 5.6.1动态资源加载 18 5.6.2外部资源打包 18 5.7 基于shader和surface的特效 19 5.8用户体验的改进 21 6 系统环境配置与调试 23
4、 参考文献: 24 致谢 25 基于GML的2D游戏设计 摘要:电子游戏自20世纪60年代诞生以来,到如今已经成为一个热门产业。各种电子游戏的制作引擎也是层出不穷。GameMakerStudio是如今较为流行的游戏制作引擎,其内置的GML脚本语言,高度概括了2D游戏设计能用到的共通编程语句,往往浓缩为一个简短灵活的函数,使设计游戏更为灵活。同时GML还支持动态链接库,数据结构,优化渲染等功能,更是为高质量的游戏制作提供了可能性。 本项目是使用GameMakerStudio作为游戏引擎,编写的一款动作解谜类型的角色扮演游戏。项目中解决了地形信息描述、逻辑操作、剧情演出、A
5、I设计、外部资源加载打包,Shader特效等开发的常见问题,尽所能为玩家提供最为丰富和优质的游戏体验。 关键字:游戏制作;GameMakerStudio;GML;数据结构;DLL;Shader 1 The Design of 2D-Game Base on GML Abstract: Video games since the birth of the 1960s, until now has become a hot industry. Various production engine of electronic game is also emerge in endles
6、sly. And GameMakerStudio is now more popular game engine. Its built-in scripting language GML, highly summarized the 2D game design to common programming statements. GML concentrated into a short flexible functions that enable more flexible design of the game. Meanwhile GML supports dynamic link lib
7、raries, data structures, Shader Model and other functions, offers more possibility for high-quality game production. This project is to use GameMakerStudio as a game engine, write an action puzzle types of role-playing games. Project solves the terrain information description, logical operations, d
8、rama performances, AI, external resource loading, packaging design, Shader effects such as the development of common problems, what can provide players with the most abundant and high-quality gaming experience. Keywords: Game design; GameMakerStudio; GameMakerLanguage; Data structures; DLL; Shader
9、 1 1前言 电子游戏,自20世纪60年代诞生至今,已经成为了界范围内广泛认可的娱乐项目。然而由于其性质的特殊,电子游戏在国内的发展却屡屡受挫。上世纪90年代中期,许多国外的游戏佳作进入内地市场,刮起了一股电脑游戏旋风。90年代后期,中国游戏的研发能力逐渐提高,许多工作室如雨后春笋,一些本土公司纷纷加入,也出现了不少佳作。可惜因市场不够成熟,经营水平限制,特别是盗版的冲击,多数研发公司都难以为计,纷纷作调整,国产游戏的研发走入低谷。 为了防止青少年沉迷游戏,国务院办公厅2000年6月曾转发文化部等7部门《关于开展电子游戏经营场所专项治理的意见》,开始了针对国内游戏机市场的治理工
10、作。这无疑又间接导致了广大民众对电子游戏的误解,以至“谈游戏色变”,对游戏的国民产业又是一次沉重的打击。 然而实际上游戏只是一种新型的媒体。从竞技方面讲,类似体育;从文化方面讲,类似电影。正如电影分门别类一样,游戏也会根据题材、内容的不同,对人的影响也是有好有坏。积极向上的游戏也可以让玩家从中获得积极向上的影响。 如今国产游戏的主流变成了网页游戏为主的快餐游戏。大多数游戏制作团队都放弃原创制作,从以往的游戏中借鉴思路或窃取素材。然而因为国内游戏市场的特殊性,往往就是这种快餐游戏最容易获得利润。原创的独立游戏反而分不到一杯羹,国内的电子游戏产业可谓前途多舛。 本项目则是使用PC为开发平台,
11、GameMakerStudio引擎作为开发工具的一款独立的RPG游戏(角色扮演Role-playing Game),名为《海克斯与红蔷薇》(以下简称为《海克斯》)。游戏面向Windows平台,其策划、架构、文案以及使用的素材,均为制作团队独立原创完成。相信过硬的游戏质量和饱含诚意的制作团队,同样给玩家带来一丝感动,给国内游戏产业带来一丝希望。 此外,本论文还将把开发过程中的收获和不足作简单阐述,这对我以后的学习工作将会有很大帮助。 2 系统开发概述与需求分析 2.1 系统开发概述 2.1.1 系统开发背景 2014年1月6日,不少游戏迷开始在各个论坛中发布消息,称游戏机在被禁13年之
12、后,终于将被解禁。这则消息源自中国新闻网在昨日发布的一条最新政策,这一名为《国务院关于在中国(上海)自由贸易试验区内暂时调整有关行政法规和国务院文件规定的行政审批或者准入特别管理措施的决定》的文件中,正式确定与游戏机有关的禁令将“暂时停止实施”。 这一消息对国内的游戏产业来说可谓喜从天降。政府的支持和民众的认可,使得游戏产业又出现了新的希望。加之近年来国内的产权保护日益完善,民众的正版意识也日渐增强。也许国内的电子游戏开发也会自此迎来新的春天。 2.1.2 项目开发目的和意义 在今后的很长一段时间,电子游戏产业必将蓬勃发展。而因为上述的某些限制,国内的独立游戏产业一直没有太多经验和建树。
13、本项目则是对独立自主的游戏开发做出探索。如果能得到预期反响,还可以给其他原创团队带来极大的鼓励与信心。 2.2 需求分析 2.2.1 系统需求 角色扮演游戏(Role-playing game),简称为RPG。游戏类型的一种,宽泛的游戏类型。在游戏中,玩家负责扮演这个角色在一个写实或虚构世界中活动。玩家负责扮演一个或多个角色,并在一个结构化规则下通过一些行动令所扮演的角色发展。玩家在这个过程中的成功与失败取决于一个规则或行动方针的形式系统(Formal system)。 《海克斯》属于RPG游戏中的动作解谜RPG。解谜游戏是一类通过对游戏中出现的信息或情节进行分析和处理,发掘线索解决各
14、种谜题的益智健脑游戏。与益智游戏不同的是,该类游戏的大多作品比之益智游戏更注重情节和人物塑造,内置谜题形式比小型的益智游戏更加灵活多样,画面表现也更加精致。解谜游戏通常以游戏的形式锻炼了游戏者的脑、眼、手等器官协调性,适当游戏能增强自身的逻辑分析能力和思维敏捷性。 2.2.2 技术分析 《海克斯》使用的开发引擎为GameMakerStudio。这是由苏格兰邓迪的YoYo Games开发的一款游戏开发引擎,支持HTML5、Facebook、Android、iOS、Symbian、Windwos和OS X等平台,以向GameMaker社区开发者提供全新的功能与性能[3]。 而GameMake
15、r 最大的价值在于其内置的一套编程语言 —— The Game Maker Language (GML)。GML 高度概括了 2D游戏设计能用到的共通编程语句,往往浓缩为一个简短灵活的函数,是“文字版的按钮”,使设计游戏更为灵活。 而GML的另一大特色就是,它支持用C和C++编译的动态库。这样一来,从理论上讲就可以实现任何功能,弥补了GML本身可能有的不足,避免了因为语言本身的瓶颈[1]。 另外,GameMakerStudio在1.3版本之后,全面开始支持OpenGL的Shader系统,这极大地扩充了语言对显卡功能的开发,让游戏能调动起计算机的所有资源,用最合理的资源消耗达到最华丽的效果[
16、2]。 2.3 可行性分析 可行性分析是设计开发系统的总体方向,开发软件系统需要给出其功能、性能、可靠性以及其他方面的要求,目的是用最小的代价在尽可能短的时间内确定问题是否能够解决、是否值得去解决: 游戏的设计理念,就是以一个业余团队的时间和精力,打造出商业级的高质量游戏。因此对的画质和画面效果,都有较高的要求。游戏的分辨率为1280x720 60Hz的高清画质,但是每秒60帧的刷新率无异也给CPU带来了一些负担。因此在开发过程中,需要全程跟踪代码结构以及效率,尽可能优化算法,节约系统资源。 GML是基于DirectX9.0c和.NetFramework3.5的引擎。在所有的Windo
17、ws7以及以上版本的操作系统,都会自带上述环境。对于WindowsXP系统,也可以做到一键安装。 项目的合作方是四川美术学院。合作方提供策划、文案、美工、音乐等各种资源,而程序是由我负责完成。 3 系统技术介绍 3.1 GML语言概述 面向过程的编程语言,属于一种脚本语言。语言的运行结构是以”Step”为基本单位的。所谓Step,可以翻译成“步”,理解为帧。GML语言的根本即面向游戏运行过程中的每一帧进行编程,从而实现游戏功能。 以帧为单位的编程,很大程度上把游戏的运行过程具体化,对于系统开发以及剧情演出都非常便利。 GML所支持的扩展功能也非常优秀。其中对动态链接库(DLL)的支
18、持,更是给语言本身提供了无限可能性。理论上,只要C和C++能实现的功能,就可以用加载DLL的方式让GML也实现[3]。 此外,还有对Surface、数据结构、Shader、粒子系统、音频发射器等模块的支持,让GML如虎添翼。在GameMakerStudio中,还增加了游戏的跨平台编译。只要题材合适,通过简单的修改,就可以把游戏导出到HTML5、Facebook、Android、iOS、Symbian、Windwos和OS X等任意平台上[4]。 3.2动态链接库介绍 动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码
19、和数据的库,DLL不是可执行文件[4]。 动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。 然而GML对其的支持也是有所限制的,参数和返回值仅支持char*和double两种数据类型。但是在实际的开发中,这两种类型也完全够用了。 3.3 数据结构介绍 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构
20、可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关[5]。 GML支持的数据结构有:堆栈、队列、列表、配对、优先队列、栅格。 3.4优化渲染引擎模式(Shader Model) Shader Model(在3D图形领域常被简称SM)就是“优化渲染引擎模式”。事实上,Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。通过这些程序,程序员就能够获得绝大部分想要的3D图形效果。在一个3D场景中,一般包含多个Shader。这些Shader中有的负责对3D对象表面进行处理,有的负责对3D对象的纹理进行处理。早在微软发布DirectX 8时,Sha
21、der Model的概念就出现在其中了,并根据操作对象的不同被分为对顶点进行各种操作的Vertex Shader(顶点渲染引擎)和对像素进行各种操作的Pixel Shader(像素渲染引擎)[6]。 GameMakerStudio在1.3版本之后,开始全面支持Shader,使得游戏可以以极低的性能代价取得更好的画面效果。 4 系统总体设计 4.1利用GML的设计思想以及整体规划 1、类面向对象的设计思想: GML语言中,所有实例的载体均为Object。在每一个Object都有他们的固定的成员变量,比如x水平坐标,y垂直坐标,hspeed水平速度,vspeed垂直速度等等。通过这
22、些内建变量,以及开发者自定义的变量,就可以定义各种不同的Object。这些Object可以有简单的继承(parent)关系,因此可以在一定程度上把Object理解成类(class),但又和C++等传统面向对象的思想有所不同(比如Object中无法定义Function)[7]。 通过内置函数instance_create可以将某个指定的object实例化。在实例化之后,每个Instance实例都会有一个Index索引。这个索引相当于实例的唯一标识,类似Win32编程的句柄。一个实例可以通过得到其他实例的索引,去修改其他实例的成员变量。 2、事件驱动行为的设计思想: GML语言中,每一个Ob
23、ject都有各种事件。比如Object被实例化时的Create事件,每一帧都循环一次的Step事件,被销毁时触发的Destroy事件等。在各种不同的事件中,编写相应的行为,即可实现对应功能。例如子弹在销毁时,播放一个爆炸的音效,就可以在其Destroy事件中添加代码audio_play_sound(se_explode,0,0); 3、房间舞台的设计思想: 盛放Object实例的容器,既是GML中所说的Room房间。一个房间具有room_width房间宽度、room_height房间高度、room_speed房间速度等属性。其中房间速度是指房间每秒刷新的帧数。本项目中,默认的刷新率均为60
24、帧每秒。房间中的各种Object组成了游戏的各种角色,当房间进行到下一帧时,其中的所有实例均出发一次Step事件,从而实现了游戏的过程。 4.2 系统功能结构设计 1、控制类型的Object 游戏运行的过程中,需要有一些全局Object对整个游戏做统一调度。比如视野控制,暂停控制,菜单控制,甚至记录玩家的游戏流程等等。这些Object可以被称为是全局控制实例[8]。如图3-1所示。 图3-1 控制类型的Object 其中大多数实例化的控制类型的Object的生命周期是贯穿整个游戏的。 2、角色类型的Object 以玩家控制的主角为例,游戏中的任何一个角色,都可以是一个独立
25、的Object。 5 系统详细设计及代码实现 5.1设计说明 游戏为线性流程,因此在结构上较为清晰。由以下几个主要部分组成:主菜单,游戏剧情演出,游戏开始,游戏中菜单呼出,保存读取。 其中主要功能的实现又由以下模块实现: 使用栅格保存地形信息; 玩家的逻辑操作(移动 / 战斗 / 场景交互等); 自创类HTML标记语言,实现剧情演出; A*寻路算法; VS编写DLL,外部资源加载打包; 材质贴图(2.5D效果 ); Shader着色器; UI特效制作(混合模式等) 音效处理 / 动画处理; 用户体验改进。 5.2地形信息的实现 游戏运行的过程中,很多情况需要
26、判断地形。如图4-1的例子。 图4-1 地形示例 举例来说,当玩家在上图的位置时,系统需要知道什么地方可以通行(道路,桥梁),什么地方不能通行(河流,树木)。而这个能否通行的属性,就可以理解成地形信息。 本项目是2D游戏,因此所有信息处理都是针对于二维平面。因此采用了Grid栅格结构。所谓栅格,是GML中所支持的一种常见的数据结构[9],其特点如图4-2。 图4-2 栅格的结构 栅格可以简单理解成一个二维数组,其中的每一个元素都有自己独立的数值。我们可以把游戏地图的X坐标以及Y坐标理解成栅格中的X坐标和Y坐标,然后通过对每一个点的值进行设定,从而实现功能。 用上图举
27、例可以把地图中的某一块区域分成一个8X8的栅格,栅格中,可以通行的地方,记为0,不可通行的地方,记为1。这样一来,就实现了对地图信息的记录。而当需要获取这些信息时,只需要提供X坐标以及Y坐标,即可找到对应栅格的数据,从而做出判断。 如图4-3,其中红色区域不可通行,记为1,绿色区域可以通行,记为0。 图4-3 地形栅格化 此外,还可以使用二进制数据去保存更多信息。如此时需要知道玩家此时所在的地方,是桥梁还是道路,就可以把每一个栅格中的数据规定为二位二进制数。第一位表示能否通行,第二位表示是桥梁(假设用1表示)还是道路(假设用0表示)。上图中,坐标(4,5)的区域,可以通过
28、0),并且是桥梁(1),就可以表示成01b;而坐标(0,5)表示的区域,可以通过(0),并且是道路(0),故可以表示成00b。这样就能用最高的数据密度保存地形信息,保证了游戏运行的效率以及尽可能少的占用内存。 使用时,只要通过二进制的位与和位或运算,即可得到想要坐标的任意一个属性。 5.3玩家的逻辑操作 在RPG游戏中,对游戏角色的控制是整个游戏的灵魂所在。而在本项目中,因为分辨率相对较高,角色移动相对自由,在逻辑操作上也存在一些问题。 5.3.1角色移动的实现 GML中对2D游戏设计非常强大,例如想要实现“按住右方向键,角色向右移动”,只需要一句代码即可实现。 if (keyb
29、oard_check(key_right)) // 检测键盘右方向键状态 if(mp_grid_get_cell(global.grid,x + 1,y) == 0)//检测目标位置是否可以通行 x += 1; // 如果满足以上条件,则x坐标加1 接下来,只有把这句代码放入Step事件中,每帧做一次判断,即可实现:当键盘的右方向键按下时,判断角色目标坐标是否可以通行。如果可以,角色的x坐标向正方向(屏幕右侧)加1。从而达到了键盘控制角色移动的目的。 然而,这种简单的判断,对于操作手感有一定负面影响。如图4-4所示。 图4-4 优化移动判定 假设玩家在(0,11),想要向
30、右边移动。此时如果按照上述代码执行,则会卡在(2,11)的位置不能移动。玩家便不得不先向上移动一格,然后再继续向右移动。为了避免这种情况的发生,代码做出了如下调整。 for (i = abs(h_spd); i > 0; i -= 1;) { move_check = sign(h_spd) * i; if (mp_grid_get_cell(global.grid,x + move_check,y) == 0) { x += move_check; break; } else if (mp_grid
31、get_cell(global.grid,x + move_check,y-i) == 0) { y -= i; } else if (mp_grid_get_cell(global.grid,x + move_check,y+i) == 0) { y += i; } } 这段代码,是在当目标方向上不能通行时,则对目标方向的周围坐标做一个遍历,从而找到最近的一个可通行坐标。依旧以上图举例,当程序发现(3,11)不可通行时,就会循环检测(3,10)或(3,12)是否可以通行。如果可以,则移动,不可以则检测
32、3,9)或(3,13)。直到找到可通行的坐标或者循环结束。 5.3.2环境交互的实现 《海克斯》属于RPG游戏中的动作解谜RPG。所谓解谜要素,即玩家可以和场景中的各种物体进行调查与交互。因此,引入了interact_area交互区域这个概念。在地图初始化中,通过输入坐标,在地图上创建多个交互区域。每个区域都有其各自的ID。当玩家与这些区域发生交互时,则根据ID去判断应有的反应或者演出。如图4-5所示。 图4-5 交互区域 5.3.3角色攻击的实现 在游戏过程中,某些场景主角需要和某些“敌人”战斗。为了让玩家得到更丰富的游戏体验,游戏提供了两种攻击方式。近战的小刀攻击和远程的弹
33、弓攻击。近战攻击的实现相对简单,在此不再赘述。主要介绍远程攻击的实现方式。 弹弓射出的“子弹”,可以理解成一条射线。而这条射线第一个碰到的敌人,既是子弹命中的目标。而怎样找到这个敌人,就是问题所在了。如图4-6所示。 图4-6 远程武器 首先,对于表示子弹的射线,应该有三个参数。其一是射线的原点坐标,其二则是射线的角度,最后则是射线的最远距离。现在定义原点坐标为(x,y),角度为dir,最远距离为固定值,500像素。而后,就可以使用这两个变量进行计算。GML中,提供了collision_line函数。这个函数可以返回一条直线是否与某个指定的Object发生碰撞。但这显然是不够的,
34、因为设定中子弹射线只会击中第一个遇到的目标,而当这条线上与多个Object实例发生碰撞时,函数只会返回索引值最小的实例。可是,想要确定第一个目标是谁,显然不能把射线上的所有坐标都遍历判断一次,这样对CPU的代价太大。因此在这里采用了二分法去做判断。如图4-7所示。 图4-7 第一目标算法 红点(x,y)是子弹的原点坐标,(xx,yy)是子弹的最长距离的终点坐标。黄点object1是子弹可能集中的敌人实例。按照最远距离500像素计算,如果使用枚举,当敌人在(xx,yy)时,则最多可能需要500次计算,才能获得第一个击中的目标。但如果采用二分法计算,点(x1,y1)是(x,y)和(x
35、x,yy)的中点。程序首先使用collision_line判断线段(x,y)(x1,y1)是否与敌人发生碰撞。如果发生,则将(xx,yy)点移动到(x1,y1)处;如果不发生碰撞,则计算(x1,y1)和(xx,yy)的中点,记为(x2,y2),重复上述操作。又因为在此碰撞计算中,单位是像素,故距离小于1时,计算也就失去意义。所以当中点坐标到(xx,yy)的任意投影距离小于1时,停止计算。这样,500像素的子弹距离,最多只需要九次计算,即可得到距离最近的目标。 关键代码如下: var xx, yy, dx, dy, instance, first_instance; dx = 0; dy
36、 = 0; xx = x + lengthdir_x(500, dir); yy = y + lengthdir_y(500, dir); first_instance = collision_line(x, y, xx, yy, par_enemy, true, true); if (first_instance != noone){ dx = xx - x; dy = yy - y; while (abs(dx) >= 1 || abs(dy) >= 1) { dx /= 2; dy /= 2; i
37、nstance = collision_line(x, y, xx - dx, yy - dy, par_enemy, true, true); if (instance != noone) { first_instance = instance; xx -= dx; yy -= dy; } } } cx = xx - dx; cy = yy - dy; 实例效果如图4-8所示。 图4-8 第一目标算法 黑线为子弹的最终线段,蓝线为计算记录。 5.4剧情
38、演出的实现 5.4.1自创标记语言 RPG游戏的另一个重要要素是剧情。玩家可以通过游戏中的各种演出,了解游戏中的世界观、故事、人物等等。虽然GML提供了强大的2D游戏常用的各种函数,但其没有提供任何UI或者剧情演出的解决方案。所有系统都需要开发者自行架构开发。 为了在开发过程中减少重复操作,提高开发效率,我仿照HTML的思路,自创了一门简单的标记语言。 标记语言,是一种将文本以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码。与文本相关的其他信息(包括文本的结构和表示信息等)与原来的文本结合在一起,但是使用标记进行标识。 标记语言的设计思路是使用字符串处理
39、函数,对按照规范编辑的标签进行Switch Case判断,再执行对应的操作。 每一个标记,用中括号[]隔开,括号中分为两部分,Order命令和Argument参数。命令和参数用空格隔开,不过也存在不需要参数的命令。这样就可以通过自己创建规范,而高效的对演出进行设计。如图4-9,就是一个剧情演出的例子。 图4-9 剧情演出 实现代码如下: play_script("[cf player][st 0][fp 0][por 1][arr 1] [s 蕾奥妮:这、这是在什么地方?] [p][e]") 其中cf是创建文本框(create text frame),s表示在文本框中显示说话
40、的内容。其他st、fp、por等,均为文本框的各种参数,用于规范文本框位置,小头像显示等等各种属性。 5.4.2 时间轴 通过上例也不难看出,使用改标记语言,也只是能对单独的一帧进行操作。然而在真正的游戏演出中,剧情是连贯的。主角说完一句话之后,很可能需要向某个方向移动几步。然而这种时序类型的演出,再单纯使用标记语言,就显得不那么明智了。因为标记语言的本质还是对字符串的识别以及判断,在调试过程中,系统只能通过一句一句的执行,从而实现功能。 因此这里就是用了GML内置的timeline时间轴功能。时间轴顾名思义,即把“时间”这个概念放入一个一维坐标系,每一个单位时间作为一帧。然后再对这一帧
41、做对应的操作。如果把时间轴当做剧本,每执行完一个标记语言的字符串之后,便等待操作,或进行下一帧。这样子就可以做出完整的演出了。 例如,主角在说话之后,向屏幕右上方移动,在时间轴中就可以这样表示: 在第一帧中: play_script("[cf player][st 0][fp 0][por 1][arr 1] [s 蕾奥妮:这、这是在什么地方?] [p][e]") 在第二帧中: obj_player.hspeed = 2*1.7/1.4; obj_player.vspeed = -2/1.4; 5.5 A*寻路算法以及敌人AI的实现 所谓寻路算法,就是把游戏中的某个角色放在
42、一个环境中,并给定一个目标点和一些障碍物。而计算出最近的一条路线,也就是寻路算法。 前文提到的栅格系统,也刚好可以在寻路算法中使用。通过查阅资料,目前最主流的寻路算法即A*寻路算法。它引入了Node节点和Cost代价两个概念[10]。 该算法就是把角色、障碍物、目标都放在栅格中,把每一个栅格当做节点,通过链接节点获得路线,最终选择代价做小的路线,从而获得最优的路线。 在游戏过程中,经常会出现会攻击玩家的敌人。敌人的行动策略都是由编写好的AI决定的。而其中AI很重要的一部分,即追击系统。游戏地形复杂,敌人需要有能力判断路线,绕开各种可能的障碍物去接近玩家。因此,A*寻路算法就提供了最好的支
43、持。如图4-10所示,敌人会自动找到最近的路线。 图4-10 自动寻路 5.6外部资源加载以及资源的打包 5.6.1动态资源加载 计算机的图形系统需要显示图形时,需要先将图片加载到内存中,然后才能进行绘制。《海克斯》的运行分辨率为1280*720,图像素材清晰度高且数量比较多,因此不能一次性把所有关卡的素材全部读入内存,否则是对内存的严重浪费。GML在此提供了外部资源加载函数,游戏可以在运行中从硬盘上读取需要的图像素材,保存在内存中,再在需要的时候绘制。 5.6.2外部资源打包 由于项目所使用的图像素材均为团队的画师原创,因此需要对游戏中使用的素材做打包处理,以保护画师的产
44、权。GML内置不提供素材的打包功能,因此决定使用C语言编写的DLL实现打包。 首先,需要把所有外部资源的文件名和文件大小作为素材列表打印到一个txt文档中。再讲这个文档作为头,和其对应的素材文件首尾相接写在一起。就能完成打包。 图4-11所示的素材包文件为例。 图4-11 打包文件结构 文件头的内容为: 素材1 201245 素材2 104230 素材3 364523 素材4 200444 素材5 302410 打包完成之后,当需要读取部分文件时,只需要通过读取文件头部分的素材列表,通过一定计算,即可获得需要的文件的位置。之后读取即可。 附DLL代码的函数声明部分。
45、 export double printlist(char* name,char* size); export double pack(char* name); export double unpack(char* name,double size,double skip); 5.7 基于shader和surface的特效 游戏中经常需要一些使用简单绘图函数无法做到的效果。好在GML提供了对shader的支持,因此可以借此做出波纹材质等效果。但shader也有其局限性,它无法规定相对复杂的绘图区域。 如图4-12,仅仅使用使用代码不可能让shader的绘制区域刚好在红线之内。
46、 图4-12 河流区域 为了解决这个问题,需要引入了surface概念。所谓surface,即程序在显存中创建一个“画板”,再在画板中作画。全部作画完成后,再将此画板贴在屏幕上。 同时,GML还支持blend_mode混合模式。计算机的绘图系统,是使用三个8位二进制数,分别保存红色R、绿色G、蓝色B,也就常说的RGB模式。如果适当的对颜色进行位与和位或操作,就可以得到所谓的透明通道,即alpha通道。 由此,可以在Surface中事先绘制好河流的蒙版,其中不需要绘制的地方为黑色,RGB为(0,0,0),需要绘制的地方为白色,RGB为(255,255,255)。再使用蒙版与shader绘制
47、好的波纹材质进行位与计算。这样一来就能得到一个形状与蒙版一致的河流材质。最后,把这个河流材质使用叠加模式绘制到屏幕上,制作出河流的效果。实际效果如图4-13。 图4-13 蒙版的使用 5.8用户体验的改进 用户体验是任何一款软件制作的一个重要部分,如何才能让玩家在使用过程中尽可能操作顺手,流程舒心,便是提升用户体验所要解决的问题。 《海克斯》注重剧情的发展,因此在游戏中有较长的剧情演出。可是当玩家在重复游玩时,看同样的剧情也许不是玩家想要的。 在此借鉴了一个安卓系统常用的UI设计,即“再次按下”设计。这个而设计的优点在于操作简单快捷,当玩家第一次点击跳过剧情的按钮时,屏幕弹
48、出提示,并启动一个计时器。如果在计时器计时结束之前,再次按下此按钮,剧情就会跳过;如果没有在计时结束之前再次按下,屏幕上的提示消失,再次等待按键。 这样的设计优点在于,玩家只需要通过一个按钮,即可在确认选项中做出选择,简化了操作,同时提升了用户体验。实际效果如图4-14。 图4-14 仿安卓的UI设计 6 系统环境配置与调试 GML的运行环境是基于DirectX 9.0C和.NetFramework3.5或以上版本。在与体验用户的测试中,正确安装以上环境的计算机,可以在WinXP、Win7以及Win8上正常进行游戏体验。 GML所使用的编码是非Unicode字符集,导致其对中文等
49、宽字符路径识别存在bug。因此游戏的安装目录中不能有中文或其他宽字符文字。 本项目的制作断断续续耗费了一年的时间。在开发过程中,我的编码思路和风格都有了很大的进步。由一开始只知道闷头实现功能,到后来学会将功能模块化模板化,从而极大的提高了开发效率。 开发期间,我学习了C++、C#等语言,并用他们做了不少项目。GML严格来说属于面向过程的编程语言,在系统开发中有很多思路上的限制与误区。对于我个人的学习发展来说可以算是弯路。不过也因此让我更加深刻的理解了面向对象的编程语言的优势所在。 最后希望本项目能够在游戏界得到认可。 也希望电子游戏的民族产业能早日崛起,在世界打出一片天地! 参考
50、文献: [1] Brian W. Kernighan and Dennis M. Ritchie ,The C Programming Language, Prentice-Hall, 1988 [2] Frank D.luna, Introduction to 3D Game Programming with DirectX 9.0, 清华大学出版社, 2007.4 [3] 谭浩强编, C语言程序设计题解与上机指导, 清华大学出版社, 2000年11月 [4] GameMaker:Studio User Manual,YoYo Games Ltd.,2014 [5] Jeffre






