Escribir juegos / Actores
Actores y física
En GSH lo que se ve y lo que choca casi nunca son el mismo objeto. El sprite pinta. El collider ocupa espacio. spawn los mete a la escena.
Constructores
| Constructor | Uso |
|---|---|
Sprite(x, y, w, h, tex, capa, frames, cols, rot) | Imagen, opcionalmente animada. |
Collider(x, y, w, h, debug) | Hitbox AABB. |
ColorRect, Circle, Triangle, Pentagon | Formas de color. |
Text, TextBox, TextEdit | Texto y campos. |
CoreButton | Botón nativo del motor. |
Campos que vas a tocar todo el tiempo: x, y, width, height, layer, visible, rotation, frame.
spawn
Hasta que no hay spawn, el objeto existe en el script pero el runtime no lo dibuja ni lo usa en física. Puedes pasar uno o una lista.
gsh
var n = Sprite(40, 80, 64, 64, tex, 8, 1, 1, 0)
spawn(n)
spawn([a, b, c])
Capas
La cola de dibujo ordena por capa. El mundo suele vivir en 0–20. El HUD se pone en 100 o más y, si no quieres que lo mueva la cámara, fíjalo a la vista (el demo de menú hace exactamente eso).
El patrón sprite + collider
Si mueves solo el sprite, el golpe queda atrás. Si mueves solo el collider, el gráfico se queda. Physics.move_and_slide mueve los dos y resbala contra sólidos.
gsh
Physics.add_solid(muro.caja)
Physics.move_and_slide(jugador.grafico, jugador.caja, 0, 0, dx, dy)
Los últimos números son offset sprite–hitbox. En un tanque o un personaje con sombra, el dibujo no coincide con la caja; ahí sirve el offset. Hay una variante que recibe una lista de colliders a ignorar (proyectiles, el propio jugador, etc.).
add_solid registra obstáculos. Sin eso, move_and_slide no tiene contra qué rebotar. Los enemigos que persiguen suelen pasar el collider del jugador como objetivo, no el sprite.
Colisión a mano
Para balas o triggers a veces basta AABB sin el sistema de sólidos:
gsh
if Physics.is_colliding(hit_a, hit_b):
aplicar_golpe()
# o con rectángulos sueltos
Physics.check_collision(x1, y1, w1, h1, x2, y2, w2, h2)
Cámara
En un mapa chico no hace falta. En uno grande, Camera.follow al jugador y Camera.set_zoom. El ratón de mundo no es el de pantalla: usa Camera.get_mouse_x() / get_mouse_y() si apuntas en un escenario con scroll.
Assets
Las rutas de imagen y audio son relativas a la carpeta del proyecto abierto.
gsh
var tex = Graphics.load_image("assets/nave.png")
Las texturas no suben a GPU hasta que hay contexto gráfico. En la práctica: carga en start o al crear el actor, no asumas que un handle es válido antes de spawnear.