Game maker как сделать стену

Обновлено: 09.05.2024

С помощью активов, которые вы уже видели, вы можете добавить несколько красивых изображений и звуков в браузер игровых активов, но они еще ничего не делают в самой игре! Для этого нам нужен самый важный актив в GameMaker - актив объекта . Объекты - это особый актив, который мы используем для управления аспектами игры и для выполнения определенных действий. Чаще всего они связаны с sprite , чтобы вы могли видеть их в игровых комнатах, но иногда они используются как "закулисные" объекты контроллера , чтобы делать такие вещи, как отслеживание статистики, установка тайминга для cut-scenes и т.д. . Объектам можно придать поведение, они могут реагировать на определенные события и друг на друга, и большинство вещей, которые вы видите в игре, основаны на объектах и их взаимодействии с пользователем и друг с другом.

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

Чтобы создать новый актив-объект, нужно просто щелкнуть правой кнопкой мыши на папке активов Objects и выбрать Create (или щелкнуть правой кнопкой мыши в любом месте браузера активов и выбрать Create Object).

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

The Object Editor

Если у вас еще нет подходящего sprite , вы можете нажать на кнопку New Sprite , чтобы создать новый актив sprite и отредактировать его по своему усмотрению, точно так же, как если бы вы создали актив с помощью стандартных опций создания sprite , только теперь он будет автоматически назначен объекту, который был открыт, когда вы начали его создавать. После выбора sprite вы также можете нажать на кнопки Edit Sprite или Edit Image , чтобы отредактировать изображения самого sprite или актива sprite . Это может быть быстрее, чем сначала найти sprite в браузере активов, а затем указать, что вы хотите его отредактировать.

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

События - это незаметные моменты в игровом цикле, когда события происходят в соответствии с тем, что вы для них запрограммировали. GameMaker работает с циклами этих событий - с момента начала работы над комнатой до момента ее завершения происходит игровой цикл, в котором на каждом шаге запускается серия событий, и вы можете разместить в своих экземплярах GML код или GML Visual действия, которые реагируют на эти события ( шаг - это момент игрового времени, регулируемый настройками скорости игры - также называемый "кадром").

Чтобы добавить событие, нажмите на кнопку Добавить событие:

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

The Asset Explorer
Создать событие Это событие происходит при первом создании экземпляра объекта и является самым первым, что происходит в экземпляре, который был помещен в комнату через редактор комнат при входе в комнату. Это означает, что данное событие является идеальным местом для инициализации переменных, запуска временных линий, установки путей и т.д. и всего остального, что обычно нужно сделать только один раз или только когда экземпляр впервые появляется в комнате.
Шаговое мероприятие GameMaker делит игровое время на шаги, а скорость игры определяет, сколько таких шагов должно быть в секунду. Шаг, по сути, представляет собой цикл, который постоянно выполняется со всеми событиями, проверяемыми и запускаемыми по мере необходимости во время игры, поэтому, как вы можете себе представить, событие Step Event - это событие, которое проверяется на каждом шаге игры, пока существует экземпляр. Обратите внимание, что категория Step Event имеет три подкатегории для "тонкой настройки" времени внутри экземпляра, но в целом вы будете чаще всего использовать главное событие Step Event.
Событие столкновения Очевидно, что при создании игры очень важно знать, когда два (или более) экземпляра объекта столкнулись, и для этого у нас есть событие столкновения. Это событие, которое вы помещаете в объект и затем указываете, какой другой объект вы должны проверить на столкновения. После добавления события и выбора объекта для проверки вы можете добавить код GML или GML Visual для разрешения столкновения.
Ничейное событие Существует несколько различных событий рисования в категории событий рисования, но чаще всего используется то, которое находится вверху и называется просто "Draw". Это общее событие рисования будет вызываться, как и событие шага, каждый игровой кадр, но оно работает двумя разными способами. Первый - это когда вы не добавляете это событие к объекту. Если указанное событие Draw Event отсутствует, то GameMaker по умолчанию будет рисовать sprite , назначенный объекту, используя любые преобразования, которые были применены в других местах объекта (например, для изменения размера или альфа-смешивания), так что даже если в списке событий не указано событие Draw Event, оно все равно выполняется и будет рисовать на экране, когда экземпляр будет помещен в комнату. Второй способ работает, когда вы добавляете само событие и включаете в него любой GML или GML Visual. Добавление чего-либо в событие говорит GameMaker : " Я хочу управлять тем, что вы рисуете для экземпляров этого объекта", и это полностью отменяет рисование по умолчанию. Это означает, что вы можете иметь объект с назначенным sprite , затем установить событие draw на рисование текста, и sprite не будет нарисован, поскольку вы не сказали GameMaker нарисовать его, хотя текст будет нарисован.
Уничтожить событие Это событие является самым последним событием, которое выполняется при уничтожении экземпляра. Его часто упускают из виду при добавлении поведения к объектам, но оно может быть очень полезным - например, для создания эффектов взрыва или частиц при убийстве врага, или для повторного рождения нового экземпляра объекта в другой части комнаты, или даже для добавления очков к счету.

Более подробную информацию о различных мероприятиях можно найти здесь.

Затем можно нажать на событие в списке, чтобы добавить его к объекту.

At this point, you may be asked to choose between GML Visual and GML Code . See Язык GameMaker for more information.

При добавлении события откроется редактор GML Code или GML Visual , в зависимости от типа создаваемого события. В этом окне вы можете добавить код или действия, которые вы хотите выполнять каждый раз, когда это событие срабатывает в игровом цикле.

Более подробную информацию об использовании GML в событиях объектов вы можете найти на двух страницах, приведенных ниже:

Полное объяснение всех различных частей редактора объектов можно найти здесь:

В следующей части этого руководства мы рассмотрим еще один тип ресурсов - последовательности.

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

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

Запускаем мяч

С прошлых уроков мы в мяч добавили всего одну строчку кода в событии шага:

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

Давайте добавим событие создания (Create) в объекте мяча и объявим в нем переменную:

Это булева переменная. Что это значит? Булева переменная - это та, что может иметь только два значения: true (истина) или false (ложь). Их можно заменить соответственно: 1 (истина) или 0 (ложь).

Я назвал переменную fixed, что значит "зафиксирован", и присвоил ей значение true (истина). Т.е. логически это можно понять как то, что при создании мяча, он зафиксирован. Теперь давайте подправим код в событи шага мяча:

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

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

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

ПРИМЕЧАНИЕ В предыдущих версиях GameMaker функции столкновения использовали целочисленные значения, однако теперь они используют значения с плавающей точкой, что означает, что функции столкновения больше не будут округлять нецелые аргументы. Для получения дополнительной информации читайте раздел Режим совместимости при столкновениях.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Саня Рудаков

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

Начнем с монстров гуляющих по платформам. Для них нужно два спрайта, один с монстром, смотрящим влево и другой с монстром, развернутым вправо. После чего создаем объект монстра. В событии создания (creation event) мы позволяем ему двигаться вправо с определенной скоростью. Всякий раз, когда он достигает стены, монстр изменяет свою горизонтальную скорость на обратную. Чтобы нарисовать нужный спрайт, мы помещаем следующий код в событие рисования:
<
if (hspeed > 0)
draw_sprite(sprite_monsterr,-1,x,y)
else
draw_sprite(sprite_monsterl,-1,x,y);
>
Основываясь на значении переменной hspeed (которая определяет горизонтальную скорость) мы рисуем нужный спрайт.

Чтобы избегать падения монстров с платформы, мы вводим другой объект, который назовем маркером (marker). Этим маркером будет невидимый синий блок. Всякий раз, когда монстр касается его, он изменяет направление своего движения на обратное.

Когда персонаж касается монстра, монстр или персонаж должен погибнуть. Чтобы выяснить, что должно произойти, в событии столкновения (collision) персонажа с монстром, мы выполяем следующую проверку:

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

Летящий монстр делается проще. Мы поторяем для него все те же действия. Только в событии столкновения персонажа с летящим монстром, нет никакой проверки.

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

Большинство платформенных игр требуют тщательно выверенных прыжком, чтобы избежать падения в ямы. Падение в яму обычно грозит персонажу гибелью. Чтобы претворит задуманное, мы добавляемся новый объект, названный смертью (death). Этим объектом является красный блок, который мы делаем невидимым. Ты можешь поместить его на дно ямы. (На фоновом изображении ты можешь разместить в яме несколько ьаких объектов). В событии столкновения персонажа с объектом (death) проигрывается звук, затем небольшая пауза и в заключении происходит перезапуск комнаты. Ты можешь также сделать ямы, которые не имеют дна (этакий провал). В этом случае ты добавляешь аналогичное действие в событии (outside) (в других событиях) персонажа, можно вставить проверку y > room_height чтобы удостовериться, что персонаж упал, когда он выпрыгивает за пределы игрового поля.

Саня Рудаков

В большинстве игр платформ играющему приходится помимо всего, собирать всякие предметы. Как правило тебе приходится или собирать некоторые объекты или ловить какие-то предметы. В нашем примере игрок может собирать грибы. Поэтому, нужно создать объект гриба. Для разнообразия, спрайт гриба содержит 10 различных изображений грибов. Объект гриба выбирается наугад во время выполнения события создания. Чтобы добиться этого мы в событии (Create) помещаем действие (X=2) и устанавливаем в нем переменную (variable) image_single и новое значение для данной переменной random(10). В событии столкновения (collision) персонажа с грибом мы проигрывем звук, уничтожаем (destroy) объект (other) и добавляем 10 очков к текущему счету.

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

Конечно же должен существовать способ окончания уровеня, такой, чтобы игрок мог перейти на следующий уровень. Для этого, мы создаем объект (levelexit). Когда персонаж добирается до него, он перемещается в следующий уровень. В примере это сделано довольно просто. Мы всего лишь добавляем тест room==room_last. Если результат теста истинен (true), то мы перемещаемся на следующий уровнень. но так как пример содержит лишь один уровень, а значит мы находимся на последнем и не имеем возможности продолжить игру - вместо этого появляется список лучших игровых результатов и игра будет запущена снова.

Ты можешь сделать так, чтобы объект (levelexit) появлялся только тогда, когда например собраны все грибы. Для этого, в событии создания (levelexit) объекта, помещаем действие (Jump to position) и указываем значение для координат -100, -100 (убираем его с экрана). Теперь в событии шага подставляем действие проверки (If number instances) - выбираем объект гриба равный (equal) значению 0. И если это так, перемещаем объект (levelexit назад) в его исходную позицию - это можно сделать поставив после проверки дейстиве (Jump to start position).
Дополнительные перемещения

Наша текущая игра сожержит лишь некоторые элементарные перемещения. Главный персонаж может двигаться влево и право, и еще может прыгать. Чтобы сделать игру более интересной и более активной, давай добавим в нее еще несколько интересных перемещений. Готовый пример можно найти в файле platform_motions.gmd.
Наклонные ступеньки

Прикольно если бы игрок имел возможность подниматься на наклонным ступенькам (вниз, он будет спускаться автоматически в результате падения). Чтобы сделать это, мы должны изменить код в событии клавиши (left). Печатаем там следующее:
<
for (i=0; i<
if place_free(x-4,y-i) < x -= 4; y -= i; exit; >
>
>
Это должно быть немного сложно для понимания. Данный код пробует все варианты для i от 0 до 8. Для каждого из них он проверяет, является ли позиция x-4, y-i пустой. Если это так, код перемещает персонаж куда следует и отключается. Таким образом программа сначала проверяет, можем ли мы двигаться налево. Если нет, он пробует переместить один пиксел. Если не работает, он пробует два пиксела и т.д. (Мы продолжаем до 8 - позволяя тем самым идти по лестнице). Подобный код должен быть помещен также в событие для клавиши (Right). Это пожалуй и все.
Лестницы

Народ в платформенных играх просто нуждается в различных лестницах, по которым он сможет перемещаться с одной платформы на другую. Это перемещение потребует от нас небольшой работы. Лестница будет представлена узким вертикальным блоком, который является невидимым (настоящая лесенка или виноградная лоза, используемая для восхождения, нарисована при помощи тайлов и не является твердым телом. Когда персонаж не контактирует с лесенкой, его движение должно оставатьс

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