2D‑анимации в Godot: настройка AnimatedSprite и управление через GDScript

Анимации в играх делают поведение персонажей и окружения более выразительным и понятным для игрока. Godot предоставляет удобные инструменты для создания и управления 2D‑анимациями. В этой статье рассмотрим практическую настройку сцены, добавление SpriteSheet в AnimatedSprite, управление воспроизведением через GDScript, работу с сигналами и лучшие практики, а также альтернативы и контроль качества.
Основные определения
- AnimatedSprite: узел Godot для проигрывания наборов кадров (SpriteFrames).
- SpriteFrames: ресурс, который содержит набор анимаций и кадры для AnimatedSprite.
- AnimationPlayer: более мощный узел для анимации свойств узлов, не только спрайтов.
Настройка 2D‑сцены в Godot
- Создайте новую сцену и добавьте узел KinematicBody2D как персонажа.
- Внутри KinematicBody2D добавьте CollisionShape2D и задайте форму rectangle, которая будет границей столкновений.
- Добавьте узел AnimatedSprite для проигрывания анимаций персонажа.
- В редакторе Godot откройте Project → Project Settings → Input Map и зарегистрируйте действия: move_left, move_right, move_up, move_down, play_animation, stop_animation, rotate_animation, flip_animation.
Изображение интерфейса Input Map иллюстрирует, какие клавиши обычно сопоставляют с этими действиями.
Далее прикрепите сценарий к узлу KinematicBody2D. Этот код отвечает за базовое движение персонажа по четырём направлениям.
extends KinematicBody2D
const SPEED = 200
func _physics_process(delta):
var velocity = Vector2.ZERO
if Input.is_action_pressed('move_left'):
velocity.x -= SPEED
if Input.is_action_pressed('move_right'):
velocity.x += SPEED
if Input.is_action_pressed('move_up'):
velocity.y -= SPEED
if Input.is_action_pressed('move_down'):
velocity.y += SPEED
velocity = move_and_slide(velocity)Этот скрипт задаёт постоянную скорость и позволяет двигаться с помощью стрелок или WASD, если эти клавиши привязаны к соответствующим действиям.
Добавление SpriteSheet в AnimatedSprite
- Выберите узел AnimatedSprite и в инспекторе перейдите к свойству Frames.
- Нажмите New SpriteFrames.
- Внизу вкладки редактора переключитесь на вкладку SpriteFrames.
- Создайте новую анимацию с помощью кнопки New Animation и назовите её, например, ‘walk’ или ‘idle’.
- Для добавления кадров нажмите Add Frames from SpriteSheet и выберите ваше изображение с тайлсетами. Godot автоматически вырежет кадры по сетке, если задать размер кадра.
Советы по работе с SpriteSheet:
- Старайтесь, чтобы все кадры одной анимации имели одинаковый размер и точку привязки (pivot).
- Используйте отдельные анимации для разных состояний: walk, run, idle, attack, jump.
- Храните SpriteSheet в понятной структуре папок, по персонажам или по пакетам анимаций.
Управление анимациями через GDScript
Мы рассмотрим воспроизведение и остановку, поворот, зеркалирование, а также использование сигналов AnimatedSprite.
Воспроизведение и остановка анимации
Контроль воспроизведения даёт возможность связать анимации с логикой игры. Вот пример, который воспроизводит и останавливает текущую анимацию по входным действиям.
extends KinematicBody2D
func _physics_process(delta):
# Воспроизвести анимацию
if Input.is_action_just_pressed('play_animation'):
$AnimatedSprite.play()
# Остановить анимацию и сбросить на первый кадр
if Input.is_action_just_pressed('stop_animation'):
$AnimatedSprite.stop()
$AnimatedSprite.frame = 0Можно также явно указывать имя анимации: $AnimatedSprite.play(‘walk’). Это полезно, когда у узла несколько анимаций.
Поворот анимации
Поворот всего узла AnimatedSprite удобен для визуальных эффектов. Метод rotate принимает угол в радианах, поэтому используем deg2rad для конвертации.
extends KinematicBody2D
func _physics_process(delta):
if Input.is_action_just_pressed('rotate_animation'):
# Повернуть анимацию на 45 градусов по часовой стрелке
$AnimatedSprite.rotate(deg2rad(45))Примечание: поворот применяется ко всему узлу вместе со всеми кадрами. Если нужно повернуть только отдельные кадры, рассмотрите создание отдельного узла для этих кадров.
Отражение анимации по горизонтали и вертикали
Чтобы отразить спрайт по горизонтали, используйте свойство flip_h; для вертикального отражения — flip_v.
extends KinematicBody2D
func _physics_process(delta):
if Input.is_action_just_pressed('flip_animation'):
$AnimatedSprite.flip_h = true
# или $AnimatedSprite.flip_v = true для вертикального отраженияЧастая практика: переключать flip_h в зависимости от направления движения персонажа, чтобы не создавать отдельные анимации для левого и правого направлений.
Использование сигналов AnimatedSprite
Godot поддерживает систему сигналов, которая удобна для реакции на события анимации. У AnimatedSprite есть полезные сигналы: animation_finished и frame_changed.
Сигнал animation_finished
Сигнал испускается, когда анимация дошла до последнего кадра. Его можно использовать для смены состояния персонажа, запуска эффектов или перехода в другую анимацию.
extends KinematicBody2D
func _ready():
$AnimatedSprite.connect('animation_finished', self, '_on_animation_finished')
func _on_animation_finished():
# Действия при завершении анимации
print('Анимация завершена')
# Здесь можно сменить состояние или воспроизвести другую анимациюСигнал frame_changed
Сигнал испускается при каждом переходе кадра. Это удобно для синхронизации звуков шагов, спавна снарядов или других эффектов с конкретным кадром.
extends KinematicBody2D
func _ready():
$AnimatedSprite.connect('frame_changed', self, '_on_frame_changed')
func _on_frame_changed():
var current_frame = $AnimatedSprite.frame
print('Текущий кадр: ', current_frame)
# Можно запускать звук шага на определённых кадрахВажно: избегайте тяжёлой логики внутри обработчиков frame_changed, так как сигнал может срабатывать часто при высокой частоте кадров.
Практические советы и анти‑паттерны
- Не храните логику анимаций исключительно в сценах художника. Делегируйте переключение анимаций в код, чтобы легче тестировать и контролировать поведение.
- Не используйте flip_h как единственный способ отражать сложные анимации, где асимметричные эффекты важны. В таких случаях создавайте отдельные анимации.
- Если вам нужно анимировать не только спрайты, а свойства узлов (позицию, масштаб, цвет), рассматривайте AnimationPlayer.
- Не создавайте избыточно длинные SpriteSheet с кадрами разного размера и привязки — это приведёт к ошибкам при вырезании фреймов.
Альтернативные подходы и когда что выбрать
- AnimatedSprite: лучше всего для классических покадровых 2D‑анимаций персонажей и эффектов. Прост в использовании и управлении.
- AnimationPlayer: подходит для анимации любых свойств узлов, сложных последовательностей и кривых. Используйте, когда нужно анимировать не только текстуры, но и позицию, прозрачность, размеры сцены.
- Skeleton2D и Bone2D: используйте для связанной анимации с костями, когда важно плавное искривление частей спрайта.
Решающее правило: если требуется простая циклическая покадровая анимация — AnimatedSprite. Если нужно синхронизировать несколько свойств или иметь гибкое управление — AnimationPlayer.
Мини‑методология внедрения анимаций (шаги)
- Подготовить SpriteSheet с одинаковым размером кадров и одним pivot для анимации.
- Добавить AnimatedSprite и создать ресурс SpriteFrames.
- Создать отдельные анимации по состояниям: idle, walk, run, jump, attack.
- В коде обеспечить явное проигрывание нужной анимации по состоянию персонажа.
- Подключить frame_changed для звуков и эффекта столкновения.
- Написать тесты и критерии приёмки (ниже).
Роль‑ориентированные контрольные списки
Для художника:
- Кадры одного состояния одинакового размера
- Корректно выставлен pivot/offset
- Экспортированы прозрачные PNG без лишних границ
Для программиста:
- AnimatedSprite настроен и содержит все состояния
- В коде есть явный переход между состояниями
- Сигналы animation_finished и frame_changed подключены при необходимости
Для тестировщика:
- Анимации не дергаются при смене скоростей
- Отображение по направлению работает (flip_h)
- Звук шагов синхронизирован с кадрами
Критерии приёмки
- Персонаж корректно проигрывает анимации idle и walk при стоянии и движении.
- Flip_h корректно отражает спрайт при смене направления, без смещения точки привязки.
- При завершении анимации вызывается логика, привязанная к сигналу animation_finished.
- Ключевые звуки (например, шаги) запускаются на указанных кадрах через frame_changed.
Когда подход с AnimatedSprite не подойдёт
- Если нужно анимировать десятки параметров разных узлов одновременно, AnimationPlayer будет гибче.
- Если персонаж состоит из частей, которые должны деформироваться и двигаться независимо (например, конечности), лучше использовать Skeleton2D.
- Если важна оптимизация памяти для большого числа уникальных анимаций, рассмотрите атласные текстуры и пакетирование ресурсов.
Шпаргалка по GDScript и часто используемые приёмы
- Воспроизвести конкретную анимацию: $AnimatedSprite.play(‘walk’)
- Остановить и зафиксировать кадр: $AnimatedSprite.stop(); $AnimatedSprite.frame = 0
- Проверить текущую анимацию: $AnimatedSprite.animation
- Подписаться на сигнал в коде: $AnimatedSprite.connect(‘animation_finished’, self, ‘_on_animation_finished’)
Ментальные модели и эвристики
- Состояние персонажа → имя анимации. Всегда храните соответствие в одном месте в коде, чтобы избежать расхождений.
- Событие на кадре → звук/эффект. Используйте frame_changed лишь для кратких действий.
- Простая анимация — AnimatedSprite; сложная — AnimationPlayer; деформируемая — Skeleton2D.
Пример тестов приёмки (acceptance tests)
- Запустить сцену; при нажатии на правую клавишу персонаж должен начать воспроизводить анимацию ‘walk’ в правую сторону и flip_h должен быть false.
- При нажатии левой клавиши — ‘walk’ и flip_h true.
- При вызове play_animation сработает воспроизведение, при stop_animation — останов и сброс кадра.
Краткое резюме
AnimatedSprite в Godot остаётся простым и надёжным инструментом для покадровых 2D‑анимаций. Для большинства платформерных и ретро‑стилей он обеспечивает лёгкость использования и хорошую производительность. Если вам нужны более сложные сценарии, сочетайте AnimatedSprite с AnimationPlayer или Skeleton2D в зависимости от задач.
Важное: всегда тестируйте анимации в контексте игры и контролируйте синхронизацию звуков и эффектов через сигналы.
Похожие материалы
Увеличить задержку отмены отправки в Apple Mail
Настроить VPN на VPS — полное руководство
Как делиться файлами и папками из облачного хранилища
Средства устранения неполадок Windows — быстрый гид
Запись геймплея с консоли: бокс или встроенная запись