数据结构库


数据结构动作

在游戏中,你经常需要精确且有序地存储信息。比如,你可能需要保存一个人携带的道具列表或存储一组需要访问的位置。现在,你可以使用多个变量,但是如果你想要执行更复杂的操作,例如对数据进行排序或搜索特定项目,则需要编写大块的动作块代码,这些代码执行起来很慢,很难调试,写起来也真正的痛苦!

要解决这个问题, GameMaker Studio 2有许多内置的数据结构,可以通过专门的函数访问。有四种不同类型的数据结构可以通过拖放来操作(如果你使用GML则有六种),每个都有自己的优点和缺点,具体取决于你想要存储的信息类型以及你希望以后如何操作它 - 这四种类型是:

DS List(列表数据) 列表(Lists) 列表是在添加时按顺序存储信息的数据结构。列表索引从0开始,并且每个新增项目将添加到列表末尾,尽管你也可以将数据插入中间或开头与堆栈数据结构(如下所述)不同,你可以随时从列表的任何索引位置访问数据。
DS Map(映射数据) 映射表(Maps) 映射数据结构非常有用,因为它可以存储对(key和value)。例如,游戏中的角色可以拥有一定数量的不同道具(键 key),并且对于每个单独的道具,他可以拥有一定数量(值 alue),就像在RPG中你可以拥有10个生命药水,5个法力药水和100个金币。映射数据在一个地方将这些键值对保持在一起,你可以将键值对添加到映射中,并使用一些简单的函数搜索某些键对应的值。映射不以任何(可识别的)方式排序,这意味着要查找某个键,你可能必须遍历整个数据(这非常慢),并且也无法保存两个相同的键,也不能给一个键指定两个值。
DS Grid(网格数据) 栅格(Grids,也称网格) 网格是二维数组值,你可以定义宽度和高度。这将设置网格中网格“单元格”的总数(宽度和高度相乘),然后这些单元格用于保存不同的数据值,这些数据值可以是任何允许的数据类型。这种类型的结构允许你通过给出它的 x(列)和 y(行)位置来设置和检索网格中单元格的值(行和列都从0开始并向上移动到 网格宽度减一和 网格高度减一的位置)。访问网格数据结构时,应始终尝试对单元格位置使用整数值,如果你没有的话,所有非整数索引都将被GameMaker Studio 2取整。如果这不是你所需要的,那么在传递你要检查的索引之前,你需要先自己进行四舍五入。
堆栈(DS Stack) 堆栈(Stacks) 堆栈数据结构是所谓的后进先出(LIFO)结构。你可以将值推入堆栈并通过从堆栈中弹出它们来再次删除它们,并且最近推入的值也是首先弹出的(想想一堆硬币,每个添加的硬币必须先被移除,然后才能到达下面的其余硬币)。当要处理中断,或者有递归函数时,或者甚至在为游戏构建基本AI的时候,通常会使用堆栈。

本质上,所有数据结构都以相同的方式工作 - 你创建数据结构并将其索引值存储在变量中。然后,你可以使用这个索引值在其他函数中进行调用操作。最后,一旦你用完记得要销毁这个数据结构以将其从内存中移除。你可以根据需要同时使用尽可能多的数据结构,并且所有结构都可以存储字符串和实数值。

注意:与所有动态资源一样,数据结构会占用内存,因此也应如此不再需要时摧毁它们以防止内存泄漏,否则这将卡顿并最终导致游戏崩溃。


数据结构库具有以下动作:

创建列表 创建列表
创建映射(map) 创建映射(map)
创建栅格数据(译者注:即网格数据) 创建栅格数据(译者注:即网格数据)
创建堆栈 创建堆栈
清空数据结构 清空数据结构
释放数据结构 释放数据结构
添加到列表 添加到列表
从列表中删除 从列表中删除
获取所在处的列表项 获取所在处的列表项
获取列表项的索引 获取列表项的索引
插入到列表 插入到列表
获取列表项总数 获取列表项总数
设置映射值 设置映射值
获取映射值 获取映射值
移除映射项 移除映射项
设置栅格值 设置栅格值
获取栅格值 获取栅格值
清空网格数据 清空网格数据
压栈 压栈
出栈 出栈
如果数据结构存在 如果数据结构存在
如果数据结构为空 如果数据结构为空