Creando Personajes Animados 2D en Godot 4: Diseñando y Programando Movimiento
Este tutorial te guiará paso a paso en la creación de personajes animados 2D en Godot Engine 4. Cubriremos la importación de assets, la configuración de animaciones con AnimationPlayer y la programación del movimiento del personaje.
🚀 Introducción: Dando Vida a tus Personajes 2D en Godot 4
Crear personajes con movimiento y personalidad es uno de los aspectos más gratificantes del desarrollo de videojuegos. En Godot 4, el proceso es intuitivo y potente, permitiéndonos transformar una colección de imágenes estáticas en un héroe o villano dinámico.
Este tutorial te proporcionará las herramientas y el conocimiento necesario para:
- Importar y configurar tus assets 🎨
- Crear y gestionar animaciones con el nodo AnimationPlayer ✨
- Programar el movimiento y la lógica de los estados del personaje 🎮
¡Prepárate para dar los primeros pasos en la animación de tus propios héroes pixelados!
🎨 Preparación de Assets: Spritesheets y Recortes
Antes de sumergirnos en Godot, necesitamos nuestros assets. Para personajes 2D, lo más común es usar spritesheets, que son imágenes grandes que contienen múltiples fotogramas de animación.
🖼️ ¿Qué es un Spritesheet?
Un spritesheet es una única imagen que agrupa varios frames (cuadros) de animación de un personaje o elemento del juego. Esto optimiza el rendimiento al cargar una sola textura en lugar de múltiples imágenes individuales.
✅ Obtener y Organizar tus Sprites
Para este tutorial, utilizaremos un spritesheet simple de un personaje caminando y en reposo. Puedes crear el tuyo propio o buscar uno gratuito en sitios como itch.io o OpenGameArt.
- Descarga o crea tu spritesheet: Asegúrate de que los frames estén bien alineados y espaciados para facilitar el recorte.
- Crea una carpeta
Assetsen tu proyecto Godot: Dentro, crea subcarpetas comoCharactersyPlayerpara mantener todo organizado. - Importa el spritesheet: Arrastra tu archivo de imagen (
.pngo.webpson comunes) a la carpetaPlayerdentro del panelFileSystemde Godot.
🛠️ Configuración del Personaje en Godot
Ahora que tenemos nuestros assets, vamos a configurar la escena de nuestro personaje en Godot.
📝 Creando la Escena del Personaje
-
Nueva escena 2D: Haz clic en
Scene->New Scene. Selecciona2D Scene. Godot creará un nodoNode2Draíz. Renómbralo aPlayer. -
Añadir un nodo
CharacterBody2D: Este es el nodo base para personajes con movimiento físico y colisiones. SeleccionaPlayer, haz clic en el botón+para añadir un nuevo nodo y buscaCharacterBody2D. Renómbralo también aPlayer.⚠️ Advertencia: El nodo raíz de la escena del personaje debe ser un `CharacterBody2D` para que las colisiones y el movimiento basado en física funcionen correctamente. -
Añadir un nodo
Sprite2D: Este nodo mostrará nuestros sprites. Selecciona elCharacterBody2Drecién creado, haz clic en+y buscaSprite2D. Renómbralo aVisualsoPlayerSprite. -
Asignar textura al
Sprite2D: Arrastra tu spritesheet desde el panelFileSystemal slotTextureen el Inspector del nodoVisuals.📌 Nota: Si tu spritesheet tiene varios frames, el `Sprite2D` por defecto solo mostrará el primer frame. No te preocupes, lo ajustaremos más adelante con `AnimationPlayer`.
📏 Configuración de la Colisión
Para que nuestro personaje interactúe con el mundo, necesita una forma de colisión.
- Añadir un nodo
CollisionShape2D: Selecciona elCharacterBody2DPlayer, haz clic en+y buscaCollisionShape2D. - Asignar una forma al
CollisionShape2D: En el Inspector, en la propiedadShape, haz clic en[Empty]->New CapsuleShape2D(oRectangleShape2D, dependiendo de tu personaje). Una cápsula suele ser buena para personajes bípedos. - Ajustar la forma: Usa los manipuladores en el viewport 2D para ajustar el tamaño y la posición de la forma de colisión para que se adapte bien a tu personaje. Intenta que sea ligeramente más pequeña que el sprite para una sensación más natural.
✨ Animación con AnimationPlayer
Aquí es donde la magia ocurre. Usaremos el nodo AnimationPlayer para definir y reproducir nuestras animaciones.
🎬 Añadiendo AnimationPlayer y Recortando Sprites
-
Añadir
AnimationPlayer: Selecciona el nodoVisuals(tuSprite2D), haz clic en+y buscaAnimationPlayer. -
Configurar
HframesyVframes: En el Inspector, selecciona el nodoVisuals. Busca las propiedadesHframes(frames horizontales) yVframes(frames verticales) y ajusta los valores para que coincidan con la cuadrícula de tu spritesheet. Por ejemplo, si tienes 8 frames en una fila,Hframessería 8. -
Crear la primera animación: Con el nodo
AnimationPlayerseleccionado, en la parte inferior del editor, verás el panelAnimation. Haz clic enAnimation->Newy nómbralaIdle(reposo). -
Añadir pistas de animación: Asegúrate de que el nodo
Visualsesté seleccionado en el panelScene. En el Inspector, busca la propiedadFrame(dentro deAnimation). Haz clic en el botón de la llave 🔑 junto aFrame.- Asegúrate de que
Create New Trackesté seleccionado y haz clic enCreate. - Esto añadirá una pista de animación para la propiedad
frameen elAnimationPlayer.
- Asegúrate de que
🚶 Animación de Reposo (Idle)
Vamos a animar el estado Idle.
- Establecer duración: En el panel
Animation, ajusta la duración de la animación a un valor corto, por ejemplo,0.6segundos. - Añadir fotogramas clave: En la pista
frame, haz clic derecho en la línea de tiempo y seleccionaInsert Key. Establece el valor deFramea0. Este es el primer frame. - Añadir más fotogramas clave: Avanza un poco en la línea de tiempo (ej. 0.2s), inserta otro fotograma clave y establece
Framea1. Repite para los frames que componen tu animación de reposo (ej.0,1,0,1para una animación simple de 2 frames). - Activar
Loop: Marca la casillaLoopjunto al nombre de la animaciónIdlepara que se repita continuamente.
🏃 Animación de Caminar (Walk)
Repite el proceso para la animación de caminar.
- Nueva animación: Haz clic en
Animation->Newy nómbralaWalk. - Añadir pista de
Frame: Si no está, añade una pistaframepara el nodoVisualscomo antes. - Establecer duración: Ajusta la duración (ej.
0.8segundos). - Añadir fotogramas clave: Añade los fotogramas clave correspondientes a la secuencia de caminar en tu spritesheet. Por ejemplo, si tu caminar usa los frames 2-7, añadirías
2en0.0s,3en0.15s,4en0.3s, y así sucesivamente hasta el7. - Activar
Loop: Marca la casillaLoop.
Más sobre AnimationPlayer
El `AnimationPlayer` es increíblemente versátil. Puedes animar cualquier propiedad de cualquier nodo: posición, escala, rotación, color, e incluso llamar a funciones (`Call Method Track`). Experimenta con él para dar más vida a tus escenas.🎮 Programando el Movimiento del Personaje
Ahora vamos a darle interactividad a nuestro personaje con un script GDScript.
📄 Adjuntar un Script
- Adjuntar script al
CharacterBody2D: Selecciona el nodoPlayer(elCharacterBody2Draíz). Haz clic en el botónAdjuntar Script(el ícono del pergamino) en el Inspector. - Configurar el script: Deja la
Rutapor defecto (generalmentePlayer.gd),IdiomacomoGDScript, yPlantillacomoCharacterBody2D (Built-in). Haz clic enCrear.
extends CharacterBody2D
const SPEED = 150.0
const JUMP_VELOCITY = -400.0
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
func _physics_process(delta: float):
# Add the gravity.
if not is_on_floor():
velocity.y += gravity * delta
# Handle Jump.
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY
# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
var direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
if direction:
velocity.x = direction.x * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
move_and_slide()
🏃 Implementando Movimiento y Animación
Vamos a modificar el script Player.gd para controlar el movimiento horizontal y cambiar las animaciones.
extends CharacterBody2D
const SPEED = 150.0
const JUMP_VELOCITY = -400.0
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
@onready var animation_player = $Visuals/AnimationPlayer
@onready var visuals = $Visuals # Referencia al Sprite2D para voltear
func _physics_process(delta: float):
# Aplicar gravedad si no está en el suelo
if not is_on_floor():
velocity.y += gravity * delta
# Manejar Salto
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY
# Obtener la dirección de entrada horizontal
var input_direction_x = Input.get_axis("ui_left", "ui_right")
# Calcular la velocidad horizontal
if input_direction_x != 0:
velocity.x = input_direction_x * SPEED
update_animation(input_direction_x) # Actualizar animación y dirección
else:
velocity.x = move_toward(velocity.x, 0, SPEED) # Desacelerar si no hay input
update_animation(0) # Parado
move_and_slide()
func update_animation(direction_x: float):
if direction_x > 0: # Moviéndose a la derecha
visuals.flip_h = false # No voltear horizontalmente
animation_player.play("Walk")
elif direction_x < 0: # Moviéndose a la izquierda
visuals.flip_h = true # Voltear horizontalmente
animation_player.play("Walk")
else: # Parado
animation_player.play("Idle")
🔑 Configuración de Inputs
Para que Input.get_axis() y Input.is_action_just_pressed() funcionen, necesitamos configurar las acciones en Project Settings.
- Abrir Project Settings: Ve a
Project->Project Settings. - Pestaña
Input Map: En esta pestaña, verás una lista de acciones. Godot ya tiene accionesui_left,ui_right,ui_up,ui_down, yui_accept(generalmente mapeado a Espacio o Enter). - Asignar teclas: Asegúrate de que
ui_leftesté mapeado a A o Flecha Izquierda,ui_righta D o Flecha Derecha, yui_accepta Espacio.
🌍 Integrando el Personaje en el Mundo
Ahora que nuestro personaje está animado y se mueve, necesitamos un mundo donde pueda existir.
🗺️ Creando una Escena de Nivel Básico
- Nueva escena 2D:
Scene->New Scene->2D Scene. Renómbrala aWorld. - Añadir un
StaticBody2Dpara el suelo: Este será nuestro suelo. SeleccionaWorld, añade un nodoStaticBody2D. Renómbralo aGround. - Añadir
CollisionShape2DalGround: Como antes, añade unCollisionShape2DalGround. Asigna unaRectangleShape2Dy ajústala para que sea una plataforma larga y plana. - Añadir un
ColorRect(opcional): Para que el suelo sea visible, añade unColorRectcomo hijo deGroundy ajusta su tamaño y color.
# En tu escena World, puedes tener algo así:
# - World (Node2D)
# - Ground (StaticBody2D)
# - CollisionShape2D (Shape: RectangleShape2D)
# - ColorRect (para visualización)
```
### 🧍 Instanciando el Personaje
1. **Guardar la escena del personaje**: Asegúrate de haber guardado tu escena `Player` (ej. `Player.tscn`).
2. **Instanciar en la escena `World`**: Arrastra el archivo `Player.tscn` desde el panel `FileSystem` a la escena `World`.
3. **Posicionar el personaje**: Arrastra el nodo `Player` en el viewport para que esté por encima del `Ground`.
<div class="callout tip">💡 <strong>Consejo:</strong> Usa el atajo <kbd>F6</kbd> para ejecutar la escena actual, o <kbd>F5</kbd> para ejecutar la escena principal que hayas configurado en `Project Settings` -> `Application` -> `Run` -> `Main Scene`.</div>
---
## 📈 Mejoras y Pasos Siguientes
Has creado un personaje 2D animado y controlable. ¡Felicidades! Aquí hay algunas ideas para llevarlo al siguiente nivel:
### 🔄 Más Estados de Animación
* **Salto/Caída**: Añade animaciones para cuando el personaje salta y cae. Modifica `_physics_process` para reproducir estas animaciones cuando `is_on_floor()` sea falso.
* **Ataque/Habilidad**: Si tu personaje tiene acciones, crea animaciones para ellas y un sistema de control para activarlas.
* **Correr**: Si quieres diferenciar entre caminar y correr, añade una animación de `Run` y un input para activarla (ej. <kbd>Shift</kbd>).
### 📊 Sistema de Estados (State Machine)
Para juegos más complejos, un sistema de estados es esencial para gestionar lógicas y animaciones de manera ordenada. En lugar de un montón de `if/else`, puedes tener estados como `IDLE`, `WALK`, `JUMP`, `ATTACK`, cada uno con su propia lógica y animaciones.
🌐 Interacción con el Entorno
- Plataformas móviles: Crea nodos
AnimatableBody2Dpara plataformas que se muevan y con las que tu personaje pueda interactuar. - Recogibles: Añade
Area2Da tu personaje para detectar y recoger objetos. - Enemigos: Implementa la detección de colisiones con otros
CharacterBody2DoRigidBody2Dpara combate o interacción.
🎯 Conclusión
Has completado un viaje emocionante, transformando un spritesheet en un personaje 2D funcional y animado en Godot 4. Desde la configuración inicial hasta la programación de su movimiento y la gestión de animaciones, ahora posees una base sólida para crear tus propios protagonistas de videojuegos.
Recuerda que la práctica es clave. No dudes en experimentar con diferentes sprites, animaciones y mecánicas para perfeccionar tus habilidades. ¡El mundo de Godot está esperando tus creaciones!
Tutorial Completado
Tutoriales relacionados
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!