GameMaker Studio: Переходы между комнатами — Урок 9

Этот урок описывает создание системы перехода между комнатами в GameMaker Studio. Мы создадим дверь, взаимодействие с которой позволит перемещаться между уровнями, сохраняя характеристики игрока.

Создание двери

Создадим спрайт «door» размером 32×32 пикселя, заполненный коричневым цветом. Затем создадим объект «obj_door», добавим к нему спрайт «door» и активируем физические свойства, сделав его сенсором (density = 0). Это позволит отслеживать столкновения с игроком без физического взаимодействия.

Код перехода между комнатами

В событии Create объекта obj_door создадим переменные: other.new_x, other.new_y (новые координаты игрока) и other.new_room (ID целевой комнаты). Изначально им присваиваются нулевые значения.

В событии Collision объекта player добавим код:

if room_exists(other.new_room) {
    room_goto_async(other.new_room);
    x = other.new_x;
    y = other.new_y;
}

room_goto_async вызывается перед изменением координат x и y для корректной работы. Для сохранения свойств игрока при переходе, объект player должен иметь активированный флажок Persistent.

Настройка перехода и создание второй комнаты

Создадим комнату «rm_test» (копию первой комнаты, но с удалением лишних объектов). Расположение объектов в комнатах «rm_plan» и «rm_test» должно обеспечивать корректное появление игрока в новых координатах.

В событии Create объекта obj_door добавим код:

// В комнате rm_plan
other.new_room = rm_test;
other.new_x = 64;
other.new_y = 38;

// В комнате rm_test
other.new_room = rm_plan;
other.new_x = 64;
other.new_y = room_height - 55;

Эти значения определяют переход и координаты игрока в целевой комнате. Значения x и y настраиваются в зависимости от расположения двери и желаемого положения игрока. Размеры объекта «obj_door» должны соответствовать области взаимодействия.

Устранение проблем

В событии Room Start объекта player добавим image_speed = 0; для предотвращения нежелательного вращения при переходе. В событии Create объекта obj_door добавим код для привязки камеры к игроку:

if instance_exists(obj_player) {
    view_xview[0] = obj_player.x;
    view_yview[0] = obj_player.y;
}

Это обеспечит плавное перемещение камеры вместе с игроком.

Что будем искать? Например,программа