在游戏中,你经常需要精确且有序地存储信息。比如,你可能需要保存一个人携带的道具列表或存储一组需要访问的位置。现在,你可以使用多个变量,但是如果你想要执行更复杂的操作,例如对数据进行排序或搜索特定项目,则需要编写大块的动作块代码,这些代码执行起来很慢,很难调试,写起来也真正的痛苦!
要解决这个问题, GameMaker Studio 2有许多内置的数据结构,可以通过专门的函数访问。有四种不同类型的数据结构可以通过拖放来操作(如果你使用GML则有六种),每个都有自己的优点和缺点,具体取决于你想要存储的信息类型以及你希望以后如何操作它 - 这四种类型是:
![]()
列表(Lists) 列表是在添加时按顺序存储信息的数据结构。列表索引从0开始,并且每个新增项目将添加到列表末尾,尽管你也可以将数据插入中间或开头与堆栈数据结构(如下所述)不同,你可以随时从列表的任何索引位置访问数据。 ![]()
映射表(Maps) 映射数据结构非常有用,因为它可以存储键值对(key和value)。例如,游戏中的角色可以拥有一定数量的不同道具(键 key),并且对于每个单独的道具,他可以拥有一定数量(值 alue),就像在RPG中你可以拥有10个生命药水,5个法力药水和100个金币。映射数据在一个地方将这些键值对保持在一起,你可以将键值对添加到映射中,并使用一些简单的函数搜索某些键对应的值。映射不以任何(可识别的)方式排序,这意味着要查找某个键,你可能必须遍历整个数据(这非常慢),并且也无法保存两个相同的键,也不能给一个键指定两个值。 ![]()
栅格(Grids,也称网格) 网格是二维数组值,你可以定义宽度和高度。这将设置网格中网格“单元格”的总数(宽度和高度相乘),然后这些单元格用于保存不同的数据值,这些数据值可以是任何允许的数据类型。这种类型的结构允许你通过给出它的 x(列)和 y(行)位置来设置和检索网格中单元格的值(行和列都从0开始并向上移动到 网格宽度减一和 网格高度减一的位置)。访问网格数据结构时,应始终尝试对单元格位置使用整数值,如果你没有的话,所有非整数索引都将被GameMaker Studio 2取整。如果这不是你所需要的,那么在传递你要检查的索引之前,你需要先自己进行四舍五入。 ![]()
堆栈(Stacks) 堆栈数据结构是所谓的后进先出(LIFO)结构。你可以将值推入堆栈并通过从堆栈中弹出它们来再次删除它们,并且最近推入的值也是首先弹出的(想想一堆硬币,每个添加的硬币必须先被移除,然后才能到达下面的其余硬币)。当要处理中断,或者有递归函数时,或者甚至在为游戏构建基本AI的时候,通常会使用堆栈。
本质上,所有数据结构都以相同的方式工作 - 你创建数据结构并将其索引值存储在变量中。然后,你可以使用这个索引值在其他函数中进行调用操作。最后,一旦你用完记得要销毁这个数据结构以将其从内存中移除。你可以根据需要同时使用尽可能多的数据结构,并且所有结构都可以存储字符串和实数值。
该数据结构库具有以下动作:
![]() |
创建列表 |
![]() |
创建映射(map) |
![]() |
创建栅格数据(译者注:即网格数据) |
![]() |
创建堆栈 |
![]() |
清空数据结构 |
![]() |
释放数据结构 |
![]() |
添加到列表 |
![]() |
从列表中删除 |
![]() |
获取所在处的列表项 |
![]() |
获取列表项的索引 |
![]() |
插入到列表 |
![]() |
获取列表项总数 |
![]() |
设置映射值 |
![]() |
获取映射值 |
![]() |
移除映射项 |
![]() |
设置栅格值 |
![]() |
获取栅格值 |
![]() |
清空网格数据 |
![]() |
压栈 |
![]() |
出栈 |
![]() |
如果数据结构存在 |
![]() |
如果数据结构为空 |