Как сделать стены в game maker studio 2

Обновлено: 11.05.2024

Как сделать нормальное столкновение со стенами в 2D аркадах

В Step пишем:
wi=collision_rectangle(x-15,y+17,x+15,y+17+vspeed,wall,0,0)
if wi>0 and vspeed>0 and air=1 then
air=0;
vspeed=0;
gravity=0;
y=wi.y-32;
jump=2
>
. Это проверка столкновения со стеной снизу
if wi<0 and air=0 then
air=1;
gravity=global.grav
jump-=1
>
. Проверка отсутствия стены снизу

if wi>0 and vspeed<0 then
vspeed=0;
y=wi.y+32;
>
. столкновение с потолком
Вот так пишется обработка прыжка
Теперь сам прыжок:

Для события KeyPress(любой клавиши) пишем:
if jump>0 then
vspeed-=5;
gravity=global.grav
jump-=1;
>
Теперь передвижение вправо(влево):
Для события KeyRight:
wi=collision_rectangle(x+17,y-15,x+17+hsp,y+15,wall,0,0)
if wi<0 then
x+=hsp
>
else
x=wi.x-32;
>

Для события KeyLeft:
wi=collision_rectangle(x-17,y-15,x-17-hsp,y+15,wall,0,0)
if wi<0 then
x-=hsp
>
else
x=wi.x+32;
>

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

Как сделать стены в game maker studio 2


Прежде чем делать сами ящики, состряпаем физику для игрока. Приступим? Давайте!
Создадим объект o_hero и присвоим ему спрайт игрока. Делаем событие Create и туда запишем небольшой код:

speed_max = 4;
jump_speed = 15;
gravity_amount = 1;
gravity_direction = 270;
push_speed = 1;

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

Теперь создаем событие Step, и туда запишем код (сейчас я сделал комментарии кода, ибо просто непрактично будет его расписывать отдельно):

Надеюсь вам все понятно, если что-то вы не поняли, то задайте вопрос в комментариях, я вам отвечу.

Теперь создаем объект o_block, присваиваем ему спрайт блока и ставим галочку на Solid (твердость):


Теперь в объекте игрока добавим событие столкновения с блоком, а потом прописываем туда такой код:

Объект игрока должен выглядеть так:


Он нужен для того, чтобы игрока при столкновении с блоком останавливался.
Теперь самое интересное, это ящик! Создаем объект o_box. Делаем событие Create и вбиваем туда такой код:

gravity_amount = 2;

Он задает ящику гравитацию. Теперь создаем событие Step и опять таки вписываем код:

Теперь создаем событие столкновения с игроком, пишем туда код:

Это означает, что если ящик упадет на игрока, то он умрет. Ну и напоследок столкновение со стеной. Туда тоже записываем код:

Это остановка. Теперь создаем комнату, расставляем объекты и радуемся!


Вот мы и создали платформер и сделали в нем ящики. Возможно напишу еще статьи о всяких ловушках и фичах для платформеров, а пока удачной вам разработки игр, новички. Старайтесь и учитесь, добивайтесь лучших результатов и у вас все получится!

Как сделать стены в game maker studio 2

Для начала нам предварительно нужно найти в папке Game Maker'а Exaples и в нём treasure.gmk. С его помощью будем изучать комнаты. Скачали? Тогда откройте этот файл и поиграйте немного, нажав на кнопку
Запустить игру. Если вы немного поиграли, приступим к изучению. Нажмите два раза на папку Rooms и два раза на room0.

Наведите курсором на иконки сверху и изучите их. Некоторые из них не переведены, поэтому смотрите, что они обозначают:
1) Очистить комнату 2) Двигать объекты/тайлы на X и Y пикселей 3) Отразить горизонтально все объекты/тайлы 4) Отразить вертикально все объекты/тайлы 5) "Заморозить" объекты/тайлы в комнате (запретить удаление) 6) "Разморозить" объекты/тайлы в комнате (разрешить удаление).

Откройте вкладку Установки. В ячейке Имя можно написать имя комнаты. В ячейке Заголовок комнаты можно написать текст, который будет отображаться в названии окна. Ширина и высота обозначают ширину и высоту комнаты. Сделайте ширину 640, а высоту 480. Когда вы играли в игру, то наверно заметили, что с каждым уровнем скорость игры увеличивается. Это делается с помощью значения Скорость. Скорость - это количество действий, которые делаются в секунду. Если поставить галочку Постоянный, в игре, если покинуть эту комнату и снова туда вернуться, содержимое комнаты будет оставаться таким же, каким вы его видели в последний раз. Нажав на кнопку Создать кодоткроется окно, в котором можно написать GML скрипт, который будет выполняться при создании комнаты.

Откройте вкладку Виды. Поставьте галочку Использовать виды. Вы включили использование видов. Всего можно использовать 7 видов. Поставьте галочку Включить вид в комнате. X и Y под надписью "Вид в комнате" это координаты вида в комнате, а W и H высота и ширина вида. Сделайте X 122, Y 192, W 250, а H 200. X и Y под надписью Порт на экране это координаты окна, а W и H высота и ширина окна. Для того чтобы вид следовал за объектом нужно нажать на ячейку под Следовать за объектом и выбрать там нужный объект. Выберите объект explorer. X гр и Yгр это граница вида, при "пересечении" которой вид начинает двигаться за объектом. Xск и Yск это скорости движения вида за объектом. Сделайте Xгр 125, Yгр 100, Xск 3,Yск 3.

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

Откройте вкладку Тайлы. Тайл - это изображение, разделенное на кусочки. Чтобы выбрать тайл нужно нажать на прямоугольную область над галочкой "Удаление при обно." И выбрать там нужный тайл. Выберите background1. Тайл background1 разбит на четыре картинки. Выберите одну из них и разместите в комнате. Текущий слой - это слой, на котором размещены тайлы. Если тайлы размещены на слое 1000000 и мы, находясь на слое 1000001, попытаемся удалить талйы, то тайлы на слое 1000000 не удалятся. Чтобы добавить слой нужно нажать на кнопку Добавить. Чтобы удалить слой нужно нажать на кнопку Удалить. Чтобы изменить слой нужно нажать на кнопку Изменить.

Откройте вкладку Фоны. Поставив галочку Рисовать цвет фона цвет фона будет серым если не выбрано фоновое изображение. Цвет можно поменять, нажав на серый прямоугольник рядом с надписью "Цвет". Если убрать галочку Видим при старте фон не будет виден. Если поставить галочку на Рисунок на передний план, то фон будет на переднем плане. Чтобы выбрать фон нужно нажать на прямоугольную ячейку под галочкой "Рисунок на передний план". Гор.тайл и Вер.тайл обозначают, будет ли повторяться фон. X и Y это смещение фона на X и Y пикселей. Нажав на галочку Растягивание, фон растянется по всей комнате. Гориз.ск-ть и Верт.скорость это скорость движения фона.

Теперь создайте новую комнату и расставьте там объекты, сделайте фон, и разместите тайлы. Чтобы добавить комнату нужно нажать правой кнопкой мыши на папку Rooms и выбрать там Create Room.

Столкновения

При планировании движений или принятии решений об определенных действиях часто важно посмотреть, есть ли столкновения с другими объектами в определенных местах игрового мира, и часто выбор подходящего столкновения является самой важной задачей. из всех. GameMaker Studio 2 имеет ряд встроенных функций, которые помогут вам правильно работать с коллизиями в соответствии с потребностями вашего проекта.

ВАЖНО! Все функции столкновений работают с целочисленными позициями, независимо от входных значений. Любые нецелые значения будут округлены до ближайшего целого числа.

Простая проверка столкновений

В следующих функциях рассматриваются различные способы, с помощью которых можно заставить экземпляр проверять столкновения с другим экземпляром:

Расширенная проверка столкновений

Для этого можно использовать следующие функции (а также другие функции, подробно описанные в разделах " Перемещение " и " Экземпляры"). Все эти функции столкновений работают немного по-разному, но у них есть три общих аргумента которые мы объясним здесь:

  • obj. Здесь мы указываем объект, столкновение с которым должна проверить функция. Это может быть идентификатор экземпляра, тип объекта или специальное ключевое слово GM all. Также стоит отметить, что если выбранный тип объекта является назначенным родителем других объектов, то все дочерние объекты этого типа также будут включены в эту проверку.
  • prec. Это значение может быть либо true, либо false и относится к точности проверки столкновений. Если установлено значение true, то будут вычисляться точные столкновения (но только если проверяемый объект имеет значение "precise" отмечен для обнаружения столкновений в свойствах маски), что является немного более сложной задачей для CPU и поэтому должно использоваться с осторожностью. Если false, то столкновения будут рассчитываться на основе ограничительной рамки проверяемого объекта. для.
  • notme. Вам может понадобиться проверить столкновения с объектом, который имеет тот же индекс, что и объект, выполняющий код, поэтому, чтобы код не нашел столкновения с самим собой, можно установить значение true. Если вы специально ищете экземпляр объекта, выполняющего код, или это не важно, можно оставить значение false.

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

Существуют следующие функции, которые работают с расширенными столкновениями.

Проверка столкновений без маски

Все вышеперечисленные функции относятся к экземплярам проверки столкновений и, как таковые, полагаются на маску столкновений, определенную для экземпляра. Тем не менее, существует множество моментов, когда требуется проверить "столкновения" с точкой или областью, особенно когда вашему экземпляру не назначен спрайт, или когда вы работаете с мышью и т.д.. Поэтому GameMaker Studio 2 также предоставляет следующие функции, которые помогут вам в таких ситуациях:

Физические коллизии

При использовании встроенной физики вышеуказанные функции столкновений не гарантируют работу для экземпляров с поддержкой физики. В основном это связано с тем, что эти экземпляры больше не используют большинство обычных встроенных переменных (вместо этого у экземпляров с поддержкой физики есть свой собственный набор переменных), а также не используют маску столкновения или ограничительную рамку, поскольку они имеют свой собственный набор переменных), а также не используют маску столкновения или ограничивающую рамку, так как вместо них используются фикстуры. Однако существует специальная функция для тестирования столкновений с включенной физикой, которая проверяет наличие перекрывающихся фикстур:

Начало работы

Этот раздел является обязательной первой остановкой при использовании GameMaker Studio 2 и знакомстве с содержимым IDE и принципами ее работы. Вы обнаружите, что GameMaker Studio 2 интуитивно понятна и проста в использовании, и даже если вы никогда раньше не пользовались подобными инструментами, у вас не возникнет проблем с началом работы и созданием игр после прочтения этого раздела. даже если вы никогда не пользовались подобными инструментами, у вас не возникнет проблем с началом работы и созданием игр после прочтения введения и заполнения краткого руководства ( см. ниже). После того, как вы освоите основы, вы сможете перейти к более подробному рассмотрению компонентов GameMaker Studio 2 в разделе IDE Reference ниже.

Уроки по Game Maker Studio 2 для начинающих (Часть 4)

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

Заставим наконец мяч отскакивать от стен

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

В данном случае возможны три варианта развития событий при столкновении со стеной:

Три возможных варианта при столкновении со стеной Три возможных варианта при столкновении со стеной

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

Во втором случае мяч летит влево вверх и встречается со стеной слева, при этом сверху от него стены нет. В этом случае он должен сменить направление вправо вверх, согласно красной стрелке, т.е. переменная dir должна смениться с 0 на 1.

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

Теперь для данного направления перенесем все в код:

if dir=0 && place_meeting(x,y-2,Wall) if dir=0 && place_meeting(x-2,y,Wall) if dir=0 && place_meeting(x,y-2,Wall) && place_meeting(x-2,y,Wall)

Думаю вы уже вполне можете читать код самостоятельно. Если направление равно 1 и на два пикселя выше мяча есть стена, то направление станет равно 2. Если направление 0 и на два пикселя левее от мяча стена, то направление 1. И если направление 0 и на два пикселя выше есть стена и на два пикселя левее есть стена, то направление 3.

Теперь, пропишем то же самое для всех остальных направлений. И в итоге весь код в событии шага мяча будет следующим:

Уроки по Game Maker Studio 2 для начинающих (Часть 1)

Пробуем создать свой Арканоид

Я всегда всем советую начать изучение движка с создания простой игры. Да я и сам в свое время учился так. Создав 5-6 отличных друг от друга игр вы получите очень хорошую базу знаний по движку.

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

А теперь к делу.

Запускаем наш Game Maker Studio 2.

Стартовое окно Стартовое окно

Для начало вам нужно будет зарегестрировать свой аккаунт на официальном сейте YoYoGames , чтобы войти в данный движок. Я об этом вроде говорил ранее.

Нажимаем "New" , что значит "Новый" , для создания нового проекта. У вас далее появится следующий выбор:

Выбор типа проекта Выбор типа проекта

Тут следует немного остановиться подробнее. Движок GMS2 позволяет создавать игры на своем языке программирования GameMaker Language (GML) либо вообще без написания кода, то есть собирать игру как бы из логических блоков (Drag and Drop). Я бы рекомендовал учиться сразу писать код. Но вы можете конечно попробовать поиграть с блочной системой. Конкретно в этом уроке я буду объяснять работу именно проектов на основе кода, т.е. выбираем второй вариант. Ну а далее вы выбираете место, где будете сохранять своей проект и дадите ему имя.

Готовим ресурсы для игры

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

Для игры нам будут нужны: бита, мяч, стены и блоки.

Создаем для начала спрайты для них. Я рисовал все сам прямо во встроенном графическом редакторе GMS2, по этому все очень схематично. Красным выделил на что стоит обратить внимание. В основном это размеры спрайта, его имя и где расположен его центр.

Спрайт биты Спрайт биты Спрайт мяча Спрайт мяча Спрайт блока Спрайт блока Спрайт стены Спрайт стены

Вы конечно можете все нарисовать более красиво или вообще взять графику из сети. Так же можете использовать другие размеры спрайтов. Но размеры я бы рекомендовал для обучения использовать именно те, что использую я.

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

Объекты созданы Объекты созданы

Назовите объекты так как я их назвал. Это пригодится далее в уроках. Итого у вас должно быть 4 спрайта и 4 объекта в дереве ресурсов.

Далее подготовим комнату и расставим все объекты в ней для первого уровня. Кроме мяча. Мяч мы будем создавать кодом.

Задайте ей размеры 960 пикселей в ширину и 540 пикселей в высоту. Создайте несколько слоев именно того типа, что я пометил стрелочкой (т.е. слои для объектов). Поменяйте им названия. Расположите их в том же порядке что у меня на скриншоте. И далее на каждый слой перетащите и расставьте соответствующие объекты, как они у меня расставлены в комнате. Т.е. на слой "Walls" , например, расставляем объекты "Wall" и т.д.

Так же можете поменять цвет фона. Для этого просто щелкаете на слой Background и чуть ниже выбираете нужный нам цвет. Но это не обязательно. Можно оставить и изначальный черный.

Наша созданная комната Наша созданная комната

Обратите внимание, что мы создали еще и слой "Ball" , но на него ничего не ставим. Мы подготвили этот слой заранее, чтобы потом создать кодом на нем наш мяч (объект Ball).

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

Т.е. при запуске у вас откроется подобное окно:

Наша запущенная, но пока еще "безжизненная" игра Наша запущенная, но пока еще "безжизненная" игра

Справились? Поехали дальше!

Начинаем писать логику для игры

Давайте начнем с биты, так как игрок будет управлять именно ей. Щелкнем на объект биты и создадим ей событие шага ( Step ), о котором я писал в прошлых статьях. Создаем именно событие Step , не Begin Step и не End Step . Для чего нужны они, объясню когда-нибудь в последующих статьях. Но запомните, в 95% вы будете использовать именно событие Step из этих трех возможных, так что пока не забивайте голову.

Создаем событие шага для объекта биты Создаем событие шага для объекта биты

И вот наконец-то у нас открылось окно редактора кода. Как долго же мы шли к этому событию! Для начала, давайте сделаем так, чтобы бита двигалась вправо и влево по нажатию кнопок со стрелками вправо/влево на клавиатуре.

Для этого нам в шаге нужно создать условие, которое бы проверяло, что нажата та или иная клавиша (вспоминаем прошлые статьи опять же). За событие нажатия клавишы в GMS2 отвечает функция keyboard_check_pressed () , где в скобках мы напишем необходимую нам клавишу. Чуть ниже мы к этому вернемся. Так вот, а что именно мы будем делать при нажатии этой клавиши? Просто будем менять X-координату самой биты, т.е. будем прибавлять или отнимать эту координату, тем самым перемещая биту вправо или влево. Итоговый код в событии шага биты у нас будет выглядеть так:

if keyboard_check_pressed(vk_right) if keyboard_check_pressed(vk_left)

Т.е. если нажата клавиша "стрелка вправо" ( vk_right - это как раз обозначение этой самой клавиши), то x биты прибавит 10 пикселей, а так как ось X в GMS направлена слева-направо , то бита как раз сдвинется вправо. Вот этот код как раз отвечает за прибавление 10 к x: x+=10.

Аналогично для левой стороны. Итак, жмем клавишу для запуска игры, чтобы потестировать. Сделаю оговорку: мы очень часто будем запускать игру для проверки текущего кода, чтобы избежать ошибок на первых порах. Напишем небольшой кусочек, проверим, напишем еще - снова проверим и по такой схеме постоянно. Если возникнет какая-то ошибка, то нам проще будет найти тот участок кода, в котором мы ее допустили.

Протестировали? Хм. Код и правда УЖЕ работает не так, как нам хотелось бы, правда? Т.е. зажав стрелочку вправо, например, бита сдвинется чуть вправо и остановится, пока мы не отожмем клавишу и заново ее не нажмем. Т.е. чтобы нам двигать биту, нам нужно постоянно клацать на клавишу стрелки. Согласитесь, это не очень удобно. Что же мы сделали не так?

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

  1. keyboard_check_pressed()
  2. keyboard_check_released()
  3. keyboard_check()

С первой фкункцией мы уже познакомились, она срабатывает ровно в тот момент, когда клавишу нажали, т.е. когда клавиша только опустилась. Событие при нажатии сработает соответственно только раз.

Вторая функция аналогична первой, но будет срабатывать только тогда, когда клавишу отжали, именно только в момент отжатия, тоже один раз. Т.е. если мы поменяем в нашем коде функции на эту, то мало, что изменится - бита будет передвигаться на раз, при каждом отжатии клавиши. Т.е. зажав стрелку вправо, например, ничего не произойдет. Но вот когда вы отпустите клавишу, бита сдвинется. Можете сами поменять в коде и попробовать.

А вот третья функция будет срабатывать постоянно пока клавиша зажата. Т.е. то, что у нас должно выполниться при нажатии клавиши, по сути будет выполняться каждый шаг.

Меняем код и пробуем:

if keyboard_check(vk_right) if keyboard_check(vk_left)

Теперь не нужно жмякать на стрелочки, чтобы сдвигать биту каждый раз по чуть-чуть, а просто нажимаем клавишу и наслаждаемся "полетом" биты!

Если вам кажется, что бита очень резкая, то можете сдвигать ее каждый шаг не на 10 пикселей, а на 5, к примеру, поменяв предварительно в коде.

if keyboard_check(vk_right) if keyboard_check(vk_left)

Теперь бита кажется более плавной. А давайте вообще заменим скорость переменной, чтобы можно было потом в самой игре менять скорость движения биты, например, когда подбираем какой-нибудь бонус. Согласны?

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

Создаем событие Create (так же как мы создавали Step ) и в нем напишем всего одну строчку кода:

А в самом событии шага (Step) чуть изменим код на такой:

if keyboard_check(vk_right) if keyboard_check(vk_left)

Т.е. мы просто цифры заменили именем переменной, а так как она равна 5, то результат при запуске будет тот же. Но в дальнейшем нам это пригодится.

Не люблю повторяться, об этом я писал в прошлых статьях, но тут все таки сделаю исключение. Напомню, что событие Create выполняется лишь раз, в момент создания объекта. Т.е. весь код, что написан в событии Create выполнится лишь раз, в самом начале, в отличии от Step , где он выполняется циклически, т.е. неприрывно.

Делаем столкновения со стеной

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

Т.е. что нам нужно сделать? Алгоритм такой:

  1. Проверить нажата ли клавиша вправо
  2. Проверить находится ли бита все еще левее самой крайней стены
  3. Если да, то только в этом случае сдвигаем ее на 5 пикселей вправо

Тоже самое потом проделываем и для левой стороны. Чуть дорабатываем наш код:

if keyboard_check(vk_right)
if keyboard_check(vk_left)

Ну, давайте разбираться, что мы тут написали.

Сначала как и прежде первой строкой проверяем нажата ли клавиша "стрелка вправо". И если она нажата, то все, что идет далее между скобок <> будет выполняться, если нет, то код в них просто будет игнорироваться.

А в скобочках у нас еще одно условие (if). Им мы проверяем если x-координата биты меньше значения 891, то можем выпонить код следующий далее в скобках <>. А в нем у нас как раз прибавление координаты x на 5 пикселей, т.е. сдвиг вправо. Таким образом, если у нас x биты меньше 891, то она сдвинется вправо, а если больше или равно, то код в скобках не будет выпоняться, т.е. бита не сдвинется и будет стоять, т.е. как бы упрется в стену.

То же самое для левой стороны, только там условие чуть отличается. Если x больше 67, то бита сдвинется влево на 5 пикселей, если меньше или равно 67, то соответственно нет.

Где я взял эти значения: 67 и 891? Это просто координаты в комнате. Как уже сказал, ось X в GMS идет слева направо. Т.е. самая левая координата комнаты будет равна 0, а самая правая - значению ширины комнаты (которое мы задавали при создании комнаты, т.е. 960 пикселей в нашем случае).

Уроки по Game Maker Studio 2 для начинающих (Часть 5)

В прошлых уроках мы остановились на том, что научили мяч отскакиватьот стен и биты. Пришло время научить его отскакивать от блоков, которые мы должны разбивать (разбивать их мы научимся чуть позже).

Для этого достаточно нам добавить всего одно действие. А именно, назначить стену родителем для данного блока. Как это сделать и для чего?

Заходим в объект блока. Нажимаем на кнопку "Parent" (что переводится как "родитель").

Первый шаг Первый шаг

Далее, в открывшемся окне жмем на три точки.

Второй шаг Второй шаг

А там уже выбираем объект стены (Wall).

Третий шаг Третий шаг

Щелкаем на него и все. Теперь для блока родителем назначен блок стены.

Что это значит? Вообще это достаточно обширная тема для изучения. Но для нас это значит, что мячу теперь не принципиально сталкивается ли он с объектом стены или с объектом блока, он все равно будет отскакивать. Так как для нашего мяча блок - это теперь тоже самое что и стена. Если в коде мяч каким-то образом взаимодействует со стеной, то и с блоком код повторится. Это конечно все очень утрировано. Но запустите игру на данном этапе и потестируйте.

Мяч теперь отскакивает как от стен, так и от блоков.

Наш первый баг залипания мяча на блоке Наш первый баг залипания мяча на блоке

По этому добавьте еще несколько случаев проверки в коде. Необходимо сделать это перед тем, как приступать к написанию следующего кода, чтобы не запутаться!

Я же подскажу, как сделать так, чтобы блоки уничтожались при столкновении с мячом.

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

//Поле влево вверх
if dir=0 && place_meeting(x,y-spd,Wall) if dir=0 && place_meeting(x-spd,y,Wall) if dir=0 && place_meeting(x,y-spd,Wall) && place_meeting(x-spd,y,Wall)

Вот самый первый наш случай. Когда мяч летит влево и вверх. Тут есть три варианта: когда мяч сталкивается со стеной (а теперь и с блоком) сверху, слева и одновременно сверху и слева.

Давайте, выделим один из данных случаев, а именно столкновение со стеной сверху, т.е. первая строчка данного кода:

i f dir=0 && place_meeting(x,y-spd,Wall)

Здесь мы проверяем, если мяч летит влево вверх И над ним на spd пикселей выше есть объект стены, то мяч меняет направление на влево вниз (dir=2). Т.е. логично, что сюда нужно вклинеть кусок кода, где блок бы уничтожался.

Давайте эту первую строчку немного доработаем:

if dir=0 && place_meeting(x,y-spd,Wall)
if place_meeting(x,y-spd,Block)
b=instance_place(x,y-spd,Block)

Так что же тут у нас. Т.е. условие не изменилось Все так же проверяем что направление у мяча dir=0 и есть объект стены выше, и если да, то так же меняем направление на dir=2.

Тут без изменений. А вот ниже добавлены еще три строчки.

Тут мы проверяем есть ли блок выше мяча в момент столкновения со стеной. Может быть немного сложно понять. Но блок у нас - это и блок и стена одновременно для мяча (так как блок - это теперь родитель стены). Для смены направления мяча мы используем проверку столкновения имеено со стеной. А вот для раазрушения нужно проверить, что стена - это на самом деле блок. Если сложно понять, то задавайте вопрос в комментариях, постараюсь объяснить проще.

Так вот, смотрим, в том же месте, где стоит стена(сверху) есть ли объект блока? Если да, то мы переменной b присваиваем id этого блока. А далее с объектом b производим уничтожение с помощью функции with .

И вот тут у нас появилось очень много нового. Для начала, давайте постараемся понять, что такое id объекта. Дело в том, что каждый объект, который мы ставим в уровень в редакторе комнат или создаем кодом, имеет свой уникальный номер. Через этот номер можно обратиться именно к этому образцу объекта.

Помните, мы обращались из объекта Биты к объекту мяча, когда нажимали клавишу пробел с помощью точки:

if keyboard_check(vk_space)
Ball.fixed=false

Т.е. в объекте Ball переменная fixed должна была сменться на false. В нашем случае все работает отлично, так как объект Ball один на уровне. А если бы у нас было несколько мячей? Данный код бы сменил переменную fixed у каждого мяча на false. Но что если бы мы захотели поменять данную переменную только у одного конкретного мяча на уровне? Т.е. у одного образца объекта. Вот тут как раз необходимо было бы обратиться по уникальному номеру - этому самому id .

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

Как написать игру-платформер в Game Maker Studio — ЧАСТЬ 1

Я покажу, как реализовать передвижение, коллизию, прыжки, гравитацию, ускоряющие платформы, платформы для прыжков, смерть от шипов и падения за карту, переход на следующий уровень и порталы.

Перед началом желательно иметь хоть какие-нибудь навыки работы с Game Maker Studio. Рекомендую ознакомиться с интерфейсом программы.

Передвижение игрока

Создадим объект oPlayer (в дальнейшем все названия ресурсов будут начинаться с соответствующей приставки, чтобы понимать, что это за ресурсы. Для объекта (object) — «o», для комнаты (room) — «r» и т. д.). Также понадобится нарисовать спрайт или загрузить уже готовый, и привязать его к объекту. В моем случае это простой белый квадрат 48x48.

В событии Create объявим следующие переменные:

xDir - направление движения игрока по горизонтали. Переменная будет равна -1, если игрок идет налево, 1 — если направо, и 0 — если игрок стоит на месте.

stepLength - длина шага игрока в пикселях. Пускай переменная будет равна 10.

dx - сдвиг по горизонтали. Каждое обновление комнаты (по умолчанию — 60 обновлений в секунду) игрок будет сдвигаться на dx пикселей. dx будет вычисляться перемножением xDir и stepLength.

Переменные можно объявить другим способом: в специальном разделе Variable Definitions.

В событии Step напишем следующее:

xDir = -keyboard_check(ord("A")) + keyboard_check(ord("D")); dx = xDir * stepLength; x += dx;

Переменная x относится к тем переменным, которые есть в каждом созданном вами объекте. Они определяются автоматически, без вашего участия. Список всех таких переменных.

Первая строка вычисляет направление движения. Функция keyboard_check(key) принимает в качестве аргумента клавишу и возвращает true, если она нажата. Функция ord(string) принимает в качестве аргумента строку и преобразует ее в необходимый тип данных для аргумента функции keyboard_check(key). Таким образом, при удержании клавиши A xDir становится равным -1; при удержании клавиши D xDir становится равным 1.

Вторая строка вычисляет dx.

Третья строка увеличивает x на dx пикселей, то есть двигает игрока.

Создаем комнату и добавляем на слой Instances экземпляр объекта игрока.

Запускаем и убеждаемся, что все работает как надо.

Вместо того, чтобы обрабатывать каждый объект, в который можно врезаться и на котором можно стоять, создадим абстрактный объект oSolid («твердый» объект), от которого будем наследовать другие объекты, которые мы хотим наделить коллизией.

Здесь никаких переменных и событий создавать не надо, код для взаимодействия с объектом напишем внутри oPlayer в событии Step. Перепишем его так, чтобы событие выглядело следующим образом:

xDir = -keyboard_check(ord("A")) + keyboard_check(ord("D")); dx = xDir * stepLength; if (!(place_meeting(x + dx, y, oSolid)) //эта строчка новая x += dx;

place_meeting(x, y, obj) нужна для проверки пересечения прямоугольников двух объектов. Она принимает три аргумента: x - позиция первого объекта по оси x, y - позиция первого объекта по оси y, и obj - имя второго объекта или id его экземпляра. Функция возвращает true, если объекты пересекаются и false - если нет. Важно то, что проверка осуществляется не в одной лишь точке (x; y), а сразу во всех точках прямоугольника вызывающего объекта. Для проверки коллизии в одной точке имеется функция position_meeting(x, y, obj), но она нам не понадобится. Используя place_meeting(x + dx, y, oSolid), мы проверяем пересечение игрока с твердым объектом, как если бы игрок был сдвинут на dx пикселей. И только убедившись, что пересечения нет, меняем координату игрока.

Теперь нужно создать объект oWall, установить ему родителя oSolid и привязать к нему какой-нибудь спрайт. В моем случае это черный квадрат 64x64. Позже в редакторе комнаты экземпляры этого объекта можно будет растянуть.

Создадим небольшую комнату и расставим там несколько oWall, чтобы проверить работоспособность.

Читайте также: