1 Вариант) globals. Создаете глобальную переменную на этапе инициализации и в Create необходимого объекта проверяете if (global.isObjectDestroyed) instance_destroy();
2 Вариант) persistent object. Делаете некоторый постоянный объект "контроллер", который будет отвечать за определенный набор объектов и при необходимости удалять их.
B делаете вроде такого:
Код
isObjDeleted = noone; // not deleted
isObjDeleted = rm_some_room_name; // delete Obj in that room
// For Create:
if (isObjDeleted == room) {
instance_destroy();
}
2.5 Вариант) Не хватает на отдельный пункт, просто доработка ко 2-му. Можно завести контроллер с хэш-таблицей, в которой ключом будет id комнаты, а значением список, состоящий из object_id и instance_id.
Примерно выглядит так:
Controller.Create:
Код
deletedObjects = ds_map_create();
Controller.RoomStart:
Код
if (ds_map_exists(deletedObjects, room)) {
var list = deletedObjects[? room]
var n = ds_list_size(list);
for (var i = 0; i < n; ++i) {
instance_destroy(list[| i]); // если не хотите вызывать событие destroy, то вторым аргументом можно передать false
}
}
Controller.SomePieceOfCode:
Код
// Добавление на удаление:
ds_list_add(deletedObjects[? rm_some_room], obj_some_object_id_or_intance_id);
// Если нужно поддерживать операцию "снова вернуть объект" и в одной комнате может быть много удаляемых объектов, то лучше листы снова-таки заменить на х.таблицы, если их немного, то асимптотически (и "экономически") листы выгоднее
var expectedObject = ...;
var list = deletedObjects[? rm_some_room_name];
var n = ds_list_size(list);
for (var i = 0; i < n; ++i) {
if (list[i] == expectedObject) {
ds_list_delete(list, i); // deletedObjects[? rm_some_room_name], если list это не ссылка (я уже не помню точно)
break;
}
}