GameMaker Studio 2: Настройка слоев для постоянных объектов

Game Maker Studio 2 (текущая версия v2.2.1 и старше) не устанавливает автоматически слои для постоянных объектов при смене комнаты. Это означает, что постоянные объекты больше не имеют установленного слоя, если они переходят в другую комнату. Если вы хотите получить идентификатор слоя/глубину/имя объекта в другой комнате, он просто возвращает -1. Фу!

Есть несколько обходных путей для этого, в зависимости от того, что вам нужно. Вы можете либо установить слой постоянного объекта на слой в новой комнате с той же глубиной, что и в предыдущей, либо вы можете найти слой с определенным именем/глубиной в начале комнаты и установить его соответствующим образом.

Сохранение объекта на слое той же глубины:

Сохраните глубину текущего слоя объекта в конце комнаты и найдите слой с такой же глубиной в начале комнаты и установите слой объекта на этот слой. Если слой не существует, создайте слой с такой же глубиной и установите его на этот слой. Простой!

В событии Create укажите следующее:

targetDepth = layer_get_depth(layer);

(Событие Room Start будет запущено при запуске игры, поэтому вам не нужно устанавливать targetDepth в -1 или какое-либо другое произвольное значение. Или вы можете просто выполнить проверку позже.)

В событии Конец комнаты получите текущую глубину слоя (которая также является глубиной целевого слоя для следующей комнаты) таким же образом:

targetDepth = layer_get_depth(layer);

Теперь в событии Room Start сделайте следующее:

// Get an array containing IDs of all the layers in the room
var layersArray = layer_get_all();
var targetLayer = -1;

// Loop through the array to check if the depth of any layer matches // the target depth
for (var i=0; i<array_length_1d(layersArray); i++) {
    // If such layer is found, set the target layer to that one
    if (layer_get_depth(layersArray[i]) == targetDepth) {
        targetLayer = layersArray[i];
        break;
    }
}
// If no such layer is found, create a new one at that depth
if (!layer_exists(targetLayer)) {
    targetLayer = layer_create(targetDepth, "Layer_New");
}
// Set the layer
layer = targetLayer;

Вот и все, постоянный объект теперь находится на слое на той же глубине, когда вы меняете комнаты!

Поиск слоя с определенными свойствами:

Или, если вы просто хотите найти слой с определенным именем, просто укажите это в событии Room Start:

var targetName    = "Layer_One";
var targetLayerID = layer_get_id(targetName);
var targetDepth   = layer_get_depth(targetLayerID);
                        // Or, you can set your own value
// If layer with the name doesn't exist, create one with that name
if (!layer_exists(targetLayerID)) {
    targetLayerID = layer_create(targetDepth, targetName);
}
// Set the Layer
layer = targetLayerID;

Спасибо за чтение. Надеюсь, ваши постоянные объекты больше не живут в несуществующем слое!