Добрый день, уважаемые читатели! В прошлой статье мы вкратце ознакомились с тем, как работает физический движок BOX2D в движке для создания игр Game Maker Studio.
Если вы еще не прочитали ее, то очень советую ознакомиться:
Сейчас же давайте попробуем доработать прошлый прототип до полноценной игры со своими целями, задачами, условиями выигрыша и уровнями.
По умолчанию, я считаю, что вы ознакомились с моими прошлыми статьями/уроками по разработке игр на движке Game Maker Studio, по этому очень банальные вещи объяснять тут не буду для экономии времени.
И так начнем по порядку:
1) Давайте создадим объект obj_controller, спрайт ему назначать не будем, в событии шага (Step) пропишем следующий код:
x = mouse_x
y = mouse_y
Далее, войдите в редактор комнаты (той, в которой мы расположили физические объекты в прошлом уроке) и поставьте в любое место этот объект.
Если вы запустите сейчас игру, то никаких изменений не увидите. Ничего удивительного в этом нет. На объект obj_controller никакой спрайт не назначен по этому в игре вы его не увидите. Все что мы сделали, так это то, что наш невидимый объект будет двигаться за курсором мыши.
2) Давайте чуть доработаем наш код в этом объекте. В том же событии Step ниже допишите следующий код:
if mouse_check_button_pressed(mb_left) {
with (instance_position(x,y,obj_box)) {
instance_destroy()
}
}
Т.е. по итогу весь код в событии шага объекта obj_controller у вас будет выглядеть так:
Теперь давайте разберемся, что же делает данный участок кода.
Сначала идет проверка условия нажата ли левая кнопка мыши, и если она нажата, то мы с объектом obj_box, находящимся в координатах x, y (а эти координаты, напомню, следуют за координатами курсора мыши) проводим каке-то действия, а именно удаляем его.
Все просто! Запускаем игру и проверяем. Действительно, при наведении курсора мыши на квадратный блок и нажатии левой кнопки мыши - он удаляется.
3) Но как же нам сделать так, чтобы удалялись все фигуры, а не только квадратные? Неужели необходимо будет прописывать один и тот же кусок кода для каждого типа фигуры?! Вроде это не сложно, всего-то дописываем код так и у нас все работает:
Но если у нас будет 30 видов фигур в игре или спустя какое-то время мы решим добавить еще 20?! Нам что, придется постоянно править этот код до бесконечности? К счастью нет! Мы можем назначить "родителя" для всех фигур, которые нам требуется удалить и в коде оставить лишь одну проверку на этого самого родителя. Как это сделать?
Создаем еще один объект obj_figure и оставляем уго пустым (не пишем в нем код, не назначаем ему спрайт). Он будет служить лишь для того, чтобы объединить все необходимые нам фигуры, т.е. будет выступать "родителем". Далее поочередно заходим в объект каждой ранее созданной нами в первой части урока фигуры и назначаем ей этого родителя. Сделать это очень просто, нажимаем на кнопку "Parent" (Родитель) и выбираем obj_figure:
Проделайте эту операцию с квадратом, планкой и треугольником. На объект стены, естественно, родителя не назначаем, так как его не нужно удалять. На объект шара пока тоже, позже объясню почему.
Теперь наконец правим код в событии шага объекта obj_controller на следующий:
x = mouse_x
y = mouse_y
if mouse_check_button_pressed(mb_left) {
with (instance_position(x,y,obj_figure)) {
instance_destroy()
}
}
Запускаем игру и проверяем. Действительно, теперь все фигуры удаляются без проблем и мы можем добавлять их в игру сколько угодно, при этом не меняя код, а просто назначая новым фигурам родителя obj_figure.
4) Двигаемся дальше. Давайте создадим объект, который будет являться целью нашей игры.
Создаю спрайт (пока это будет просто красный квадрат) и указываю ему такие настройки:
Это необязательно, но просто таким образом я могу растягивать этот спрайт как угодно и он не будет искажаться. Просто, чтобы вы знали, что в Game Maker Studio есть такая функция. Вы же можете просто создать квадратный спрайт.
Далее создаем объект obj_exit_zone, назначаем ему данный спрайт, включаем ему физику и делаем такие настройки:
Как видите, мы просто галочку, стоящую всегда по умолчанию "Start Awake" сняли, и поставили галочку на "Sensor".
"Start Awake" означает, что физический объект в комнате при запуске сразу активен - он подвержен гравитации, всем физическим силам, сталкивается с другими объектами и т.д.
"Sensor" же означает то, что объект "выпадает" из физического мира, на него ничего не действует, но он все еще может обрабатывать событие столкновения с физическими объектами, т.е. просчитывать коллизии.
5) Ну а теперь давайте уже построим наш первый уровень. Я собрал что-то типа такого для начала:
Шарик у нас всего один. Будем считать, что это наш "главный герой", которого мы должны докатить до выхода - красного квадрата, при этом без возможности управлять им напрямую, а лишь удаляя в правильной последовательности нужные нам блоки. Кстати, именно по этому мы не назначили родителя круглому объекту, чтобы игрок не мог его удалить.
6) Все, что нам осталось сделать, это то, чтобы проверялось событие столкновения шара с выходом. Давайте в событии шага объекта шара напишем следующий код:
if physics_test_overlap(phy_position_x,phy_position_y,phy_rotation,obj_exit_zone) {
room_restart()
}
Т.е. тут идет просто проверка условия столкновения с объектом выхода и если столкновение есть, то у нас просто происходит перезапуск этой комнаты.
physics_test_overlap - функция, проверяющая есть ли столкновение между двумя физическими объектами. А как вы помните с предыдущего урока, коллизии у них просчитываются по их fixtures.
phy_position_x, phy_position_y и phy_rotation - это всего лишь аналоги x, y и image_angle, но для объекта с включенной физикой (т.е. координаты и угол поворота).
Вообще, для шарика я бы код доработал так (с заделом на будущее):
Т.е. когда шар сталкивается с выходом, то идет проверка, есть ли следующий уровень, и если он есть, то происходит переход на него, если нет, то просто перезапуск текущего.
Все! Игра готова! Теперь вы можете наделать уровней, добавить еще фигур при необходимости. Все зависит лишь от вашей фантазии! Как видите, с минимумом кода всего за несколько минут мы создали готовую игру!
У меня получилось вот так (я добавил еще простенький фон в игру):
Спасибо, что дочитали статью до конца! Ставьте лайки, подписывайтесь, делитесь ей с другими, задавайте вопросы, оставляйте комментарии, пожелания и т.д. Это мне помогает видеть, что данные статьи действительно кому-то нужны и будет мотивировать писать дальше. В третьем уроке постараюсь еще кое-что показать.
P.S. Самые внимательные могут заметить, что некоторые фигуры удаляются с каким-то багом. Я специально его оставил. )) Если необходимо, то расскажу почему он возникает и как его быстро убрать.