Блог ☯

понедельник, 13 марта 2017 г.

Основы создания игр: движение - game maker

Приветствую. Не так давно я принял решение сделать серию статей и видео на своём канале в ютуб про создание игр в game maker. Хочу сделать как-бы курс для новичков с нуля - основы создания игр.

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

Основы создания игр: движение - game maker

Если вы работайте в какой-то другой среде программирования и используйте не гейм мейкер (game maker), а например unity, то тут вы тоже сможете найти интересную информацию для себя так-как вне зависимости от среды и движка, принципы везде довольно похожи.

Начнём.

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

В таких программах как game maker (studio, 2 или любом другом) всё это сделать довольно просто и в рамках простейшего объектно ориентированного программирования вы можете сделать движение за пару секунд.

Но для начала давайте поймём пару вещей: кто будет двигаться, зачем как и куда?

Например, обычно нам нужно что-бы враги двигались на героя. да? А герой, часто, двигается при нажатии на стрелки на клавиатуре (или кнопки q, a, s, d), а может быть вам нужно что-бы какой-то кролик рядом просто бегал от дерева к дереву?

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


Функции движения в game maker



Как сделать движение в игре? Если вы только начинаете освоение game maker, то вы можете для ваших первых игр всё сделать вообще без какого либо кода. Гейм Мейкер был придуман как раз для новичков и он позволяет делать простые игры и осваивать всё даже без программирования.

Дальше, конечно, код вам понадобиться, но начать можно и вот с такого:


Основы создания игр: движение - game maker


Самые первые и базовые функции движения в Гейм Мейкер


Простейший пример, как сделать движение героя при нажатии на стрелку вверх?




Вот и всё. Добавляем событие (event) - <UP> и на это вешаем действие (action).

Стрелку вверх, указываем что это относиться к себе (к этому объекту - self), ну и ставим галочку - относительно (relative). Последнее означает что движение идёт относительно текущих координат объекта.

В коде это всё можно сделать вот так:




Как видите и в коде всё очень просто, просто мы меняем координату объекта (героя) на 1 по оси Y. Пишем: y-=1

Какие бывают даже тут ошибки?

Почему минус равно (y-=1), а равно минус (y=-1)?

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

Есть еще один момент, который смущает новичков.


Координаты в Game Maker



Иногда координаты в гейм мейкер могут быть немного непонятными. Возьмём две точки что-бы было понятнее.

Основы создания игр: движение - game maker

Вот как оно идёт.
  • Вверх: Y-
  • Вниз: Y+
  • Вправо: X+
  • Влево: X-
И вот тут иногда бывают непонятки. Почему вверх, это минус, ведь на других осях таких координат по оси Y больше обычно означает - выше?

Дело в том, что координаты комнат в гейм мейкер строятся от точки 0, 0 (X, Y), которая находится в левом верхнем углу. Соответственно движение вверх будет движение ближе к нулевой точке.

Давайте построим две точки с координатами чтобы лучше это понять.

Основы создания игр: движение - game maker

Точка сверху, х = 400 (пол экрана при разрешении 800 на 600), у = 25.

Точна снизу, x = 400 (на той-же линии по вертикали), у = 125 (По горизонтали)

Теперь представьте что наш герой, или например космический корабль, находится в нижней точке. Какую координату нам нужно изменить чтобы он был выше, Х или У? 400 или 125?

Для движения наверх нам нужно будет вычесть координату У.

Например, если вы напишем У-=100, то объект как раз и переместиться в первую верхнюю точку, хотя это на самом деле даже не совсем движение, а это будет как-бы прыжок или даже телепортация.

Однако если над этим помедитировать, то любое движение это по сути и есть вот такие прыжки, просто очень маленькие и быстро. Как фильм это куча кадров, так и движение это просто вот такие мелкие шажки/сдвиги по координате во времени.

Скорость при этом, как вы знаете из физики, означает какое расстояние за единицу времени пройдёт объект. Скорость 5 в нашем случае будет означать что за одну единицу времени объект пройдёт 5 клеток (пикселей).


Что такое скорость и время в играх, да и вообще?



Маленькое отступление. А что такое в Game Maker, да и в играх, вообще время? Мы тут с вами совсем уже в философию даже уходим, но это на самом деле интересно.

Время в играх как и в жизни изменяется, в секундах, минутах и т.д. Однако, есть в трах такая штука как тики. Тик - это единица времени в играх, по сути дела один кадр. Вам станет всё куда более понятно когда я скажу что количество тиков в секунду это означает уже знакомое вам FPS (frames per second - кадры в секунду). Еще это называется - кадровая частота.

Общемировой стандарт частоты киносъёмки и проекции составляет 24 кадра в секунду. Это значит что просто картинка меняется 24 раза за секунду и мы видим это как поток, однако на самом деле картинки меняется очень быстро и наш мозг просто не успевает их вычленять.

Кстати, когда вы снимаете на камеру старый телевизор, то вы видите черные полосы. Знаете про такое? Вот. Чёрные полосы получаются как раз из-за того, что камера снимает быстрее чем кадры меняются в телевизоре.

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

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

Понять про кадровую частоту нам было важно так-как в жизни это всего-лишь скорость смены кадров и всё. А в от в играх так-же самая вещь (FPS), это и есть время!

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

Ну ладно. это не время, FPS - это как-бы скорость течения времени. Я всё еще больше запутал судя по всему...

Представим что наш объект двигается с игровой скоростью 1 (один пиксель за тик), двигается он направо. Стартует он с координаты 0, 300 (слева, середина экрана 800 на 600).

Основы создания игр: движение - game maker

Сколько пикселей такой объект пройдёт за 3 секунды и на каких координатах он будет?

Вот видите, хрен мы это поймём если мы не знает FPS! В играх частота смены кадров сейчас порядка 100 и больше, но иногда можно использовать и 30, и 50 и какую угодно. Чем она больше, чем труднее будет для устройства "переваривать-тянуть" игру.

Если у нас FPS = 50, тогда за одну реальную секунду происходит 50 тиков - 50 действий. И если у вас движение идёт со скоростью 1, то за 3 секунды в таком пространстве объект пройдёт 1 * 50 * 3 = 150 пикселей.

И будет он уже не на координате 0, 300, а на координате 150, 300.

Хотя можно было подумать вначале что скорость 1 это медленно, но это в рамках игры и игровой вселенной (если карта-комната размером 800 на 600) будет очень быстро, если FPS у нас 50.

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

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

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

Всё это мы можем назвать свободным управляемым движением, однако, что если вам мало ходьбы в 4 стороны, а хочется более гибкого управления? Ну даже в такой системе на самом деле вы сможете ходить в 8 сторон! Просто если вы зажмёте кнопки вверх и вправо, то вверх и вправо (Y-, X+) вам персонаж и пойдёт, но иногда нужно больше возможностей.


Движение мышкой и движение к мышке



Иногда нужно сделать движение мышкой или например движение к мышке. Тут могут быть очень разные ситуации, допустим вы делайте стратегию, или же например вам нужно что-бы пули летели туда, куда вы указывайте мышкой. Либо же например если у вас игра на телефон, то мышка в game maker это будет на самом деле - палец. То есть куда вы тыкайте, то и мышка, если это телефон или планшет. Игры в game maker можно писать не только на компьютер.

Тут уже всё только кодом, да и вообще - дальше всё уже только кодом. Но пугаться кода не следует, не так уж и долго его осваивать (хотя я сам на 100% еще не освоил его даже).

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


Синий герой тут двигается именно туда, куда вы тыкайте мышкой. Делалась игра на телефон и до сих пор валяется в google play.

Тут был выбор (и я это тоже делал), либо делать контролер как в приставках - то есть небольшую область экрана кругом, через которую вы будете управлять. Либо тупо сделать что герой идёт туда, куда вы тыкайте пальцем (или мышкой). Я выбрал второй вариант.

Это пишется легко, одной функцией:

Основы создания игр: движение - game maker


Функция:
mp_linear_step(mouse_x,mouse_y,h_speed,false)
Синим я выделали скорость (h_speed), в данном случае она является локальной переменной, но она может быть и глобальной, а можно там просто написать например цифру 5 и не заморачиваться, на данный момент.

false - переводиться как ложь (true - правда, истина). Это часто используется в програмировании и иногда заменяется на 1 и 0, где 1 - да, а 0 - нет. Это как бы и есть язык программирования, когда вы говорите на языке машины, которая понимает именно так.

В данном случае ложь (false) в этой функции означает проверку стен ну и она отключена. Пока давайте этого не касаться.

mouse_x,mouse_y - это координаты движения (куда вам нужно двигаться), в данном случае мы двигается на координаты мышки.

Абсолютно так-же делается куча других вещей, например пуля летит в прицел (в 2D играх) примерно так-же, если прицел там-же где и мышка или просто картинка мышки (спрайт) это и есть прицел.

Так сделано например в моей игре TDS, для которой я кстати даже исходник выкладывал.


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


Основные функции движения в Game Maker



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

  • distance_to_object
  • distance_to_point
  • motion_add
  • motion_set
  • move_towards_point
  • move_bounce_all
  • move_bounce_solid
  • move_contact_all
  • move_contact_solid
  • move_outside_all
  • move_outside_solid
  • move_random
  • move_snap
  • place_snapped
  • move_wrap

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

Так-же бывает что я использую:

  • hspeed - горизонтальная скорость
  • vspeed - вертикальная скорость
  • speed - скорость

Допустим при создании объекта (create) мы может просто написать в коде hspeed=1, и тогда у него сразу будет скорость 1, он начнёт движение направо. Иногда нужны и такие вещи.

А вот "speed" нужно довольно часто, так-как с помощью этой штуки можно не просто указывать скорость, её так-же можно еще и проверять. Например писать:
if speed>0 then ...
Если скорость больше 0 (объект не стоит на месте, двигается) тогда... (Делать что-то).

Так-же почти во всех функциях движения вы можете просто писать "speed", а при создании этих объектов задавать эту самую скорость в create. Это будет просто локальная переменная и так её проще менять для некоторых ситуаций.

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

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

Какие-то азы поведения врагов (слух, зрение) вы можете прочитать в моей статье:


Так-же про это есть видео.

Последнее на сегодня это функция - move_towards_point


Функция движения к точке в Game Maker



Основная функция движения в game maker, которой лично я пользуюсь довольно часто, это:
move_towards_point
Движение к точке.

Она простая и понятная, в ней есть 3 составляющих. Синтаксис такой:
move_towards_point( x, y, sp );
X, Y - это понятно, к какой конкретно точке нам двигаться. А SP - это скорость.

Как двигаться не к точке, а к конкретному объекту? Например, как зомби будет бежать на героя? Вспомните как делается движение к мышке, тут всё почти так-же.

Если объект герой у нас называется - obj_hero

Тогда у нас получается:

move_towards_point( obj_hero.x, obj_hero.y, 5 );

Если вы это пишите в create - при создании объекта, тогда он будет идти на героя с этой скоростью, однако, он будет идти в координаты которые герой имел при создании этого объекта (зомби). Как следствие, преследовать героя и бегать за ним зомби не будет.

Писать эту функцию в create бывает полезно когда движения объекта точно не будет меняться дальше, например для пуль. Пули могут мазать и они летят туда, куда вы целились. Конечно, фантазёры могут придумывать самонаводящиеся пули или например какие-то ракеты с тепловым наведенем, но что-бы объект следовал за целью всегда, эту функцию нужно писать е в create, а в step.

Step (шаг) - выполняется каждый тик. Если FPS = 30, то в секунду у нас будет выполнена эта функция 30 раз. В данном случае 30 раз в секунду будет меняться координаты цели, к которой осуществляется движение.
По хорошему нужно бы мне написать про все эти действия в game maker (draw, create, step), но они довольно просты и скорее всего я не буду покрывать этот момент. 

Основы создания игр: движение - game maker


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

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

ля этого дайте ссылку на эту статью друзьям, поставьте тут лайк (под статьёй) ну и ставьте лайки и делайте репосты когда я такие статьи публикую в своём паблике. Я вам буду очень признателен (если вы туда еще не вступили, вступайте).

Я планирую сделать про это видео в ближайшее время, так что можете потом посмотреть еще и его на моём канале в YouTube - Econ Dude.

В следующей статье про движение будет:
  • Планирование пути
  • Условия движения и проверка расстояний (distance_to_object)
  • Избегание препятствий
  • Гравитация 
Ну и сделал по этому теме видео на моём канале (14 мин). Можете посмотреть: