Найти тему
Игровой движок Godot engine

№53. AnimatedSprite. Анимированный спрайт.

ВНИМАНИЕ !
Если вы делаете платформер, не используйте показанный тут код. Он написан для примера работы с анимированным спрайтом.
В платформерах, для управления персонажем обычно используется нода
KinematicBody2D со всеми вытекающими из этого изменениями.
Почитать про неё можно
вот тут.
----------------------

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

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

Добавляем в сцену AnimatedSprite , заходим с инспектор и жмем New SpriteFrames

Откроется меню работы с анимированными спрайтами.

-2

Добавить в редактор можно как покадровую анимацию, так и спрайт таблицу (spritesheet — одна картинка на которой собраны в виде таблицы все кадры анимации).

У меня анимация покадровая. Так что просто дропаем из ресурсов кадры в окно редактора.
Начнем с анимации «idle» (стоим на месте).

По умолчанию первой анимации присвоено имя default. Поменяем его на «idle»

-3

У нас всего два кадра. Скорость проигрывания регулируется через значения Speed .
Ну а
Loop — это зацикливать анимацию или нет.
В инспекторе ставим галочку возле
Playing и сможем наблюдать анимацию во вьюпорте.

-4

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

-5

В редакторе анимации всё настроили, теперь можно начинать писать код.

Код.

Я создал скрипт прямо на ноде AnimatedSprite . И заранее создал привязку к кнопкам .
Влево — кнопка «A», вправо — «D», удар — пробел.

Движения персонажа будем кодить в функции _process. По понятным причинам.
Атаку вынесем в _input.

Итак код для движения :

-6

Результат:

-7

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

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

-8

Результат:

-9

Всё выглядит неплохо. Осталось прикрутить атаку.

Переходим в функцию _input. И пишем код.

-10

Запускаем игру — и ничего не происходит.

А всё потому, что в процесс у нас висит условие — если не нажато влево или вправо играть анимацию «idle».

Исправим это.
Добавляем переменную
state . Она будет содержать инфу о том, играет ли в текущий момент анимация атаки. И если это так, то анимация «idle» просто не включится.

Добавим в код эти правки, и посмотрим что будет происходить.

-11
-12

Теперь новая проблема — после атаки наш перс не переходит обратно в «idle».
Причина — мы не указали когда переключить переменную state обратно в false.
А переключать её надо тогда, когда закончит играть анимация атаки.

И тут есть два пути. Первый это привязать сигнал animation_finished . Второй это просто проверять номер кадра текущей анимации.

Мне проще сделать по второму пути. Посему дописываем код.

-13

Ну и в результате всё работает как и запланировано.

-14

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