Desarrollo de juegos con Godot 🤖

Skip to content

¡Este es un texto traducido automáticamente que puede contener errores!

¿De dónde proviene esta información?

Mucho de esto es solo una recontación de la documentación oficial de Godot. Debajo encontrarán algunos enlaces útiles a la documentación oficial (que prefiero recomendar por encima de esta en Piggy, ¡pero si prefieres esta, no tienes más que usarla!)

Recursos útiles:

¿Qué pasa con los gráficos, tengo que crearlos yo mismo?

¡No! Pueden encontrar muchos assets gratuitos aquí:

Otros enlaces útiles:

¿Otros motores de juego?

Si lo prefieres, puedes usar otros motores de juego. Ejemplos de otros motores de juego son:

¡Hay muchos otros también, busca si quieres probar algo diferente!

¿Qué es Godot?

Godot (pronunciado Guh-doh), es un ‘Game Engine’. Para decirlo de forma sencilla, es un programa que te permite crear juegos (o programas comunes si así lo deseas). Godot puede hacer casi todo lo que otros game-engines pueden hacer, tanto en 2D como en 3D.

Ejemplos de juegos creados en Godot: Godot Showcase

No solo se han creado juegos indie en Godot, ¡Sonic Colors Ultimate ha sido creado con Godot! 🦔🦔🦔

¿Cómo obtener Godot?

Puedes descargar Godot desde las siguientes opciones:

Simplemente descarga e instala (o ejecútalo directamente desde Steam).

¡Configura un proyecto!

Al iniciar Godot, aparece esta ventana:

Godot Proyecto

Aquí te preguntan por el lenguaje de programación, GDScript o C#. GDScript es muy similar a Python.

Diferencias entre GDScript y Python (sin colores):

def hello():
    text = "Hello world!"

    print(text)
func hello():
    var text = "Hello world!"

    print(text)

Para variables en Python solo necesitas escribir el nombre de la variable. En GDScript debes escribir var primero. Para crear funciones escribes func en lugar de def.

Escenas y nodos

Uno de los conceptos más importantes dentro de Godot son las escenas (scenes) y los nodos. Podemos comenzar con los nodos. Un nodo es un objeto en Godot que puede representar cualquier cosa. Puede ser algo que represente a un jugador, a un enemigo, un botón en un menú, texto en la pantalla o lo que sea. Las escenas son una colección de nodos.

Aquí crearemos un ejemplo muy sencillo.

Del 1a - Configurar la escena “player”

En la parte superior de la ventana de Godot, presione el botón “2D” para cambiar la vista a una vista 2D.

En el lado izquierdo de la ventana, verán la siguiente interfaz:

Create Scene

Presione el botón “Other Node” y busque “CharacterBody2D”, selecciónelo y presione “Create”. Este es un nodo que se utiliza para un jugador 2D. Quizás noten que hay un triángulo de advertencia ⚠️ junto al nodo “CharacterBody2D”. Esto se debe a que le faltan algunas cosas que le gustaría tener.

Si hace clic derecho en el nodo, hay un botón “+ Add Child Node…”. Utilice este y agregue dos nodos, Sprite2D y CollisionShape2D. Sprite2D se utiliza para agregar gráficos al jugador, mientras que el otro se utiliza para verificar las colisiones. También puede darles nombres si eso facilita el seguimiento de las cosas. Le he dado a mi CharacterBody2D el nombre “Player”. Así es como debería verse la escena ahora:

Scene currently

Parte 1b - Arreglar el aviso ⚠️ sobre CollisionShape2D

La advertencia triangular en este caso es que CollisionShape2D carece realmente de colisión. Puedes arreglar esto haciendo clic en la nodo (a la izquierda), lo cual abrirá un panel en el lado derecho (derecha). Aquí obtendrás una gran cantidad de información acerca del nodo al que puedes modificar. Te recomiendo experimentar con ello. Sin embargo, aquello en lo que debemos centrarnos es en “Forma” (“Shape”); establécela por ejemplo a RectangleShape2D. No es muy importante, ya que no utilizaremos las colisiones aquí.

Del 1c - Añadir un Sprite, gráfico

Si haces clic en Sprite2D a la izquierda, aparece el campo a la derecha donde dice “Texture”. Aquí puedes introducir una imagen para el jugador. Solo tienes que arrastrar una imagen y soltarla en el campo.

Así se verá después de haber añadido un sprite.

Sprite menu

Parte 2 - Añadir entrada, controlar

En la parte superior de la ventana hay un menú, “Escena - Proyecto - Depurar - Editor - Ayuda”. Pulsa en “Proyecto” y luego en “Configuración del Proyecto”. Aquí aparece un menú con muchas configuraciones. Pulsa en “Mapa de Entrada”. Aquí pueden configurar los botones del teclado.

  • En el campo “Añadir Nueva Acción”, escribe “izquierda” y luego pulsa “Añadir”.
  • Después, añade “derecha”, “arriba” y “abajo”.
  • Estos se conocen como “Acciones”
  • En cada “Acción” pueden añadir botones pulsando el botón + a la derecha.

Botón más

  • Aquí solo hay que pulsar el teclado y luego pulsar Añadir.
  • Añade botones a todas las acciones.

Del 3 - Añadir un script para controlar al jugador.

Para poder añadir lógica de juego, es decir, hacer algo con el jugador, el fondo, o lo que sea en el juego, necesitamos un script. Los scripts son código, y se pueden escribir en dos lenguajes, GDScript o C#, GDScript es el predeterminado.

  • Pulsa en el nodo “CharacterBody2D” (yo lo he llamado “Player”).
  • Pulsa el botón “Attach Script” (ver abajo)

Attach script button

  • Aquí aparecerá una ventana donde puedes elegir el lenguaje (elige GDScript) y una ruta (simplemente deja que se llame como está, pero puedes darle un nombre), también pulsa continuar. Aquí aparecerá una ventana de “Script”. No hay mucho aquí para empezar.

extends CharacterBody2D

El único propósito de este código por el momento es que el código pertenezca a un nodo del tipo “CharacterBody2D”, que es nuestro jugador.

Vamos a añadir una función aquí que usaremos para manipular al jugador:

extends CharacterBody2D

# Función que se ejecuta en cada fotograma del proceso de física.
func _physics_process(delta: float) -> void:
    # Retorna inmediatamente para no realizar ninguna acción.
    return

Proceso Físico?

_physics_process es una función que se actualiza en cada “frame”, es decir, alrededor de 60 veces por segundo (por defecto). Existe otra función que simplemente se llama _process, que se actualiza en todo momento. Si quieres que el jugador se mueva a un ritmo constante, usa _physics_process.

Aquí es donde vamos a añadir código que mueve al jugador.

Parte 4 – Entrada básica

En el capítulo anterior añadiste los botones de entrada; ahora vamos a utilizarlos. Existe un objeto integrado llamado Input, que podemos usar para comprobar si el jugador ha pulsado lo que hemos configurado en el «Mapa de entradas».

Intenta añadir este código al método _physics_process:

# Verificar si se presiona la tecla derecha
if Input.is_action_pressed('right'):
    velocity.x = 100

# Mover y deslizar el personaje en función de su velocidad actual
move_and_slide()

¿Qué es move_and_slide()?

move_and_slide() es una función integrada en Godot que se utiliza cuando queremos mover realmente aquello en lo que la aplicamos. Sin ella, el jugador no se moverá.

Warning

Los espacios en las líneas son muy importantes, esto es igual que en Python.

¿Qué sucede cuando inicias el programa al presionar el botón de reproducir en la ventana de Godot, luego presionas “right”?

Si nada sucede ahora:

  • ¿Has recordado configurar algo en “Input Map”?
  • ¿Has escrito right y no Right? Es decir, ¿lo que escribiste en el código es lo mismo que el nombre en el mapa de entrada?

Todo el código hasta ahora
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100

    move_and_slide()

Intenta ahora añadir código para 'izquierda', 'arriba' y `’abajo’}.

¿Qué debe ser velocidad.x para ‘izquierda’? ¿Y qué pasa con arriba e abajo?’

Todo el código ahora
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

Parte 5 - Arreglar el código

Quizás notéis que el jugador no se detiene cuando soltáis una dirección. ¡Podemos arreglar eso ahora!

Antes de todos los if, añadid una línea que establezca la velocidad a 0. Podéis hacerlo escribiendo velocity = Vector2()

Todas las velocidades y direcciones en Godot son vectores, este es un concepto matemático en el que no vamos a profundizar ahora, pero si queréis saber más sobre lo que significa, podéis ir aquí: Wikipedia vectors.

Todo el código ahora
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    velocity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

Cuando empiezas el juego ahora puedes mover al jugador:

Además, puedes arreglar el código para que la velocidad no sea solo un número, sino que pueda guardarse en otro lugar.

Puedes, por ejemplo (antes de la función), añadir una constante que controle la velocidad.

Todo el código al final con const
extends CharacterBody2D

const SPEED = 100

func _physics_process(delta: float) -> void:
    velovity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = SPEED
    if Input.is_action_pressed('left'):
        velocity.x = -SPEED
    if Input.is_action_pressed('down'):
        velocity.y = SPEED
    if Input.is_action_pressed('up'):
        velocity.y = -SPEED

    move_and_slide()

Parte 6 ¡Juega por tu cuenta!

Si vuelven a la primera parte, Recursos útiles, podrán encontrar qué pueden seguir experimentando con ello.

Después de esto, intenten crear su propio juego. ¿Qué crean depende completamente de ustedes. Si quieren hacer algo totalmente nuevo, ¡háganlo! Si prefieren intentar imitar un juego que ya existe, también es una opción. La mejor manera de aprender es practicarlo directamente.