在gml数据结构中存储多个唯一数组

时间:2017-03-28 01:31:17

标签: game-maker gml game-maker-language

想象一下,您正在尝试创建一个数据结构,该数据结构将保存可能在RPG中配备的所有装备的所有数据。

在这种情况下,一个齿轮可以用四个值表示:长度为C的固定长度数组,长度为0 < n < 5的可变长度数组,一个字符串和一个实数。我是gml的新手,但我倾向于使用2D数组:

2d_array[0, 0] = fixed_length[0]
...
2d_array[0, C-1] = fixed_length[C-1]
2d_array[1, 0] = variable_length[0]
...
2d_array[1, n-1] = variable_length[n-1]
2d_array[2, 0] = string
2d_array[3, 0] = real_number

然后,所有的齿轮由各种独特的2d阵列表示(例如,数百个,具有硬编码值)。 我想要做的是将所有这些数组存储在数据结构中,如ds_map(本身存储在游戏开始时创建的持久控制器对象中),其中从地图的特定键获得的值是该片的2d数组那个钥匙的齿轮。类似的东西:

gear_piece = ds_map_find_value(map, "key");  //do things with gear_piece as a 2d array
gear_name = gear_piece[2, 0]; //e.g.

我的问题是如何填充ds_map,或者是否可以创建这样的数据结构?我需要澄清,因为从我(初学者)对gml的理解以及数组如何在其中工作,以下代码是有问题的:

var 2d_array;
2d_array[3, 0] = 3;
2d_array[2, 0] = "Book of Life";

//now the variable-length array; for this piece of gear it is length 2
2d_array[1, 1] = 26;
2d_array[1, 0] = 10;

//now the fixed-length array
//SIZE is a macro for the length of the fixed-length array

i = SIZE-1;
repeat(SIZE) {
    2d_array[0, i] = 0;
    i -= 1;
} //just initializes to zeros

//hard-coded arbitrary gear values
2d_array[0, 0] = 40;
2d_array[0, 2] = 60;

//now add a reference to 2d_array to the ds_map with a unique key for that piece of gear
m_ds_gear[? "book-of-life"] = 2d_array;

//do the same process for the next piece of gear
2d_array[3, 0] = 1;
2d_array[2, 0] = "Book of Death";
...
2d_array[0, 1] = 20;
m_ds_gear[? "book-of-death"] = 2d_array;

//but now, since m_ds_gear["book-of-life"] just contains the id referencing 2d_array,
//I haven't really stored multiple arrays, right?
//I've just overwritten the old array values and stored a reference to it twice

还有其他问题,首先是2d_array是局部变量,数据结构中的引用在脚本完成运行时甚至意味着什么?我想不会。但即使将其更改为实例变量,仍然存在覆盖问题,并且显式创建数百个实例变量以容纳所有2d数组的解决方案看起来很荒谬,就像使用gear对象并创建数百个持久性不可见一样实例。我欢迎任何关于上述代码的建议,或者如何最好地存储齿轮数据的替代解决方案。

在相关的说明中,我在手册中看到有关在其他ds_lists中存储ds_lists或映射的注释,但它表示这仅适用于JSON。我可以在其他数据结构中存储数据结构吗?

1 个答案:

答案 0 :(得分:0)

我想过一个可能的解决方案,即使用一个或两个ds_gridsenum来创建一种伪地图,指定我自己的自定义ID用于寻找价值观。定义比较麻烦,但无论哪种方式都会有很多硬编码,所以我现在就试试这个。仍然欢迎任何其他意见。