A cookbook for Godot games :robot:
This project is maintained by Beelzenef
GDScript es el lenguaje oficial de scripting para Godot engine, y que vamos a conocer a grandes rasgos aquí. Siempre podéis consultar la documentación oficial para resolver vuestras dudas.
Actualización desde 13/Marzo/2019: Algunos cambios se han introducido en la versión 3.1, como por ejemplo:
Y más cambios que puedes ver en el changelog
¡Empezamos!
Como lenguaje de programación no tipado, las variables se declaran únicamente con una palabra clave y el nombre de la variable en cuestión:
var nombrePersonaje = "Nombre aleatorio"
A partir de ahora podemos acceder a esa variable y a su contenido, para consultarlo o para cambiarlo en el futuro si es necesario.
Contamos con estos tipos de datos:
Los arrays son listas de datos de diferentes tipos, que podemos recorrer, consultar en qué posiciones, cambiar sus valores… y se declaran de la siguiente forma:
var listaDatos = ["Godot", 34, 13.4, true, "otro dato", 3]
Los diccionarios son más complejos, pero en resumidas cuentas es una lista de pares clave-valor. En todas sus posiciones, encuentras una clave o identificador, asociado a un valor. Se declaran:
var datosPersonaje = { "nombre" : "Abraxas", "salud" : 20, "mana" : 45 }
Así podremos acceder a los diferentes valores, como el nombre, la salud o el maná… a través de esos mismos nombres, que serán sus claves. De forma sencilla, aunque no la más óptima, hemos creado unas estadísticas de personaje para nuestras aventuras.
En el futuro conoceremos otros muchos tipos de datos más complejos, pero que no resultan necesarios ahora.
También podemos declarar constantes, nombres para valores que no cambiarán nunca durante la ejecución de nuestro programa.
const numeroPI = 3.1416
Las funciones son fragmentos de código que puede ser invocados para su ejecución. Reciben parámetros y pueden devolver valores.
Una declaración de una función sencilla puede ser, sin parámetros y devolviendo un número entero:
func unaFuncion():
return 0
Existe una función principal, llamada _ready
, que se ejecuta cuando un nodo y todos sus hijos entran en la escena activa. Es como si el nodo “despertase” y ejecutase su código.
func _ready():
# Tu código viene aquí :D
Entonces, una vez tenemos nuestros nodos con su respectivo código, podríamos iniciar el juego de esta forma
func _ready():
inicioJuego()
nombrarPersonaje()
saludarAPersonaje(nombre)
Las estructuras condicionales, básicas y eternas para los lenguajes, se formulan de la siguiente forma:
if 1 > 2:
print("Primer camino")
elif 2 > 3:
print("Segundo camino")
else:
print("Último camino")
También tenemos el bloque switch o match, donde podemos evaluar una variable entre posibles valores concretos:
match numeroAEvaluar:
1:
print ("Número 1")
2:
print ("Número 2")
3:
print ("Número 3")
WHILE
Este bucle se ejecuta mientras la condición expuesta en su declaración sea cierta. Si se rompe, saldrá del bucle.
while (true):
print("¡Bucle infinito!")
FOR
Este bucle tiene un componente numérico, donde se espera que empiece en un valor inicial y finalice en el final, aumentando a cada vuelta en un número que también puede ser especificado.
Para empezar, un simple bucle que viaja desde 0 a 10:
for i in range(10):
print i
Este será un bucle que avance desde 1 a 10, aumentando en uno a cada vuelta de bucle. Similar al anterior, pero especificando en qué valor se inicia el bucle.
for i in range(1, 10):
print i
Ahora un bucle FOR
que avance desde 4 a 20, aumentando en 2 a cada vuelta de bucle:
for i in range(4, 20, 2):
print i
Y también es posible que ocurra a la inversa, empezando en 10 hasta 0:
for i in range(10, 0, 2):
print i
FOREACH
Este tipo de bucle está orientado a listas de datos, como los arrays, pero sin tener en cuenta sus posiciones. Un ejemplo de su declaración:
for item in listaDatos:
print(item)
Próximamente…
¿Por qué hace falta programar en esta engine? ¿Por qué aprender su lenguaje de programación? Los nodos no tienen funcionamiento propio más allá del que se le ha definido por tipo. Un nodo de caja de texto o EditText
está preparado para recibir el texto que introduzcamos por teclado, pero nada más aparte de eso.
Como bien aparece en la documentación oficial de Godot, un nodo es…
Si queremos que operen de forma diferente, que proyecten animaciones en movimiento, que se guarde nuestra partida… es necesario inculcarles un código a ejecutar para lograr los efectos deseados.
En ocasiones, para evitar la duplicación de código, necesitaremos hacer uso de la herencia de scripts. Crearemos desde la tab de scripting un nuevo script, que no asociaremos a ningún nodo, no tendrá attachs.
En lugar de aparecer con la herencia básica en nuestro nuevo script, para asociar a un nodo concreto:
extends KinematicBody2D
Elegiremos que tenga con una herencia más concreta, desde el mismo creador de scripts.
En el nuevo script, se reflejará la herencia de este modo, en la primera línea:
extends "res://scripts/ScriptComun.gd"
Ahora podremos usar las variables definidas en el primer script, y sobreescribir sus métodos. Esto último no requiere ninguna indicación especial, solo utilizar el mismo nombre y crear el código que necesitemos.
func metodoSobreescrito():
print "¡Soy un método sobreescrito!"
Es posible en Godot crear variables a las que puedes acceder desde el IDE, para asociarle un valor determinado. Es más cómodo y ofrece más velocidad a la hora de ajustar valores necesarios a un nodo, mucho mejor opción que modificar el código constantemente.
Para crear variables accesibles, con un tipo asociado, escribiremos en nuestros scripts:
export (int) var speed
export (float) var rotation_speed
export (int) var health
Ahora prueba a asignar valores hasta encontrar el deseado.