Escribir juegos / Lenguaje
GSH Script
Los juegos se escriben en archivos .gsh. El lenguaje se interpreta; no hay paso de compilación aparte para el script.
Forma del código
Los bloques se abren con dos puntos y se sangran, como en Python. Comentarios con #. El punto y coma al final de una línea es opcional. Nombres en snake_case o camelCase: el motor no pelea por eso.
Palabras reservadas:
func var class extends import
if elif else while for in
return and or not
true false null this
Variables
gsh
var velocidad = 200
var vida: float = 3
var titulo = "GSH"
var vivo = true
var puntos = [10, 20, 30]
En runtime hay números, strings, booleanos, arreglos, instancias de clase y actores. La anotación de tipo es opcional.
El ciclo del juego
Casi todo proyecto define estas dos funciones. start corre una vez. frame corre cada fotograma; delta es el tiempo en segundos desde el anterior (~60 Hz).
gsh
func start():
Window.set_title("Prueba")
Window.set_background(18, 22, 28)
func frame(delta):
# input, movimiento, HUD
Lo importante es no olvidar delta al mover: si sumas píxeles fijos por frame, el juego corre distinto a 30 que a 60.
Control de flujo
gsh
if Input.is_key_down("SPACE"):
disparar()
elif vida <= 0:
perdido = true
else:
mover(delta)
while i < 8:
crear_item(i)
i = i + 1
for pieza in lista:
actualizar(pieza)
Clases
this es la instancia. extends hereda métodos y campos. Un patrón habitual es guardar el gráfico y el collider como campos y spawnearlos en create.
gsh
class Pieza:
var grafico = null
var caja = null
func create(x, y, tex):
this.grafico = Sprite(x, y, 48, 48, tex, 10, 1, 1, 0)
this.caja = Collider(x, y, 48, 48, false)
spawn(this.grafico)
spawn(this.caja)
class Cazador extends BasicEnemy:
func create(x, y, objetivo):
this.target = objetivo
Import
gsh
import "utilerias.gsh"
El archivo entra al mismo ámbito. Conviene no pelear nombres entre el import y el main.
Operadores
Aritmética + - * /. Comparación == != < > <= >=. Lógicos and or. Asignación = += -= *= /=. Propiedades con punto; arreglos con [i].
Algunos actores devuelven this y se pueden encadenar:
gsh
var hud = Text(400, 16, "0", 20, "Blanco", "center").set_layer(100)
Un ejemplo corto
Un rectángulo que no se sale de una ventana 800×600:
gsh
var caja = ColorRect(380, 280, 32, 32, "Azul").set_layer(10)
var vel: float = 200.0
func start():
Window.set_title("Movimiento")
spawn(caja)
func frame(delta):
var dx: float = 0
var dy: float = 0
if Input.is_key_down("D"): dx = dx + vel * delta
if Input.is_key_down("A"): dx = dx - vel * delta
if Input.is_key_down("S"): dy = dy + vel * delta
if Input.is_key_down("W"): dy = dy - vel * delta
caja.x = Math.clamp(caja.x + dx, 0, 768)
caja.y = Math.clamp(caja.y + dy, 0, 568)
Cuando algo no corre
| Síntoma | Qué mirar primero |
|---|---|
| Error de indentación | Falta : o el bloque no está sangrado igual. |
Propiedad sobre null | El actor no se creó o no pasó por spawn. |
| No choca nada | Sprite y collider en sitios distintos. Ver Actores y física. |
| Imagen en negro / no carga | Ruta relativa a la carpeta del proyecto, no al exe. |