Article
OO
Oliver Orangers
03/05/25
Урок 08. Переход в другие комнаты.

Урок 8. Переход в другие комнаты.

Добрый день, друг!

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

Для начала создадим новый объект “oRoomExit”. Для этого можем еще создать новый спрайт, полупрозрачный квадрат. Спрайт назовем sRoomExit.


В объекте oRoomExit сделаем новое событие. Давайте подумаем, какое событие нам подойдет.

Мы хотим, чтобы игрок сталкивался с объектом, а затем загружалась другая комната.

Для этого нам подойдёт событие “столкновение с объектом” или “шаг”, где мы можем использовать функцию для столкновения. Давайте использовать событие “столкновение”, так как оно проверяется только при столкновении, а не каждый игровой кадр, в отличии от шага.

Создадим несколько переменных в определении переменных. Нас интересует в какую точку мы хотим попасть по оси x и y, в какую сторону наш персонаж будет повернут и, самое главное, в какую комнату(локацию) мы хотим попасть.


Нажимаем внизу слева “Определения переменных”. Добавляем несколько новых переменных. Определение переменных как и событие создать срабатывает 1 раз, при создании объекта, до события “создать”. Поэтому оно и будет в дебаге называться “PreCreate” - ПредСоздать.


Назовём им targetX, targetY и targetRoom, это те переменные, которые мы точно захотим изменять для каждого перехода.

Их значения оставим по умолчанию - 0.

Теперь, как и хотели, создадим событие “Столкновение с объектом” и выберем в объектах oPlayer - нашего игрока. Тогда это событие будет происходить каждый раз, когда игрок сталкивается с переходом.



В самом событии напишем, что если игрок существует, то пусть новые переменные, которые мы назовем global.targetRoom, global.targetX, global.targetY и global.targetDirection заполняются новыми значениями.


Зачем это надо? Если мы будем хранить информацию о переходе в самом объекте, то по завершению комнаты они очистятся, а значит, переход не произойдет корректно, если вообще произойдет. Нам нужны ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ.


Их отличительная особенность в том, что они хранят информацию с момента появления и до завершения игры. Это нагружает систему, конечно, сильнее, чем обычные переменные, которые привязаны к объектам и уничтожаются сразу вместе с объектом, или тем более, чем локальные(через var), которые хранят информацию в событии. Но зато это поможем нам в этой ситуации, да и в целом глобальными переменными можно назвать всё, что хранится в сохранениям. Выполненные задания, количество очков здоровья у игрока, его монеты и прочее.

Напишем следующее:

if (instance_exists(oPlayer))

{

global.targetRoom = targetRoom;

global.targetX = targetX;

global.targetY = targetY;

global.targetDirection = oPlayer.direction;

room_goto(targetRoom);

}


У нас возникнет предупреждение о том, что все четыре наши глобальные переменные не заинициализированы. Давайте создадим объект Игры, который будет постоянным, он будет хранить всю важную информацию и не обнулять ее при переходах между локациями.


В событии “создать” напишем, что все наши глобальные переменные равны -1, кроме направления. По умолчанию наш игрок будет смотреть направо, почему нет?

global.targetRoom = -1;

global.targetX = -1;

global.targetY = -1;



Далее зайдем в объект игрока. Дело в том, что если мы сейчас пойдем тестить, то заметим, что Игрок всё равно появляется не там, где надо. Потому что по умолчанию объект появляется там, где его поставили в комнате на этапе редактирования. А нам надо в коде написать, чтобы его x и y были в других позициях, если global.targetX и global.targetY что-то хранят вместо -1. Логично?

Мы перешли в другую комнату, эти переменные сменились и позиция игрока сменится на другие x и y.

В событии “создать” объекта oPlayer запишем это:

if (global.targetX != -1)

{

x = global.targetX;

y = global.targetY;

}


Теперь добавим наш объект oGame в первую комнату. Напомню, он должен быть постоянным. Тогда не придется добавлять oGame в каждую комнату и он будет работать нормально. Если добавить его затем и в другие комнаты, ко он будет обнулять все переменные, так как это будет новый экземпляр объекта, а это нам не надо!

Кроме этого, добавим наш первый переход в первую комнату.

Не забудем и создать вторую комнату.

В моем случае вторая комната выглядит так:


Два раза кликнув по объекту в комнате выйдет его окошко с настройками. Тут мы видим “переменные”. Они то там и нужны.

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


Здесь введем данные о том, куда этот oRoomExit при столкновении с игроком отправит нас. Но если с названием комнаты всё понятно, то как понять какой x и какой y нужен?

Легко!


Когда вы водите мышкой, то внизу слева появляются координаты X, затем Y. Просто запомним их и запишем в переменные перехода. Теперь проверим, всё ли работает!


Шикарно, всё получилось! Естественно, это самая простая версия перехода, но мы ее можем легко улучшить до простой анимации, например, затемнения, если захотим!


А пока на этом остановимся и добавим несколько комнат с уровнями, они нам пригодятся в скором времени!


Подписывайся на мою группу ВК: https://vk.com/oliora.

И не пропускай следующие мои туториалы!


Ссылка на следующий урок: https://cr5.space/h/ru-gamemaker/post/10


Peace!



Comments