Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Animación de Sprite 2D

Introducción

En este tutorial aprenderás cómo crear personajes 2D animados con la clase AnimatedSprite2D y AnimationPlayer2D. Típicamente, cuando creas o descargas un personaje animado, éste viene en uno de estos dos modos: como imágenes individuales o como una sola hoja de sprites conteniendo todos los frames de la animación. Ambos pueden ser animados en Godot con la clase AnimatedSprite2D.

Primero, usaremos AnimatedSprite2D para animar un conjunto de imágenes individuales. Luego animaremos una hoja de sprites usando esta clase. Finalmente, aprenderemos otro modo de animar un hoja de sprites con AnimationPlayer y la propiedad Animation de Sprite2D.

Nota

El arte de los siguientes ejemplos está hecho por https://opengameart.org/users/ansimuz y tgfcoder.

Imágenes individuales con AnimatedSprite2D

En este escenario, tienes una colección de imágenes, cada una conteniendo un frame de la animación del personaje. Para este ejemplo, usaremos la siguiente animación:

../../_images/2d_animation_run_preview.gif

You can download the images here: 2d_sprite_animation_assets.zip

Descomprime las imágenes y colócalas en la carpeta de tu proyecto. Configura tu árbol de escena con los siguientes nodos:

../../_images/2d_animation_tree1.webp

Nota

El nodo raíz puede ser también Area2D o RigidBody2D. La animación se hará del mismo modo. Una vez que la animación esté completa, puedes asignar una forma al CollisionShape2D. Ver Introducción a la física para más información.

Ahora selecciona el AnimatedSprite2D y en su propiedad SpriteFrames selecciona "Nuevo SpriteFrames".

../../_images/2d_animation_new_spriteframes.webp

Haz clic en el nuevo recurso SpriteFrames y verás que aparece un nuevo panel en la parte inferior de la ventana del editor:

../../_images/2d_animation_spriteframes.webp

Desde el panel del Sistema de Archivos en el lado izquierdo, arrastra las 8 imágenes individuales a la parte central del panel de SpriteFrames. En el lado izquierdo, cambia el nombre de la animación de "default" a "run".

../../_images/2d_animation_spriteframes_done.webp

Utiliza los botones de reproducción ubicados arriba y a la derecha de la entrada "Filtrar Animaciones". Verás la animación reproduciéndose en el viewport. Sin embargo, está un poco lenta. Para arreglar esto, cambia el ajuste de Velocidad (FPS) en el panel de SpriteFrames a 10.

Puedes añadir animaciones adicionales haciendo clic en el botón "Añadir animación" y agregar imágenes adicionales.

Controlando la animación

Una vez que la animación está completa, puedes controlar la animación a través del código usando los métodos play() y stop(). Aquí hay un breve ejemplo para reproducir la animación mientras se mantiene la tecla de la flecha derecha, y detenerla cuando se suelta la tecla.

extends CharacterBody2D

@onready var _animated_sprite = $AnimatedSprite2D

func _process(_delta):
    if Input.is_action_pressed("ui_right"):
        _animated_sprite.play("run")
    else:
        _animated_sprite.stop()

Hoja de sprites con AnimatedSprite2D

También puedes animar fácilmente desde una hoja de sprites con la clase AnimatedSprite2D`. Usaremos esta hoja de sprites de dominio público:

../../_images/2d_animation_frog_spritesheet.png

Haz clic con el botón derecho del ratón en la imagen y selecciona "Guardar imagen como" para descargarla, luego copia la imagen en la carpeta de tu proyecto.

Configura tu árbol de escena de la misma forma que lo hiciste previamente cuando usaste imágenes individuales. Selecciona el AnimatedSprite2D y en su propiedad SpriteFrames, selecciona "Nuevo SpriteFrames".

Haz clic en el nuevo recurso de SpriteFrames. Esta vez, cuando aparezca un panel en la parte inferior, selecciona "Añadir Frames desde un Sprite Sheet".

../../_images/2d_animation_add_from_spritesheet.webp

Se te pedirá que abras un archivo. Selecciona tu hoja de sprites.

Se abrirá una nueva ventana, mostrando tu hoja de sprites. Lo primero que tendrás que hacer es cambiar el número de imágenes verticales y horizontales en tu hoja de sprites. En esta hoja de sprites, tenemos cuatro imágenes horizontalmente y dos verticalmente.

../../_images/2d_animation_spritesheet_select_rows.webp

A continuación, selecciona los cuadros de la hoja de sprites que quieres incluir en tu animación. Seleccionaremos los cuatro primeros, y luego haremos clic en "Añadir 4 cuadros" para crear la animación.

../../_images/2d_animation_spritesheet_selectframes.webp

Ahora verás tu animación en la lista de animaciones en el panel inferior. Haz doble clic sobre default para cambiar el nombre de la animación a jump.

../../_images/2d_animation_spritesheet_animation.webp

Finalmente, usa el botón de reproducción en el editor de SpriteFrames para ver a tu rana ¡saltando!

../../_images/2d_animation_play_spritesheet_animation.webp

Sprite sheet con AnimationPlayer

Otra forma en que puedes animar cuando se ustiliza una hoja de sprites es usar un nodo estándar Sprite2D para mostrar la textura, y luego animar el cambio de textura a textura con AnimationPlayer.

Consideremos esta hoja de sprites, que contiene 6 cuadros de animación:

../../_images/2d_animation_player-run.png

Haz clic con el botón derecho del ratón en la imagen y selecciona "Guardar imagen como" para descargarla, luego copia la imagen en la carpeta de tu proyecto.

Nuestro objetivo es mostrar estas imágenes una tras otra en un bucle. Comienza por establecer tu árbol de escenas:

../../_images/2d_animation_tree2.webp

Nota

El nodo raíz puede ser también Area2D o RigidBody2D. La animación se hará del mismo modo. Una vez que la animación esté completa, puedes asignar una forma al CollisionShape2D. Ver Introducción a la física para más información.

Arrastra la hoja de sprites en la propiedad Texture del Sprite, y verás toda la hoja desplegada en la pantalla. Para cortarla en cuadros individuales, expande la sección Animación en el Inspector y pon los Cuadros a "6". Hframes y Vframes son el número de marcos horizontales y verticales en tu hoja de sprites.

../../_images/2d_animation_setframes.webp

Ahora intenta cambiar el valor de la propiedad Frame. Verás que va de "0" a "5" y la imagen mostrada por el Sprite2D cambia en consecuencia. Esta es la propiedad que estaremos animando.

Selecciona el AnimationPlayer y haz clic en el botón Animation seguido de New. Nombra a la nueva animación "walk". Ponga la duración de la animación en "0.6" y haga clic en el botón "Loop" para que nuestra animación se repita.

../../_images/2d_animation_new_animation.webp

Ahora selecciona el nodo Sprite2D y haz clic en el icono de la llave para añadir una nueva pista.

../../_images/2d_animation_new_track.webp

Continúa agregando cuadros en cada punto de la línea de tiempo (0,1 segundos por defecto), hasta que tengas todos los cuadros de 0 a 5. Verás los cuadros que realmente aparecen en la pista de animación:

../../_images/2d_animation_full_animation.webp

Presiona "Play" en la animación para ver cómo se ve.

../../_images/2d_animation_running.gif

Controlando una animación de AnimationPlayer

Como con AnimatedSprite2D, puedes controlar la animación por medio del código usando los métodos play() y stop(). De nuevo, aquí hay un ejemplo para reproducir la animación mientras se mantiene la tecla de la flecha derecha, y detenerla cuando se suelta.

extends CharacterBody2D

@onready var _animation_player = $AnimationPlayer

func _process(_delta):
    if Input.is_action_pressed("ui_right"):
        _animation_player.play("walk")
    else:
        _animation_player.stop()

Nota

Si se actualiza tanto una animación como una propiedad separada a la vez (por ejemplo, un plataformero puede actualizar las propiedades h_flip/v_flip del sprite cuando un personaje gira al iniciar una animación 'giratoria'), es importante tener en cuenta que play() no se aplica instantáneamente. En su lugar, se aplica la próxima vez que se procese el AnimationPlayer. Esto puede terminar en el siguiente cuadro, causando un cuadro de "glitch", donde se aplicó el cambio de propiedad pero no la animación. Si esto resulta ser un problema, después de llamar a play(), puedes llamar a advance(0) para actualizar la animación inmediatamente.

Sumario

Estos ejemplos ilustran las dos clases que puedes usar en Godot para la animación 2D. AnimationPlayer es un poco más complejo que AnimatedSprite2D pero proporciona una funcionalidad adicional, ya que también puedes animar otras propiedades como la posición o la escala. La clase "AnimationPlayer" también puede ser usada con un "AnimatedSprite". Experimenta para ver qué es lo que mejor funciona para tus necesidades.