基于gml的2d游戏设计毕业论文(编辑修改稿)内容摘要:

执行代 码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。 DLL 还有助于共享数据和资源。 多个应用程序可同时访问内存中单个 DLL 副本的内容。 然而 GML对其的支持也是有所限制 的 , 参数 和返回值仅支持 char*和 double两种数据类型。 但是在实际的开发中,这两种类型也完全够用了。 数据结构 介绍 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 数据结构 往往同高效的检索算法和索引技术有关 [5]。 GML支持 的数据结构有 : 堆栈、队列、 列表 、 配对 、优先队列、栅格。 5 优化渲染引擎模式 ( Shader Model) Shader Model(在 3D图形领域常被简称 SM)就是“优化渲染引擎模式”。 事实上, Shader(着色器)是一段能够针对 3D对象进行操作、并被 GPU所执行的程序。 通过这些程序,程序员就能够获得绝大部分想要的 3D图形效果。 在一个3D场景中,一般包含多个 Shader。 这些 Shader中有的负责对 3D对象表面进行处理,有的负责对 3D对象的纹理进行处理。 早在微软发布 DirectX 8时, Shader Model的概念就出现在其中了,并根据操作对象的不同被分为对顶点进行各种操作的Vertex Shader(顶点渲染引擎)和对像素进行各种操作的 Pixel Shader(像素渲染引擎) [6]。 GameMakerStudio在 之后 ,开始 全面支持 Shader, 使得游戏可以以 极低的 性能代价取得更好的 画面 效果。 6 4 系统总体设计 利用 GML 的设计思想以及整体规划 类 面向对象的设计思想 : GML语言中,所有实例的 载体 均为 Object。 在 每一个 Object都有他们的固定的 成员变量,比如 x水平 坐标, y垂直 坐标, hspeed水平速度, vspeed垂直速度等等。 通过这些内建 变量 ,以及开发者自定义的 变量 ,就可以定义 各种 不同的Object。 这些 Object可以 有简单的继承( parent) 关系 , 因此 可以在一定程度上把Object理解成类( class) , 但又和 C++等传统面向对象的思想有所不同(比如 Object中无法定义 Function) [7]。 通过 内置函数 instance_create可以 将某个指定的 object实例化。 在 实例化 之后,每个 Instance实 例 都会有一个 Index索引。 这个索引相当于 实例 的唯一标识,类似Win32编程 的句柄。 一个实例 可以通过 得到 其他实例的索引,去修改其他实例的成员变量。 事件 驱动行为的设计思想: GML语言 中, 每一个 Object都有 各种 事件。 比如 Object被实例化时的 Create事件,每一帧都 循环 一次的 Step事件,被销毁时触发的 Destroy事件等。 在各种不同的事件中,编写相应的 行为 ,即可实现对应功能。 例如 子弹在销毁时,播放一个爆炸的音效,就可以在 其 Destroy 事 件 中 添加代码audio_play_sound(se_explode,0,0)。 房间 舞台 的设计思想: 盛放 Object实例 的容器,既是 GML中所说的 Room房间。 一个房间具有room_width房间宽度 、 room_height房间 高度、 room_speed房间 速度等 属性。 其中房间速度是指房间每秒刷新的帧数。 本项目中,默认的刷新率均为 60帧 每秒。 房间中的各种 Object组成了游戏的各种角色,当房间进行到下一帧时,其中的所有实例 均出发一次 Step事件,从而实现了游戏的过程。 系统功能结构设计 控制类型的 Object 游戏 运行的过程中,需要有一些全局 Object对 整个游戏做统一调度。 比如视7 野控制,暂停控制,菜单控制 , 甚至记录玩家的游戏流程 等等。 这些 Object可以被称为是全局控制实例 [8]。 如 图 31所示。 图 31 控制类型的 Object 其中 大多数 实例化的 控制类型的 Object的 生命周期 是贯穿整个 游戏 的。 角色类型 的 Object 以 玩家控制的主角为例, 游戏中 的任何一个角色,都可以是一个独立的Object。 8 5 系统 详细 设计 及代码实现 设计说明 游戏 为线性流程, 因此 在 结构 上较为清晰。 由 以下 几个 主要 部分组成:主菜单 , 游戏剧情演出,游戏开始,游戏中菜单呼出,保存读取。 其中 主要功能 的 实现 又由 以下模块实现 : 使用栅格 保存地形信息 ; 玩家的 逻辑 操作(移动 / 战斗 / 场景交互等); 自创类 HTML 标记语言 ,实现剧情演出; A*寻路算法; VS 编写 DLL,外部资源加载打包; 材质贴图( 效果 ); Shader 着色器 ; UI 特效制作(混合模式等) 音效处理 / 动画处理; 用户体验 改进。 地形信息的 实现 游戏运行 的过程中, 很多情况 需要 判断地形。 如图 41的 例子。 图 41 地形示例 9 举例来说 ,当玩家在上图的 位置时,系统需要知道什么地方可以通行 ( 道路,桥梁) ,什么地方不能通行 ( 河流,树木)。 而这个能否通行的属性,就可以理解成地形信息。 本项目 是 2D游戏 ,因此所有信息处理都是针对于 二维 平面。 因此 采用了 Grid栅格 结构。 所谓栅格,是 GML中所支持的一种常见的数据结构 [9],其特点如 图 42。 图 42 栅格的结构 栅格 可以简单理解成一个二维数组, 其中 的每一个元素都有自己独立的 数值。 我们可以把游戏地图的 X坐标以及 Y坐标理解 成栅格中的 X坐标和 Y坐标,然后通过对每一个点的值进行 设定 ,从而 实现 功能。 用 上图 举例可以 把 地图中的某一块区域 分成 一个 8X8的栅格 ,栅格 中,可以通行的地方,记为 0,不可 通行的地方,记为 1。 这样一来,就实现了对地图信息的记录。 而 当需要获取这些信息时,只需要提供 X坐标以及 Y坐标,即可找到对应栅格的数据,从而做出判断。 10 如图 43,其中红色区域不可通行,记为 1, 绿色区域可以通行,记为 0。 图 43 地形栅格化 此外 ,还可以使用二进制数据去保存更多信息。 如 此时 需要知道玩家此时所在的地方,是桥梁还是道路, 就可以把 每一个栅格中的数据规定为二位二进制数。 第一位表示能否通行,第二位 表示 是桥梁 ( 假设用 1表 示 ) 还是 道路 ( 假设用 0表示 )。 上图中,坐标 (4,5)的 区域, 可以通过 (0),并且 是桥梁 (1),就可以表示成 01b; 而 坐标 (0,5)表示的区域,可以通过 (0), 并且是道路 (0),故可以表示成 00b。 这样就能用最高的数据密度保存地形信息,保证了 游戏 运行的效率以及 尽可能 少的 占用 内存。 使用时 ,只要通过 二进制 的位与和位或运算,即可得到想要坐标的任意一个属性。 11 玩家的逻辑操作 在 RPG游戏中,对游戏角色的控制是整个游戏的灵魂所在。 而在本项目中,因为分辨率相对较高,角色移动相对自由,在逻辑操作上也存在一些问题。 角色移动 的实现 GML 中对 2D 游戏设计 非常 强大, 例如想要 实现 “按住右方向键,角色向右移动 ”,只需要一句代码即可实现。 if (keyboard_check(key_right)) // 检测 键盘右方向键状态 if(mp_grid_get_cell(,x + 1,y) == 0)//检测 目标位置是否可以通行 x += 1。 // 如果 满足以上条件,则 x 坐标加 1 接下来 ,只有把这句代码放入 Step 事件中,每帧做一次判断 , 即可实现 : 当 键盘的 右方向键按下时, 判断 角色目标坐标是否 可以通行。 如果可以, 角色的 x坐标向正方向(屏幕右侧 ) 加 1。 从而达到了键盘控制角色移动的目的。 然而 , 这种 简单的判断,对于操作手感有一定负面影响。 如图 44 所示。 图 44 优化移动判定 12 假设玩家 在 (0,11), 想要 向 右边移动。 此时如果按照 上述 代码执行,则会卡在 (2,11)的 位置不能移动。 玩家。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。