Animación de Sprite 2D

Introducción

En este tutorial aprenderás cómo crear personajes 2D animados con la case AnimatedSprite y AnimationPlayer. Típicamente, cuando creas o descargas un personaje animado, este 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 AnimatedSprite.

Primero, usaremos AnimatedSprite para animar una colección de imágenes individuales. Luego animaremos un spritesheet usando esta clase. Finalmente, aprenderemos otro modo de animar una spritesheet con AnimationPlayer y la propiedad Animation de Sprite.

Nota

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

Imágenes individuales con AnimatedSprite

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

Puedes descargar las imágenes aquí: run_animation.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.png

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 AnimatedSprite y en su propiedad SpriteFrames selecciona "New SpriteFrames".

../../_images/2d_animation_new_spriteframes.png

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.png

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.png

De vuelta en el Inspector, marque la casilla de la propiedad Playing. Ahora deberías ver la animación reproduciéndose en el Viewport. Sin embargo, es un poco lenta. Para arreglar esto, cambia el ajuste de Velocidad (FPS) en el panel de SpriteFrames a 10.

Puede añadir animaciones adicionales haciendo clic en el botón "Nueva animación" y añadiendo 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 KinematicBody2D

func _process(delta):
    if Input.is_action_pressed("ui_right"):
        $AnimatedSprite.play("run")
    else:
        $AnimatedSprite.stop()

Sprite sheet con AnimatedSprite

También puedes animar fácilmente desde una hoja de sprites con la clase "AnimatedSprite". 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 AnimatedSprite y en su propiedad SpriteFrames, selecciona "New SpriteFrames".

Haz clic en el nuevo recurso SpriteFrames. Esta vez aparecerá un panel en la parte inferior, selecciona "Añadir frames desde un Sprite Sheet".

../../_images/2d_animation_add_from_spritesheet.png

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.png

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.png

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.png

Por último, activa la propiedad Playing del AnimatedSprite en el inspector para que veas a tu rana ¡saltar!

../../_images/2d_animation_play_spritesheet_animation.png

Sprite sheet con AnimationPlayer

Otra forma de animar cuando se usa una hoja de sprites es usar un nodo estándar Sprite 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.png

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.png

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

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.png

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

../../_images/2d_animation_new_track.png

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.png

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 AnimatedSprite, 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 la tecla.

extends KinematicBody2D

func _process(delta):
    if Input.is_action_pressed("ui_right"):
        $AnimationPlayer.play("walk")
    else:
        $AnimationPlayer.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 AnimatedSprite, 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.