ВНИМАНИЕ !
Если вы делаете платформер, не используйте показанный тут код. Он написан для примера работы с анимированным спрайтом.
В платформерах, для управления персонажем обычно используется нода KinematicBody2D со всеми вытекающими из этого изменениями.
Почитать про неё можно вот тут.
----------------------
В этой статье разберемся, что такое AnimatedSprite .
Создадим персонажа, подключим к нему простенькое управление, и свяжем это всё вместе.
Персонаж будет бегать влево и вправо, стоять на месте, и атаковать.
Добавляем в сцену AnimatedSprite , заходим с инспектор и жмем New SpriteFrames
Откроется меню работы с анимированными спрайтами.
Добавить в редактор можно как покадровую анимацию, так и спрайт таблицу (spritesheet — одна картинка на которой собраны в виде таблицы все кадры анимации).
У меня анимация покадровая. Так что просто дропаем из ресурсов кадры в окно редактора.
Начнем с анимации «idle» (стоим на месте).
По умолчанию первой анимации присвоено имя default. Поменяем его на «idle»
У нас всего два кадра. Скорость проигрывания регулируется через значения Speed .
Ну а Loop — это зацикливать анимацию или нет.
В инспекторе ставим галочку возле Playing и сможем наблюдать анимацию во вьюпорте.
Добавим анимации бега и атаки. Но в анимации атаки нам надо будет снять галочку Loop, так как удар должен проиграться единажды.
В редакторе анимации всё настроили, теперь можно начинать писать код.
Код.
Я создал скрипт прямо на ноде AnimatedSprite . И заранее создал привязку к кнопкам .
Влево — кнопка «A», вправо — «D», удар — пробел.
Движения персонажа будем кодить в функции _process. По понятным причинам.
Атаку вынесем в _input.
Итак код для движения :
Результат:
Как видим персонаж двигается , но он всегда бежит, и всегда направлен в одну сторону.(в вашем случае может проигрываться другая анимация. Но так как у меня выбрана в инспекторе именно эта, то при запуске будет играть именно она)
Исправим это. Укажем что во время движения будет играть анимация бега, и будем переворачивать спрайт в зависимости от направления.
Результат:
Всё выглядит неплохо. Осталось прикрутить атаку.
Переходим в функцию _input. И пишем код.
Запускаем игру — и ничего не происходит.
А всё потому, что в процесс у нас висит условие — если не нажато влево или вправо играть анимацию «idle».
Исправим это.
Добавляем переменную state . Она будет содержать инфу о том, играет ли в текущий момент анимация атаки. И если это так, то анимация «idle» просто не включится.
Добавим в код эти правки, и посмотрим что будет происходить.
Теперь новая проблема — после атаки наш перс не переходит обратно в «idle».
Причина — мы не указали когда переключить переменную state обратно в false.
А переключать её надо тогда, когда закончит играть анимация атаки.
И тут есть два пути. Первый это привязать сигнал animation_finished . Второй это просто проверять номер кадра текущей анимации.
Мне проще сделать по второму пути. Посему дописываем код.
Ну и в результате всё работает как и запланировано.
Как видим ничего сложного тут нет, все методы описаны в справке.
Могу только отметить, что в методе play есть второй аргумент, который позволяет играть анимацию в обратную сторону.
Удачи !