Этот урок описывает создание системы перехода между комнатами в 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; }
Это обеспечит плавное перемещение камеры вместе с игроком.