【问题标题】:Does a ds_map destroy sub-maps?ds_map 会破坏子地图吗?
【发布时间】:2016-08-12 11:09:13
【问题描述】:

我正在尝试在 Game Maker 中制作一个照明系统,并构建我想要在 ds_map 中包含所有灯光的系统。我希望将 ds_map 保存在包含系统中所有灯光的第二个 ds_map 中

lights {
"l-01": {"x":20, "y":40, "radius":15},
...
}

关于清理系统的问题: 我是否必须遍历地图销毁所有子地图然后销毁地图,当光照贴图被销毁时,Game Maker 会自动销毁子地图吗?

ds_map_destroy(lights); // do the sub maps ("l-01") also get destroyed?

还是我必须这样做:

var k = ds_map_find_first(lights);
repeat(ds_map_size(lights)){
    ds_map_destroy(lights[? k]);
    k = ds_map_find_next(lights, k);
}

接着第一个问题,如果我删除一个键,游戏制造商会破坏子地图

ds_map_delete(lights, "l-01") // will this destroy the map indexed under "l-01"

你可能会问:“你为什么用一个 ds_map 来保存一堆 ds_map,为什么不直接创建一个地图列表?

答案来自第二个问题。如果我将地图保存在列表中,并且我需要删除其中一个地图,则列表将在删除地图时调整大小,从而抵消所有其他索引值 第二个原因是在 Game Maker 中,ds_maps 比 ds_lists 快得多

我希望我已经把我的问题说清楚了,并且你们中的一个人已经有了答案。

【问题讨论】:

    标签: memory data-structures hashmap game-maker gml


    【解决方案1】:

    如果您将添加的数据结构标记为列表/映射(使用ds_list_mark_as_map()ds_list_mark_as_list()ds_map_add_list()ds_map_add_map()),那么它将被自动删除。否则需要自己删除。

    来自关于ds_list_mark_as_list()的文档:

    注意:一旦 ds_list 中有一个值被标记为另一个列表或映射,销毁该列表也将销毁标记的列表和映射。这意味着您不必在销毁“父”列表之前手动浏览列表内容并单独销毁标记的数据结构。

    ds_map_add_list():

    如果 ds_map 有一个以这种方式添加的列表,销毁父映射也会销毁包含的列表并释放它们的内存。

    如果你有疑问可以检查,是否存在数据结构,使用ds_exists()

    【讨论】:

    • 这并没有回答 OP 的问题,他们要求为地图中的地图提供解决方案。 ds_list_mark_as_list() & ds_list_mark_as_map() 适用于列表中的列表/地图。
    • 我添加了有关 ds_map_add_list()ds_map_add_map() 的信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多