GSH Docs v0.1

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íntomaQué mirar primero
Error de indentaciónFalta : o el bloque no está sangrado igual.
Propiedad sobre nullEl actor no se creó o no pasó por spawn.
No choca nadaSprite y collider en sitios distintos. Ver Actores y física.
Imagen en negro / no cargaRuta relativa a la carpeta del proyecto, no al exe.