Гид по технологиям

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

6 min read Разработка игр Обновлено 26 Dec 2025
2D анимации в Godot: AnimatedSprite и GDScript
2D анимации в Godot: AnimatedSprite и GDScript

Человек за компьютером анимирует объекты в редакторе Godot

Анимации в играх делают поведение персонажей и окружения более выразительным и понятным для игрока. Godot предоставляет удобные инструменты для создания и управления 2D‑анимациями. В этой статье рассмотрим практическую настройку сцены, добавление SpriteSheet в AnimatedSprite, управление воспроизведением через GDScript, работу с сигналами и лучшие практики, а также альтернативы и контроль качества.

Основные определения

  • AnimatedSprite: узел Godot для проигрывания наборов кадров (SpriteFrames).
  • SpriteFrames: ресурс, который содержит набор анимаций и кадры для AnimatedSprite.
  • AnimationPlayer: более мощный узел для анимации свойств узлов, не только спрайтов.

Настройка 2D‑сцены в Godot

  1. Создайте новую сцену и добавьте узел KinematicBody2D как персонажа.
  2. Внутри KinematicBody2D добавьте CollisionShape2D и задайте форму rectangle, которая будет границей столкновений.
  3. Добавьте узел AnimatedSprite для проигрывания анимаций персонажа.
  4. В редакторе Godot откройте Project → Project Settings → Input Map и зарегистрируйте действия: move_left, move_right, move_up, move_down, play_animation, stop_animation, rotate_animation, flip_animation.

Изображение интерфейса Input Map иллюстрирует, какие клавиши обычно сопоставляют с этими действиями.

Схема Input Map с разными клавишами в Godot

Далее прикрепите сценарий к узлу 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, если эти клавиши привязаны к соответствующим действиям.

Простая игровая сцена с игроком в редакторе Godot

Добавление SpriteSheet в AnimatedSprite

  1. Выберите узел AnimatedSprite и в инспекторе перейдите к свойству Frames.
  2. Нажмите New SpriteFrames.
  3. Внизу вкладки редактора переключитесь на вкладку SpriteFrames.
  4. Создайте новую анимацию с помощью кнопки New Animation и назовите её, например, ‘walk’ или ‘idle’.
  5. Для добавления кадров нажмите Add Frames from SpriteSheet и выберите ваше изображение с тайлсетами. Godot автоматически вырежет кадры по сетке, если задать размер кадра.

SpriteFrames с кадрами в 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))

Примечание: поворот применяется ко всему узлу вместе со всеми кадрами. Если нужно повернуть только отдельные кадры, рассмотрите создание отдельного узла для этих кадров.

Анимация игрока, повернутая в редакторе Godot

Отражение анимации по горизонтали и вертикали

Чтобы отразить спрайт по горизонтали, используйте свойство 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.

Мини‑методология внедрения анимаций (шаги)

  1. Подготовить SpriteSheet с одинаковым размером кадров и одним pivot для анимации.
  2. Добавить AnimatedSprite и создать ресурс SpriteFrames.
  3. Создать отдельные анимации по состояниям: idle, walk, run, jump, attack.
  4. В коде обеспечить явное проигрывание нужной анимации по состоянию персонажа.
  5. Подключить frame_changed для звуков и эффекта столкновения.
  6. Написать тесты и критерии приёмки (ниже).

Роль‑ориентированные контрольные списки

Для художника:

  • Кадры одного состояния одинакового размера
  • Корректно выставлен 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 в зависимости от задач.

Важное: всегда тестируйте анимации в контексте игры и контролируйте синхронизацию звуков и эффектов через сигналы.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Увеличить задержку отмены отправки в Apple Mail
Руководство

Увеличить задержку отмены отправки в Apple Mail

Настроить VPN на VPS — полное руководство
Инструкции

Настроить VPN на VPS — полное руководство

Как делиться файлами и папками из облачного хранилища
Облачные хранилища

Как делиться файлами и папками из облачного хранилища

Средства устранения неполадок Windows — быстрый гид
Windows

Средства устранения неполадок Windows — быстрый гид

Запись геймплея с консоли: бокс или встроенная запись
Гейминг

Запись геймплея с консоли: бокс или встроенная запись

Удалить все твиты с TweetDelete
Конфиденциальность

Удалить все твиты с TweetDelete