Привет, друг!
Продолжаем наш цикл руководств для разработки своей SmashTV-style игры в Gamemaker!
Итак, мы остановились на том, что у нашего игрока появилась возможность передвигаться, но при этом он всё ещё не обладает анимацией. Мы нарисовали пару спрайтов. Пора их использовать!
Для начала создадим еще одну необходимую переменную в событии “создать” нашего oPlayer. Назовем ее localFrame. Эта переменная будет отвечать за наш первый кадр в анимации. Анимация начинается с самого начала, а в программировании 0 - это и есть начало. Начнем с самого первого кадра нашу анимацию.
Далее напишем в событии “шаг” oPlayer новые строчки.
Добавим переменную _oldSprite. Перед ней поставим “var” - это слово позволит следующую переменную сделать локального типа. По умолчанию переменные видны во всей игре и закреплены за объектами. Но локальные переменные расходнуют меньше памяти, так как существуют только в событиях. Это то, что нам нужно, ведь использовать переменную _oldSprite мы не собираемся за пределами нашего кода с анимацией в этом событии.
Скажем, что переменная равна sprite_index. Это тоже переменная, но зеленая. То есть, встроенная. Это значит, что эта переменная существует сама по себе с самого начала нашего проекта. Sprite_index - это какой у объекта сейчас используется спрайт.
Значит, мы поместили спрайт, который сейчас используется в новую переменную. Эта информация нам пригодится.
Затем добавим проверку “если”. Это одна из самых легких логических конструкций, которую мы используем и в повседневной жизни. “Если я коснулся горячего чайника - отдерни руку.” Также и тут используется самая обычная логика.
Напишем, что ЕСЛИ(if) inputMagnitude НЕ равна 0, то направление(direction) нашего игрока будет равно переменной inputDirection, которую мы создавали на прошлом уроке. А sprite_index - его спрайт будет равен spriteRun - переменной, которая хранит в себе спрайт бега персонажа.
Выходит очень логично, неправда ли? Если персонаж не стоит на месте, а перемещается, то сделай его спрайт не стоящим, а бегущим.
Обрати, друг, внимание на строение конструкции “if”
После него пишется условие в круглых() скобках, а затем выполнение действий, если условие оказалось верным, но уже в фигурных{} скобках.
Теперь добавим “else” - “иначе”. Иначе наш спрайт_индекс будет равен стоячему spriteIndle. Верно?
Кроме этого добавим, что если старый спрайт отличается(не равен) текущему спрайту, то локалФрайм(текущие кадры) будет равен 0.
Теперь вместо того, чтобы писать код дальше, мы его засунем в Функцию(Скрипт).
Это позволит нам использовать этот фрагмент кода сколько угодно раз, просто вызывая его по названию! (Важно, что у вас PlayerAnimateSprite загорится сиреневым, как переменная. Чуть позже она загорится оранжевым и станет функцией).
Создаем скрипт как обычно правой кнопкой по папке “Скрипты” - Создать - Скрипт.
Появляется новое окно для написания кода.
Почистим его и назовем нашу Функцию тем же именем, чтобы наша функция загорелась оранжевым и заработала.
Теперь напишем немного кода.
Добавим новую переменную _totalFrames. Она будет отвечать за количество кадров на одну сторону. Напомню, что мы рисовали в одном спрайте сразу 4 стороны, чтобы облегчить нам рисование спрайтов. Поэтому нам придется не только указывать, какой сейчас спрайт, но и какие из 4 сторон отрисовывать.
С помощью функции sprite_get_number узнаем сколько вообще кадров в текущем спрайте, а потом делим на 4.
Затем добавим строчку, которая ставит нужным нам кадр.
image_index - переменная, отвечающая за то, какой кадр из спрайта сейчас воспроизводится.
Скажем, что image_index равен localFrame(он у нас равен 0) +
round(direction/90) * _totalFrames.
Это значит, что мы начинаем счет с первого кадра на каждую из сторон.
Подставим значения и убедимся!
image_index = 0 + 90/90 * (16/4). Выходит 4.
Это значит, что отрисовка спрайта для похода наверх будет с 4. Всё работает исправно!
В конце добавим, что localFrame тоже обновляется согласно скорости анимации / количество кадров в секунду. Обычно, это 60 кадров в секунду.
Теперь добавим, что если анимация закончилась для конкретной стороны, нам надо начать с начала, но не с самого начала спрайта, а с конкретного кадра!
Так, напишем, что если localFrame больше или равен _totalFrames(в моем случае он равен 4), то переменная animationEnd = true, а localFrame уменьшается на количество _totalFrames, то есть на 4 в нашем случае. Шикарно!
Иначе анимацияЭнд = false;
Теперь проверим, засветился ли наша функция внутри события “шаг” у объекта oPlayer!
Все работает, если скрипт назван также. Можно проверять!
В следующем руководстве я расскажу, как сделать такие же тайлы для нашей комнаты, и как оформлять наши локации! Peace!