Меню

game maker настройки комнаты

Создание комнаты, персонажа. Пишем систему перемещения без багов.

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

Этот урок рассчитан на новичков в Game Maker Studio 2, которые только начинают его изучение.

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

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

Теперь давайте добавим пару спрайтов в игру. Для персонажа и стены.

Спрайты — графическая часть нашей игры. Спрайты могут быть анимированы. Фоновое изображение, анимация бегущего персонажа, иконки в меню и т.д. Всё это — спрайты.

Тыкаем правой кнопкой по папке «Sprites» в нашем дереве ресурсов и жмём «Create Sprite».

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

Размер изображения настраивается тут:

Либо в графе Resize Canvas, это не принципиально, всё равно изображение пустое.

Resize Canvas меняет размер холста, а Scale Image масштабирует изображение. Ну это я так, вдруг вы английский не знаете.

Теперь жмём «Edit image» и даём волю нашему воображению. У меня получился вот такой прекрасный персонаж:

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

Спрайты созданы. Самое время сделать самое важное — переименовать их! Для этого есть много способов. В окне редактирования, правой кнопкой по спрайту в древе ресурсов, левой кнопкой в том же древе + клавиша F2. Сами разберетесь. Игрока мы назовём spr_player, а стену — spr_wall.

Обратите внимание на приставку «spr_» перед названием. Есть много вариаций для этой приставки, но суть одна — указать, что это спрайт. И это безумно важно, иначе, в лучшем случае, запутаетесь вы, в худшем — GMS. И выдаст ошибку. Подробнее о таких важных мелочах можете почитать здесь

Готово. Вернемся в редактор спрайта нашего персонажа и зададим ему Origin по центру. Жать сюда:

Origin, от английского — «Начало», обозначает для данного спрайта точку, которая отвечает за его положение в пространстве. То есть координаты X и Y у нашего персонажа — это как раз и будут координаты этой точки.

Теперь уж точно спрайты готовы. Давайте создадим объект нашего персонажа. Делается это аналогично созданию спрайта, но, естественно, в группе «Objects». В интуитивно понятном интерфейсе редактора объектов найдём графу «Sprite» и зададим игроку его spr_player. Аналогично поступим и со стеной. Обзовём мы наши объекты «obj_player» и «obj_wall».

Пишем базовую систему перемещения

А сейчас мы приступаем к самому интересному — написанию кода! Откроем редактор объекта нашего obj_player и ткнём на кнопку «Add Event» (Добавить событие). Из списка выберем событие «Create» (Создание).

Подробно о всех событиях в GMS 2, о том, зачем они нужны и когда срабатывают вы можете прочитать в этой статье

Добавим игроку сразу же еще и Step event. Он нам, безусловно, тоже понадобится.

Читайте также:  настройка xdebug phpstorm vagrant

Теперь откроем событие Create и начнем писать туда код! (ура).

Мда. 5 символов? Кто посмел назвать это кодом?

Так, так, погодите, самое интересное еще впереди, я вам гарантирую. Давайте разберемся, что мы вообще сейчас сделали? А сделали мы следующее: Инициализировали (создали) переменную с названием «spd» и присвоили ей значение 3. Что такое переменная?

Как я однажды где-то вычитал: «Переменная, это такая циферка, которая будет меняться, когда мы скажем ей это делать«. Естественно, это неверное определение, но для осознания оно нам вполне подойдет. Давайте на нем и остановимся.

Интуитивно понятно, что «spd» означает «speed», то есть «скорость». Она будет отвечать за скорость нашего персонажа. Мы будем двигать его с этой скоростью и везде, где потребуется указать скорость движения, мы будем писать spd, заместо цифры 3, ибо представьте, что мы написали 200 строчек кода, а затем захотели поменять скорость. Нам что, всё переписывать? — Нет. Мы просто поменяем одну цифру и всё. Мы даже сможем менять скорость по ходу игры.

Едем дальше. Теперь пишем код в Step:

Ctrl+C >> Ctrl+V никто не отменял

if — логический оператор. Подробно об этом можно прочитать в соответствующей статье

keyboard_check() — функция. Лайфхак: если навести мышкой на функцию и нажать на колёсико мыши, то мы увидим справку, в которой чётко будет написано, что она делает. Данная же функция выясняет, нажата ли клавиша, которую мы обозначили в скобках, на клавиатуре. Подробно о функциях в GMS читать тут

vk_. — константа. Не будем вдаваться в подробности. Просто примем как факт то, что vk_right обозначает «Стрелку вправо» на клавиатуре (кнопка такая). Аналогично для всех других vk_.

x = x + spd — операция присваивания. X так же, как и Y — координаты объекта. В нашем случае — игрока. Мы же для него код пишем. Эта строчка обозначает, что наша координата X теперь равна текущей координате + 3 (оно же spd, которое мы задали в Create event’e). Иными словами мы просто прибавляем к координате X переменную скорости. Аналогично для Y.

Последний вопрос, который мог остаться: почему мы отнимаем Y когда двигаемся вверх и наоборот? — Потому что в GMS начало системы координат не в нижнем левом углу, а в верхнем левом. Всего-то.

Теперь суммируем, что тут написано:

Если (Нажата клавиша(Стрелка Вправо)), то < Прибавить к координате X переменную spd >. И так для каждой кнопки перемещения. Почему это написано в Step? Потому что проверять, нажата ли у нас клавиша нужно каждый кадр. Вдруг вы неожиданно отпустите одну клавишу и нажмете другую.

Обрадую вас — теперь персонаж вполне себе двигается. Давайте же поскорей протестируем, как он это делает!

Для этого необходимо сначала создать игровую «команту». Нажмём правой кнопкой на раздел «Rooms» в древе ресурсов и создадим комнату. Обзовём её rm_game. Если у вас найдутся еще какие-то комнаты — удалите их.

Читайте также:  сброс настроек мыши bloody

Теперь два раза ткнём на нашу комнату rm_game чтобы открыть ее редактор. Откроется окно, как на скриншоте. Мне кажется чёрный цвет для фона будет как-то мрачноват, давайте его сменим на какой-нибудь вырвиглазный. Для этого тычем на слой «Backgrounds», а затем на «Colour», как показано на скриншоте.

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

Теперь выберем слой «Instances» в окне редактора, чуть выше найдём вкладку «Resources» для переключения обратно на древо ресурсов и начнём нагло тягать оттуда объекты из группы «Objects». Перетянем один объект игрока obj_player и сколько вашей душе угодно объектов стены. После чего порастягиваем наши стены в окне редактора комнаты, чтобы они были побольше. У меня получилась вот такая вот комната:

Готово! Можно запускать! Скорее жми F5 (либо кнопку Play на верхней панели)

Побегали. Бегается. Но как-то убого, не правда ли? Игра виснет чтоли. Всё это потому что по умолчанию GMS ограничивает игру до 30 кадров в секунду. Давайте же повысим это значение до 60!

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

Мы двигаем нашего персонажа на 3 пикселя вправо, затем на 3 пикселя вверх. Получается, что за один кадр мы пробежали не 3 пикселя, а примерно 4,25 пикселя! (Да, на рисунке опечатка)

Почему? — Вспоминаем (или учим) геометрию за 6 класс. Теорема Пифагорав прямоугольном треугольнике квадрат гипотенузы равен сумме квадратов катетов. В нашем случае треугольник еще и равнобедренный. Да и вообще двигаемся мы по диагонали квадрата. Соответственно диагональная скорость у нас будет немного больше, чем нужно.

Пишем улучшенную систему перемещения

Что делать? Разберемся с этим чуть-чуть позже.

Для начала перепишем код игрока (obj_player) в Step вот так:

Что всё это значит? Ну, сначала мы создаём две локальные (или временные) переменные.

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

Эти переменные — хх и уу. Присваиваем им значения. Они будут равны одному из трех: (-1 ; 0 ; 1). Почему? Потому что функция keyboard_check(), как мы уже выяснили, узнаёт для нас, нажата ли конкретная клавиша на клавиатуре. Если она нажата, то keyboard_check() вернёт единицу. А если нет — 0. (Вы же читали статью про Функции в GMS, да?)

Мы получаем: 1 если нажата только кнопка вправо, 0 если нажаты обе кнопки или не нажата никакая, -1 если нажата только кнопка влево. А это, в свою очередь, получается направление, в котором нам надо двигаться! Положительное, отрицательное или никакое. Аналогично и для Y

Читайте также:  как проверить настройку звуковых устройств

Теперь, имея направление движения мы просто берём, умножаем его на скорость и прибавляем к нашим координатам. x += xx * spd обозначает то же самое, что и x = x + (xx * spd), просто в сокращенном виде.

Попробуем запустить игру снова. Всё работает точно также, как и раньше. Поменялся только код. Результат один, реализация — разная.

Сейчас давайте вернемся к проблеме быстрого перемещения по диагонали. Для ее решения нам потребуется кое-что посложнее, чем теорема Пифагора. Векторы. А это уже целых 9 классов средней школы! Ужас. Взглянем на еще один «Чертеж»

Мы хотим двигать персонажа на spd пикселей (то есть на 3). И не важно, куда он там бежит. По осям или по диагонали.

На «Чертеже» я попытался изобразить три равных по длине вектора. Посмотрите, двигаясь по диагонали нам нужно прибавить к координате X и Y НЕ ТРИ. А сколько? — Вот это вот расстояние, что я отметил синим цветом. В геометрии это называется ужасным выражением: «Проекция вектора на ось«. На чертеже всё гораздо нежнее, приятнее и понятнее, не так ли?

Как же нам найти это расстояние? — Легко! В GMS специально для этого есть две функции. lengthdir_x() и lengthdir_y() для Х координаты и для Y соответственно. Давайте воспользуемся ими и допишем наш код (в последний раз. Почти.)

Запустим игру. О да! Это именно то, что нам нужно. Персонаж теперь двигается так, как нужно. Только вот самопроизвольно начал двигаться направо, когда мы ничего не жмём. Непорядок. Секундочку, сейчас поправим. Только разберемся с тем, что написали.

dir , очевидно, означает direction, то есть направление нашего движения.

point_direction() — функция. Она нам указывает направление (в градусах) от точки (х1,y1) до точки (x2,y2).

И тот самый lengthdir_x/y указывает, на сколько пикселей нужно двинуть нашего игрока по оси Х и Y, чтобы в конечном итоге получилось spd. То бишь 3. Для этого мы даём ей две переменные. Первая — расстояние, на которое хотим двинутся и направление, в котором хотим передвигаться.

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

Ура! Мы самостоятельно написали хороший короткий код для перемещения. Еще и по диагонали двигаемся как надо. Ай да молодцы.

Последний вопрос, который мог остаться — что за || в условии. С != всё ясно. Это значит «Не равно». То есть «Если xx не равно нулю». А || означает «или». Всего-навсего.

То есть «Если ХХ не равно 0 или YY не равно 0, то прибавляем к Х и Y то, что написано». То есть если мы ничего не жмём или же жмём сразу все кнопки, то двигаться наш персонаж не будет.

Ах, ну да. Последнее, всё-таки. Как же настроить управление на, к примеру «WASD», а не стрелочки. Для этого нужно использовать функцию «ord()«. Она возвращает код клавиши, который определяет по букве, что вы указали. Код с движением через «WASD» будет выглядеть так:

источник

Добавить комментарий

Adblock
detector