Servicio juego
Referencia del servicio juego. La partida: en qué dificultad y escena está, cuándo empieza, qué pasa en cada cuadro y cómo termina.
Corresponde aFormato 1, API 1 Para quien escribe código Esta página se genera desde las fuentes del SDK.
En esta página
La partida: en qué dificultad y escena está, cuándo empieza, qué pasa en cada cuadro y cómo termina.
Los tipos que aparecen en las firmas (Vec3, Texto, el selector) están en la referencia de la API.
Funciones y propiedades de juego#
| Propiedad | Tipo | Descripción |
|---|---|---|
juego.id | string | Id del juego, el del manifiesto. |
juego.dificultad | string | Id de la dificultad elegida, o '' si el juego no tiene dificultades. |
juego.nivelDificultad | number | Índice de la dificultad elegida dentro de dificultades (0 la primera). -1 si no hay. |
juego.modo | 'solo' | 'sala-local' | 'sala' | 'solo': un jugador. 'sala-local': un jugador más bots en este equipo. 'sala' está reservado y hoy no se usa. |
juego.semilla | number | Semilla de la partida. Con la misma semilla, azar da la misma secuencia. |
juego.escena | string | Id de la escena cargada. |
juego.terminado | boolean | true desde que se llamó a juego.terminar. |
juego.alIniciar#
juego.alIniciar(fn: () => void): voidSe llama una vez, con la escena cargada y los jugadores iniciales ya dentro. Registra aquí el resto de los eventos.
De docs/EJEMPLOS.md, «juego: iniciar, cada cuadro, terminar»:
juego.alIniciar(() => {
juego.registro('Partida en', juego.dificultad, 'con semilla', juego.semilla);
});juego.cadaCuadro#
juego.cadaCuadro(fn: (dt: number) => void): voidSe llama en cada cuadro de simulación. dt siempre vale 1/60.
De docs/EJEMPLOS.md, «mundo: mover piezas»:
// A mano, cuadro a cuadro: una pieza en órbita. Se asigna un vector nuevo.
juego.cadaCuadro(() => {
const a = reloj.ahora * 2;
mundo.pieza('satelite').posicion = [Math.cos(a) * 5, 3, Math.sin(a) * 5];
});juego.terminar#
juego.terminar(fin: { resultado: 'victoria' | 'derrota' | 'fin'; puntaje?: number; tabla?: string; de?: Jugador; detalle?: Texto }): voidTermina la partida. Después de esto la sala se detiene: no corren más cuadros ni temporizadores.
De docs/EJEMPLOS.md, «juego: cambiar de escena»:
mundo.alEntrar('tesoro', (_zona, j) => juego.terminar({ resultado: 'victoria', puntaje: 1, de: j }));juego.cambiarEscena#
juego.cambiarEscena(id: string): voidDescarga la escena actual y carga otra. Los jugadores reaparecen en la primera aparición. Vuelve a llamar a los alCambiarEscena.
De docs/EJEMPLOS.md, «juego: cambiar de escena»:
// Escena "principal" con una zona "puerta"; escena "sotano" con una zona "tesoro".
mundo.alEntrar('puerta', () => juego.cambiarEscena('sotano'));juego.alCambiarEscena#
juego.alCambiarEscena(fn: (id: string) => void): voidSe llama después de cada juego.cambiarEscena, con el id de la escena nueva.
De docs/EJEMPLOS.md, «juego: cambiar de escena»:
juego.alCambiarEscena((id) => juego.registro('Ahora en', id));juego.registro#
juego.registro(...datos: unknown[]): void // `greengames probar` lo muestraEscribe en la consola del reproductor (solo para depurar; el jugador no lo ve).
De docs/EJEMPLOS.md, «juego: iniciar, cada cuadro, terminar»:
juego.registro('Partida en', juego.dificultad, 'con semilla', juego.semilla);juego.senalar#
juego.senalar(nombre: string, valor?: unknown): voidDeja una señal con nombre para el guion del bot (condiciones { "senal": "nombre" }). No hace nada más: el jugador no la ve. Sirve para que la prueba sepa en qué momento está el juego ('ronda', 'puerta-abierta'). valor debe ser JSON; por defecto true.
De docs/EJEMPLOS.md, «Guion de bot con señales, ciclos y ruta»:
juego.senalar('puerta-abierta'); // cuando se abreNotas de comportamiento#
terminar con tabla registra el puntaje en esa tabla para el jugador de (por defecto, el primer humano). Después de terminar la sala se detiene. cambiarEscena descarga la escena, carga la otra en el cuadro siguiente, lleva a los jugadores a su primera aparición y llama a alCambiarEscena.
Qué sobrevive a cambiarEscena:
| Se conserva | Se pierde |
|---|---|
Todos los eventos registrados (alTocar, alEntrar, cadaCuadro, alAccion...): los de selector se vuelven a aplicar a las piezas y zonas de la escena nueva que calcen | Las piezas, zonas, luces, actores y rótulos de la escena anterior, también los creados por script |
Temporizadores (reloj.despues, reloj.cada) y cronómetros | Los eventos registrados con pieza.alTocar(fn) (se van con la pieza) |
| HUD, marcador, menús abiertos y sonidos | Los grupos (son de las piezas) |
Jugadores: datos, puntos, rapidez, salto, progreso | La aparicion de cada jugador (pasa a ser la primera de la escena nueva) |
Señales de juego.senalar y ajustes de cámara | El ambiente (toma el de la escena nueva) |
Una derrota no entra a la tabla: terminar({ resultado: 'derrota', tabla }) no registra ni anuncia récord. Para registrar igual (un juego de supervivencia que siempre termina perdiendo), usa resultado: 'fin' o llama antes a puntajes.registrar.
Ejemplos completos#
Scripts completos de docs/EJEMPLOS.md. Cada uno supone una escena con lo que nombra, y las claves de texto (interfaz.t('...')) deben existir en textos de juego.json.
juego: iniciar, cada cuadro, terminar#
import { juego, jugadores } from '@greengames/sdk';
juego.alIniciar(() => {
juego.registro('Partida en', juego.dificultad, 'con semilla', juego.semilla);
});
// Gana quien llegue a z = 50. dt siempre vale 1/60.
juego.cadaCuadro(() => {
for (const j of jugadores.todos()) {
if (j.posicion[2] >= 50) juego.terminar({ resultado: 'victoria', puntaje: 100, de: j });
}
});juego: cambiar de escena#
import { juego, mundo } from '@greengames/sdk';
juego.alIniciar(() => {
// Escena "principal" con una zona "puerta"; escena "sotano" con una zona "tesoro".
mundo.alEntrar('puerta', () => juego.cambiarEscena('sotano'));
mundo.alEntrar('tesoro', (_zona, j) => juego.terminar({ resultado: 'victoria', puntaje: 1, de: j }));
});
juego.alCambiarEscena((id) => juego.registro('Ahora en', id));Sigue con#
- Servicio mundo
- Referencia de la API: los once servicios y los tipos comunes.
- Scripts: las reglas de un script y cómo corre dentro de la sala.