访问器


GameMaker 语言(GML)还允许你访问某些 数据结构缓冲区,通过使用名为 访问器 逻辑表达式。这样做的方式与使用 数组 的方法类似,只有我们在第一个参数之前使用的标识符符号才能告诉 GameMaker Studio 2 你正在处理(以前创建的)数据结构。

数据结构

你可以添加、替换和获取以下数据结构类型的值和键:ds_mapsds_listsds_grids。每一个都有自己的符号和方法来访问、更改或设置值,如下所示。

列表的语法是:

list_index[| index]


所以,当你使用 ds_list_create() 创建了列表,你可以使用列表索引(已存储在变量中)来引用它,“index” 的值是要设置或添加的列表中的位置。例如,以下代码创建一个列表,然后添加 10 个条目,将每个条目设置为 0 到 9 之间的随机数:

ds = ds_list_create();
var index = 0;
repeat(10)
   {
   ds[| index++] = irandom(9);
   }


创建列表结构并填充数据后,要从列表中获取值,你可以这样做:

value = ds[| 5];


以上将从位置 5 获取值(第六个索引,因为列表从 0 开始)并将其存储在变量中。请注意,如果你使用表达式添加对已具有值的索引的引用,则将替换先前的值,而不是将更多索引添加到列表中。要添加更多条目, 你需要知道 ds_list 的大小并将其添加到末尾。还值得注意的是,你可以设置一个 大于 所引用列表大小的列表索引,这将设置该值,同时扩展列表,以及将列表中的所有位置的值初始化为0。

映射数据(译者注:也可以直接叫 map 数据)的语法是:

map_index[?key]


ds_map_create() 创建映射数据后,你将使用存储在变量中的映射索引(map index)来引用它,其中 “key” 值是要设置或获取的映射键(map key)。例如,以下代码创建一个映射数据,然后使用以下语法向其添加一些条目:

ds = ds_map_create();
ds[?"Name"] = "Hamish";
ds[?"Company"] = "MacSeweeny Games";
ds[?"Game"] = "Catch The Haggis";


创建映射数据结构并填入数据后, 若要从特定映射键(map key)获取值,你可以这样做:

value = ds[?"Name"];


以上将从键 “名” 获取值并将其存储在变量中。请注意,如果映射数据已包含与你尝试添加的键值相同的键值,则不会使用新值创建重复的映射键,而是直接替换先前的值。

栅格数据(译者注:也可称为网格数据或者 grid 数据,文档中统一翻译为栅格数据)的用法是:

grid_index[# xpos, ypos]


使用 ds_grid_create() 函数创建你的栅格数据后,你将使用存储在变量中的栅格索引(grid index)来引用它,“xpos” 和 “ypos” 是网格中用于获取或设置值的位置。例如,以下代码创建一个栅格,并将其清除为 0(译者注:二维网格结构的所有位置全设置为 0),然后向其中添加一些条目:

ds = ds_grid_create(); // 创建栅格
ds_grid_clear(ds, 0); // 清除为 0
var gw = ds_grid_width(ds) - 1; // 获取栅格宽度
var gh = ds_grid_height(ds) - 1; // 获取栅格高度
repeat(10)
   {
   var xx = irandom(gw); // 获取随机数
   var yy = irandom(gh);
   if ds[# xx, yy] == 0 ds[# xx, yy] = 1; // 在随机的栅格位置添加数据
   }


一旦创建了栅格结构,并填充了数据,要从特定网格位置获取值,你可以这样操作:

value = ds[# mouse_x div 16, mouse_y div 16]; //根据鼠标位置获取栅格数据的值


以上将根据鼠标位置获取给定栅格数据的值(除以房间中的 “单元格” 宽度以获得正确的位置)。


数组

数组也有自己的访问器,其工作方式与上面列出的数据结构类似。但是数组访问器有一个有趣的属性,允许你通过脚本修改数组而不必复制数据。当数组传递给脚本时,它是 通过引用传递,这意味着数组本身没有被复制到脚本中,而只是被引用来获取数据。通常,如果你需要更改数组,它将被复制到脚本中,然后你需要传回复制的数组以便更新原始数组。这可能会产生昂贵的处理开销,于是你可以使用访问器,因为这是直接更改原始数组,而无需复制它。你可以在下面的示例中看到它的工作原理。

数组的语法是:

array[@ xpos]
array[@ xpos, ypos]

在实例中创建数组后,可以通过引用将其传递给脚本并使用访问器 @ 直接更改它。例如,你将创建数组并像这样调用脚本:

array[99] = 0; // 创建一个数组
scr_Array_Populate(array); // 数组作为参数传入脚本

脚本自身就像这样:

var a = argument0; var i = 0; repeat(25) // 开启一个循环
   {
   i = irandom(99); // 获取随机数
   while (a[i] != 0) // 循环检测数组的值
      {
      i = irandom(99);
      }
   a[@ i] = 100; // 直接修改原始数组
   }

这个脚本正在做的是在数组中选择 25 个随机位置,并将所选数组位置的值设置为100。