Как сделать рандом в game maker

Обновлено: 03.07.2024

Это небольшая статья об конструкции with и способах её применения. Предполагается, что вы уже знаете о gml и его синтаксисе, понимаете разницу между объектом и его образцами (образцы объекта), а также знаете о специальных объектах other, all, noone, self.

Примечание: Поскольку в txt2 нет разметки gml-кода, я взял на себя труд выделить ключевые слова, так, как они выглядят по-умолчанию в самом gml, чтобы код выглядел более-менее читабельным.

Конструкция with имеет несколько применений. Первоначальное применение - конструкция предназначена для выполнения одинаковых действий над всеми образцами объекта, имя которого указано в . То есть, по сути, это особая форма цикла.

Как видно из примера, конструкция в цикле переберёт все образцы объекта obj_ball которые есть в комнате и передвинет их по оси х на 5 единиц вправо.
Кроме того, все действия и переменные, которые выполняются в конструкции with становятся локальными для образца в цикле, а образец, который вызвал with - внешним, и внутри самой конструкции к нему уже нужно обращаться как специальному объекту other .

Конструкция имеет другое важное применение. Она может служить для идентификации конкретного образца, и выполнению над ним действий из другого объекта. Как известно, в gml есть функции, которые работают только для конкретного образца объекта - для того, из которого его вызвали. Примером может служить функция instance_destroy() которая не имеет параметров, и уничтожает тот образец, из которого его вызвали (кстати, единственная функция, которая удаляет объекты).

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

Пример 1

Например, при взрыве (событие destroy) объекта "ракета" (obj_rocket), нужно нанести урон ракеты (damage) всем юнитам (obj_unit) в радиусе 150, и у тех, у кого здоровья (current_hp) меньше нуля - уничтожить.

with ( obj_unit ) //Начало цикла
if( distance_to_object (other. id ) //как видно, функция distance_to_object() возвращает расстояние от юнита до ракеты, а не наоборот, так как внутри конструкции они меняются местами, и теперь obj_rocket=other.id
current_hp-=other.damage //По сути, это сам юнит наносит сам себе урон, а урон мы берём из объекта ракеты.
if(current_hp instance_destroy () //Вот тут юнит уничтожит сам себя, если его здоровье ниже нуля.
>
>
>

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

Пример 2

Пример 3

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

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

Перемещение (Moving around)

Очевидно, что важным аспектом игры является перемещение по игровому миру образцов объекта. Каждый образец имеет две встроенных переменных x и y, которые указывают местоположение образца. (Если быть точным, они указывают место c началом координат, где помещен спрайт. Позиция (0,0) - верхний левый угол комнаты. Ты можешь изменять позицию образца, изменяя его x и y переменные. Если ты хочешь, чтобы объект выполнял сложные перемещения, то данный способ вполне подходит. Ты обычно помещаешь данный код в событие шага (step event) для объекта.

Если объект двигается с постоянной скоростью и направлением, то существует более простой способ сделать это. Каждый образец объекта имеет горизонтальную скорость (hspeed) и вертикальную скорость (vspeed). Обе эти переменные обозначаются в пикселах на шаг. Положительная горизонтальная скорость означает движение направо, отрицательная горизонтальная скорость означает движение налево. Положительная вертикальная скорость - вниз и отрицательная вертикальная скорость - вверх. Таким образом ты должен установить эти переменные только единажды (например в событии создания) определив образцу объекта постоянное движение.

Доступно несколько различных способов для определения движения: использование направления (в градусах 0-359), и скорости (должна быть не-отрицателеной). Ты можешь устанавливать и читать данные переменные, чтобы определить произвольное движение. (Внутренне они изменяются в значениях для hspeed и vspeed). Также имеется трение (friction) и гравитация (gravity) и направление гравитации (gravity direction). Наконец, существует функция motion_add(dir,speed) для добавления движение к текущему.

    x - Его x-позиция.
    y - Его y-позиция.
    xprevious - Его предыдущая x-позиция.
    yprevious - Его предыдущая y-позиция.
    xstart - Его стартовая x-позиция в комнате.
    ystart - Его стартовая y-позиция в комнате.
    hspeed - Горизонтальная составляющая скорости.
    vspeed - Вертикальная состовляющая скорости.
    direction - Его текущее направление (0-360, против часовой стрелки, 0 = направо).
    speed - Его текущая скорость (пикселей на шаг).
    friction - Текущее трение (пикселей на шаг).
    gravity - Текущее значение гравитации (пикселей на шаг).
    gravity_direction - Направление гравитации (270 - вниз).
    motion_set(dir,speed) - Устанавка движения с заданной скоростью (speed) в направлении dir.
    motion_add(dir,speed) - Добавить движение к текущему движению (как векторное добавление).

move_random(hsnap,vsnap) - Перемещает образец в свободную случайную, фиксированную позицию, подобно соответствующему действию.
move_snap(hsnap,vsnap) - Фиксирует образец, подобно соответствующему действию.
move_towards_point(x,y,sp) - Перемещает образцы со скоростью sp в позицию (x, y).
move_bounce_solid(adv) - Рекошет от твердых образцов, подобно соответствующему действию. adv указывает, использовать ли усовершенствованый рекошет (advance bounce), во внимание также берутся наклонные стены.
move_bounce_all(adv) - Рекошет от всех образцов, а не только от твердых (solid).
move_contact(dir) - Перемещает образец в направлении, пока не достигнута контактная позиция. Если в текущей позиции не имеется никакого столкновения, образец помещается непосредственно перед тем, как столкновение произойдет. Если столкновение уже имеется, образец перемещается в первую позицию, где больше не имеется никакого столкновения.

distance_to_point(x,y) - Возвращает расстояние ограничивающего поля текущего образца к (x, y).
distance_to_object(obj) - Возвращает расстояние образца к самому близкому образцу объекта (obj).

Очень долго мучался с этим вопросом и наконец набрел на твое видео.
Лови лайк и подписку.
Спасибо.

Error in Object object2, Event Key Release , Action 1 at Line 2, Position 26: Symbol ) expected.
message=irandom_range(1,2);
if message=1 (show_message "AK-47");
if message=2 (show_message "Коммандо");

Слушай, пожалуйста сделай урок, про анимацию персонажа.
То есть полную анимацию

Делаю игру про Рыбалку. Вот надо сделать рандомную глубину и так, что бы ловилась рандомная рыба рндомного веса.

как сделать рандом что бы по комнатам было перемещение?

а можно сделать так чтобы делались к примеру аптечки или боеприпасы

Спс что рассказал как рандом сделать

на пяти закончилась фантазия
XD

а как сделать рандом спрайта? ну я хочу что бы после нажатии кнопки выходил рандомный спрайт

Поправка: если объекта два, то надо так: massage = irandom_range(1,2);
if massage = 1 ;

+Ернар Ахметов наверно так:

проверял, просто так без объекта спайт не отрисовывается. Принцип то одинаковый и вместо "show_massage" из урока можно любое условие задать.
Автор отлично рассказывает!

Как зделать так что-бы создавался предмет в рандомных указаных местах

Ты живой? Если да ответь

move=irandom_range(1,2)
if move=1
if move=1
что не так

всё))) второй раз проверяй равность 2, а не 1 и x-=sp2

а как сделать рандом картинки ну чтобы вместо слова выходила картинка

есть вариант без кода, но там можно создать рандом только до 4 спрайтов

нет, я пытался но выбивает ошибку. Наверное нужно по другому

+LINKER BOY наверно в место написать как то наверно так,точно сказать ен могу ,но суть такова

@LINKER BOY Не как

слушай я ушел дальше У меня есть враги которые имеют оружие я сделал так чтоб они выдовались каждому врагу рандомно но прикол в том что оно меняется каждую секунду

сделай переменную gun_give = 'yes' в создании, а в код, который выполняет рандомный выбор оружия укажи, что он работает только если она равна 'yes' и при этом меняется на 'no'

Спасибо ато я не мог мне в игре я захотел сделать интерестное меню! патом дам ссылку на игру! КОГДА СДЕЛАЮ!

В Game Maker каждый объект может иметь набор событий, которые запускают выполнение определённых действий. Всё. Вся "логика" игры строится именно по этому принципу. Если происходит определённое событие - выполняются созданные для него действия. Просто, не так ли? Эти события могут быть как персональными, так и глобальными, но в GM они никак не разделяются на типы, оно и к лучшему. Вы можете создавать для разных объектов разные события и определять какие угодно действия. Именно таким образом и будет работать вся ваша игра.
События создаются и редактируются в окне объекта, в поле-списке "Events", с помощью трёх кнопок "Add event" (Создать событие), "Destroy" (Удалить событие), "Change" (Сменить событие с сохранением списка действий), или в контекстном меню поля с аналогичными командами. В контекстном меню добавляется дополнительная команда "Duplicate event", которое лишь копирует список действий, а событие вам всё равно придётся выбрать заново.

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

Итак, создаём событие, кликая по волшебной кнопочке. Открывается крохотное, в прямом смысле этого слова, окошко со всеми событиями GM. Некоторые события при нажатии на свою кнопку открывают контекстное окно, в котором вам предлагается уточнить событие, выбрать его определённый вид.

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

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

Описание событий или "Я не придумал ничего лучше"

Давайте по порядку, как на картинке, я опишу события и их виды.

  • Create - всё просто, это событие выполняется, когда создаётся экземпляр объекта. Обычно используется, чтобы задавать "начальные" характеристики объекта, всякие там переменные и т.д., но может иметь и более широкое применение. Например, объекты, которые вы расположили в комнате через редактор, тоже создаются, когда комната запускается. Можно использовать такие объекты для объявления глобальных переменных и прочего и прочего. Однако, для таких как я, были созданы такие события, как Game Start и Room start, о которых речь ниже.
  • Destroy - ещё проще, это событие выполняется, когда экземпляр объекта удаляют. Можно применить, например, чтобы создать кровавое пятно на месте врага.
  • Alarm - а вот это уже интересней. Это событие таймера. Каждый экземпляр объекта может заиметь до 12-ти таймеров, каждый их них будет подписан в списке событий как Alarm0, Alarm1, Alarm2 и т.д. С помощью определённого действия или кода, можно запустить нужный таймер и по его истечению, выполнятся нужные действия я иногда использовал алярмы чтобы персонажи моргали глазами :3 , диапазон применения - очень широк, иногда даже 12-ти таймеров не хватает.
  • Step - событие "шага", архиважное событие, находит применение практически всегда. Вам нужно перемещать объект за курсором? Вам нужно событие "шага". Нужно постоянно перемещать образцы по координатам? Вам нужно событие "шага". Нужно отследить монстров на наличие бафов? Вам нужно событие "шага". Это событие выполняется "постоянно", то есть, каждый игровой "шаг". Как его определить? В окне комнаты есть такое поле, как "Room speed" - это скорость комнаты, и по сути, скорость игры, т.е. FPS - количество кадров в секунду. Так что, если у вас скорость текущей комнаты 60 fps или шагов - событие "шага" будет срабатывать 60 раз в секунду. Вуаля. Рассмотрим виды этого события:
  • Step - самое распространённое событие, срабатывает как раз после событий создания и уничтожения, но перед всеми остальными. Очень удобно отлавливать этим событием кнопки клавиатуры или мышки.
  • Begin step - это событие шага срабатывает перед всеми остальными событиями, хотя в списке оно и идёт где-то посредине.
  • End step - это событие шага срабатывает после всех остальных событий, но перед событием рисования.
  • Collision - событие "столкновения". Срабатывает, когда спрайт или маска объекта пересекаются со спрайтом другого объекта. В контекстном меню это событие предлагает выбрать с каким объектом нужно чтобы текущий объект сталкивался. Потому этих событий может быть много - для каждого из предопределённых объектов. Самое распространённое применение - столкновение пули со стеной, конечно же.
  • Keyboard - событие нажатия на кнопку клавиатуры. Но не обычное. Это событие срабатывает каждый шаг, пока кнопка нажата. Предлагает на выбор множество различных кнопок, от алфавитных до функциональных и прочих Backspace'ов. Потому это событие может быть у объекта не одно - зависит от количества кнопок, нажатия на которые вам нужно отлавливать. Стоит отметить лишь событие Keyboard - No key и Keyboard - Any key. Первое срабатывает постоянно, каждый игровой шаг, пока не нажата ни одна кнопка. Второе - срабатывает постоянно, пока нажата любая кнопка на клавиатуре. Наркомания, не так ли? Эти два вида событий есть и у других событий клавиатуры, о которых речь ниже.
  • Mouse - это все события мышки. Давайте рассмотрим их виды:

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

  • Left/Right/Middle button - события мышки, которые срабатывают каждый шаг, пока курсор наведён на спрайт объекта и при этом зажата левая/правая кнопка мышки или колёсико. Да-да, колёсико мышки бывает кликабельное.
  • No button - аналогично предыдущим, только событие срабатывает постоянно, пока не нажата ни одна из кнопок мышки (не стоит забывать, что курсор всё ещё должен быть на спрайте, поскольку это персональные события).
  • Left/Right/Middle pressed/released - эти события отличаются от предыдущих тем, что срабатывают лишь один раз, когда кнопка мышки нажата (pressed)/отпущена (released), а курсор находится на спрайте объекта. Когда событие сработало один раз, оно не будет срабатывать, пока пользователь не нажмёт/отпустит нужную кнопку ещё раз.
  • Mouse enter/leave - событие срабатывает, когда пользователь наводит/уводит курсор со спрайта или маски объекта. Очень удобное событие чтобы делать, например, всплывающие описания для предметов.
  • Mouse wheel up/down - эти события срабатывают, когда пользователь прокручивает колёсико мышки вверх/вниз. Глобальное событие.
  • Global mouse - а вот это уже очень важные события, которые отлавливают события шага/нажатия/отпускания кнопок мышки на общем уровне, т.е. событие глобальное, и потому не нужно, чтобы курсор находится на спрайте объекта. Находят применение чаще всех остальных.
  • Joustick 1/2 - честно говоря, никогда ими не пользовался. Это события для буржуйских джойстиков - когда нажата нужная ось или кнопка.
  • Other - прочие события, которые не вошли в основные категории событий. Вот они:

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

  • Outside room - событие срабатывает, когда объект покидает границы текущей комнаты. Можно использовать, например, для удаления таких образцов.
  • Intersect boundary - событие срабатывает, когда спрайт объекта пересекает границу комнаты.
  • Outside/Boundary view X - аналогично предыдущим двум событиям, только для одного из семи доступных видов (проще - игровых камер).
  • Game start/end - из названия понятно, что эти два события срабатывают лишь по одному разу за игру - в её начале и в конце. Это глобальные события, обычно используются для инициализации игровых данных. Часто game end используется чтобы закрывать dll'ки и удалять прочие непотребства из памяти, даже не смотря на то, что GM большинство из таких операций делает автоматически.
  • Room start/end - аналогично предыдущим, только для игровых комнат. В GM комнаты - это, по сути, игровые уровни. Так вот, эти события срабатывают, когда текущая комната запускается/заканчивается. Стоит помнить, что событие может срабатывать многократно, поскольку игрок может выходить/возвращаться в комнату. Тем более, нам не важно, какая это комната, поскольку мы сможем написать нужное условие на проверку имени/номера текущей комнаты, перед выполнением нужных действий.
  • No more leaves/health - это события для встроенных в GM систем здоровья и жизней, события срабатывают, когда они заканчиваются (равны нулю). Не понятно, кто ими пользуется, ведь намного проще объявить две-три переменных и сделать свою системку здоровья.
  • Animation end - это событие также для встроенной в GM системы анимаций. По сути - срабатывает когда все кадры у спрайта объекта проигрываются до последнего. Иногда полезно, но снова же, проще написать свою гибкую систему анимаций.
  • End of path - событие срабатывает, когда объект подходит к концу пути. Тоже иногда полезно.
  • Close button - событие срабатывает, когда нажимают кнопку закрытия игры - т.е. на крестик окна игры. Это же событие должно срабатывать и для кнопки Esc, если в настройках игры установлена такая возможность.
  • User defined X - это пользовательские события, их доступно до 16-ти штук. Срабатывания этих событий можно выполнить лишь через код, с помощью специальной функции. Редко, но находят применение.
  • Draw - вот мы и подобрались к самому интересному событию. Это событие "рисования". В своё время никак не мог понять, что оно делает и как им пользоваться, но когда разобрался, приятно удивился. Итак, событие рисования. Когда вы добавляете его объекту, он перестаёт отображать свой стандартный спрайт, не смотря на то, что события столкновения срабатывают как прежде, по сути делает объект невидимым. Это событие срабатывает каждый шаг и предназначено для динамической перерисовки. Вы делаете свою систему анимаций и нужно нарисовать спрайт персонажа? Вам нужно это событие. Вам нужно отобразить текст на экране или создать свой интерфейс? Вам нужно это событие. Вы хотите, чтобы у ваших юнитов были полоски здоровья, а при наведении на них курсора отображались всплывающие подсказки? Для всего этого существует событие рисования. Только сюда можно добавлять действия и функции рисования (обычно начинающиеся с draw_, например, draw_sprite() или draw_text() и т.д.), чтобы они работали. Кстати, поскольку это событие также срабатывает каждый шаг, после всех остальных событий (перерисовка объекта происходит в самом конце каждого шага, уже после того, как его изменили и переместили в новую позицию), поэтому его можно использовать вместо события Step, хотя это и не рекомендуется. В общем, мощнейший инструмент, нужен всегда и везде.
  • Key pressed и следующее за ним Key released - события нажатия/отпускания кнопок клавиатуры. В отличии от указанных выше событий Keyboard, срабатывают не каждый шаг, а лишь один раз, после чего пользователь должен отпустить/нажать кнопку снова. Используются чаще всего, например, для управления персонажем/машинкой/т.д.
  • Trigger - это новый вид событий, который появился в Game Maker 8. При добавлении этого события открывается окошко редактирования триггеров - это новый ресурс GM, хоть их и нельзя добавлять в структуру игры напрямую. В этом окошке вам предлагается в виде кода прописать условие, которое будет проверяться каждый шаг, и событие будет выполняться тогда, когда условие истинно, т.е., по сути, триггеры - это одна из модификаций события Step. Вы можете написать туда не только условие, но и вообще какой угодно код, который будет выполняться каждый шаг. Уже не говоря, что к этому событию можно и нужно добавлять действия в списке действий. Не очень понятно, зачем они нужны, ведь тех же самых результатов можно добиться, используя событие Step. По-видимому, они позиционировались как уникальные пользовательские события. Но раз их добавили - значит, иногда они всё-таки очень нужны.

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

Итого, вот и все события, которые есть в Game Maker, но их хватит на все случаи жизни. Поскольку каждому объекту можно задать свой набор событий, это заметно упрощает построение логики игры, позволяет реализовать тот или иной момент разными способами. Такая гибкость наравне с объектами - фишка GM, и одновременно - его наказание, поскольку многие моменты приходится реализовать вручную, которые уже встроены по-умолчанию в другие конструкторы. Также, поскольку каждому событию можно задать список действий, нужно рассмотреть стандартные действия, т.е., привычные каждому модмейкеру на варкрафте гуи-иконки, так называемые библиотеки стандартных действий.

Стандартные действия или "Почему я всё ещё это читаю?"

Итак, вы добавили объекту событие. Теперь, в соседнем поле "Actions" вы можете добавлять действия, которые просто перетягиваете из панельки с закладками справа в список. Все действия выполняются в порядке расположения в списке - сверху вниз. Их можно перетягивать вверх-вниз, копипастить и так далее.

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

При перетягивании большинства действий открывается окно настроек этого действия - там вы задаёте все нужные данные. Редактирование уже добавленного действия выполняется последствием двойного клика на иконку в списке.
По-моему, проще некуда. Хотя, на самом деле, продвинутому пользователю нужно всего одно действие - блок кода "Code" на закладке "Control", нужно рассмотреть все стандартные действия, хоть это и не очень удобный и громоздкий способ задавать логику игры.

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