想象一下,您正在尝试创建一个数据结构,该数据结构将保存可能在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。我可以在其他数据结构中存储数据结构吗?
答案 0 :(得分:0)
我想过一个可能的解决方案,即使用一个或两个ds_grids
和enum
来创建一种伪地图,指定我自己的自定义ID用于寻找价值观。定义比较麻烦,但无论哪种方式都会有很多硬编码,所以我现在就试试这个。仍然欢迎任何其他意见。