Saltar al contenido
Docs

Servicio jugadores

Referencia del servicio jugadores. Quiénes están en la sala, humanos y bots: su posición, sus habilidades, sus acciones, su vista y su estado.

Corresponde aFormato 1, API 1 Para quien escribe código Esta página se genera desde las fuentes del SDK.

En esta página

Quiénes están en la sala, humanos y bots: su posición, sus habilidades, sus acciones, su vista y su estado.

Los tipos que aparecen en las firmas (Vec3, Texto, el selector) están en la referencia de la API.

Funciones y propiedades de jugadores#

jugadores.todos#

ts
jugadores.todos(): Jugador[]

Jugadores presentes, humanos y bots.

De docs/EJEMPLOS.md, «interfaz: menú»:

ts
for (const j of jugadores.todos()) j.congelado = true;       // un menú no pausa la partida

jugadores.humanos#

ts
jugadores.humanos(): Jugador[]

Jugadores presentes que no son bots.

De games/copa-de-bloques/scripts/principal.ts:

ts
hum = jugadores.humanos()[0] ?? jugadores.todos()[0];

jugadores.porId#

ts
jugadores.porId(id: string): Jugador | null

El jugador con ese id, o null si no está.

jugadores.alEntrar#

ts
jugadores.alEntrar(fn: (j: Jugador) => void): void

Un jugador entra a la sala. También se llama para los que ya estaban al registrar el evento.

De docs/EJEMPLOS.md, «interfaz: HUD, mensajes y cronómetro»:

ts
jugadores.alEntrar((j) => {
  interfaz.hud('puntos', { icono: 'estrella', texto: interfaz.t('puntos', { n: 0 }), lugar: 'arriba-izquierda' }, j);
});

jugadores.alSalir#

ts
jugadores.alSalir(fn: (j: Jugador) => void): void

Un jugador sale de la sala.

De games/isla-taller/scripts/principal.ts:

ts
jugadores.alSalir((j) => {
  for (const p of pilas.get(j.id) ?? []) p.eliminar();
  pilas.delete(j.id);
});

jugadores.alAccion#

ts
jugadores.alAccion(accion: 'saltar' | 'accion' | 'accion2', fn: (j: Jugador) => void): void

Un jugador aprieta una acción (una vez por pulsación).

De docs/EJEMPLOS.md, «jugadores: estado por jugador, acciones y caídas»:

ts
jugadores.alAccion('accion', (j) => {            // una vez por pulsación
  j.impulsar([0, 14, 0]);
  sonido.tocar('poder', { para: j });
});

jugadores.alCaer#

ts
jugadores.alCaer(fn: (j: Jugador) => void): void

Un jugador cayó bajo alturaCaida. La sala ya lo reapareció; aquí descuentas vidas, sumas una penalización, etc.

De docs/EJEMPLOS.md, «jugadores: estado por jugador, acciones y caídas»:

ts
jugadores.alCaer((j) => {                        // la sala ya lo devolvió a su aparición
  const vidas = (j.datos.vidas as number) - 1;
  j.datos.vidas = vidas;
  interfaz.hud('vidas', { icono: 'corazon', texto: interfaz.t('vidas', { n: vidas }), estilo: vidas === 1 ? 'peligro' : 'normal' }, j);
  if (vidas <= 0) juego.terminar({ resultado: 'derrota', puntaje: j.puntos, de: j });
});

jugadores.alCambiarPantalla#

ts
jugadores.alCambiarPantalla(fn: (j: Jugador) => void): void

Cambió el tamaño o la orientación de la pantalla de un jugador. También se llama una vez al conocerla.

De docs/EJEMPLOS.md, «interfaz: mensajes que no estorban, menú con opción deshabilitada, textos anidados»:

ts
// Textos mas cortos en telefonos verticales.
jugadores.alCambiarPantalla((j) => interfaz.hud('ayuda', { texto: interfaz.t(j.pantalla.vertical ? 'ayudaCorta' : 'ayuda'), lugar: 'abajo-centro' }, j));

jugadores.alCambiarRanura#

ts
jugadores.alCambiarRanura(fn: (j: Jugador, ranura: number) => void): void

El jugador eligió otra ranura de la barra rápida.

De games/valle-abierto/scripts/principal.ts:

ts
jugadores.alCambiarRanura((j) => sonido.tocar('tic', { para: j, volumen: 0.4 }));

Jugador#

Un jugador de la sala: una persona o un bot.

PropiedadTipoDescripción
jugador.idstringSolo lectura. Estable durante la partida: 'j1', 'j2'...
jugador.nombrestringSolo lectura. Nombre del jugador.
jugador.esBotbooleanSolo lectura. true si lo maneja un bot.
jugador.indicenumberSolo lectura. 0 para el primero en entrar.
jugador.presentebooleanSolo lectura. false cuando el jugador salió de la sala.
jugador.posicionVec3Posición de los pies. Asignarla teletransporta.
jugador.velocidadVec3La velocidad real: caminar más empujes.
jugador.direccionnumberSolo lectura. Hacia dónde mira, en grados (0 es +Z).
jugador.enSuelobooleanSolo lectura. true si está parado sobre algo.
jugador.sueloPieza | nullSolo lectura. Pieza sobre la que está parado, si hay.
jugador.rapideznumberUnidades por segundo. Por defecto 8.
jugador.saltonumberAltura del salto en unidades. Por defecto 2.6. 0 desactiva el salto.
jugador.saltosExtranumberSaltos adicionales en el aire. Por defecto 0.
jugador.congeladobooleantrue: no responde a los controles (sigue cayendo y lo llevan las plataformas).
jugador.aparicionstringId de la aparición donde vuelve con reaparecer o al caer del mundo.
jugador.puntosnumberContador de puntos del jugador; lo muestra interfaz.marcadorDePuntos. Por defecto 0.
jugador.datosRecord<string, unknown>Datos libres del script, por jugador.
jugador.entrada{ x: number; z: number }Solo lectura. Hacia dónde quiere moverse el jugador ahora mismo, en el plano del mundo: x y z entre -1 y 1 (0, 0 si no toca nada).
jugador.pantalla{ ancho: number; alto: number; tactil: boolean; vertical: boolean }Solo lectura. Pantalla de este jugador: sirve para acortar textos en teléfonos. En greengames probar y para los bots vale 1280 x 720, no táctil. Cambia si el jugador gira el teléfono (ver jugadores.alCambiarPantalla).
jugador.apariencia{ torso?, piernas?, piel?, gorro? } | nullColores del avatar de este jugador. Asignar un objeto los cambia; null vuelve a los de su número de jugador.
jugador.equipostringNombre de equipo, libre.
jugador.vistaTipoVistaSolo lectura. Tipo de vista que tiene ahora este jugador.
jugador.mirada{ origen: Vec3; direccion: Vec3 }Solo lectura. Desde dónde y hacia dónde mira: los ojos y la dirección de la mirada. En primera persona sigue al ratón.
jugador.ranuranumberRanura elegida de la barra rápida (0 es la primera). La cambia el jugador con la rueda, las teclas 1 a 9 o tocándola; el script también puede fijarla.
jugador.puntero{ origen: Vec3; direccion: Vec3 }Solo lectura. Rayo del puntero: desde la cámara, por el centro de la pantalla (la mira). En primera persona es igual a mirada. Para los bots y en greengames probar es la mirada.
jugador.vuelobooleantrue: vuela. No le afecta la gravedad; sube con saltar y baja con accion2.
jugador.enAguabooleanSolo lectura. Está dentro de un bloque líquido del terreno (flota, nada con saltar).

jugador.teletransportar#

ts
jugador.teletransportar(destino: Vec3 | string, rotacionY?: number): void

Lo lleva a un punto o a una aparición (por su id), y detiene su velocidad.

De docs/EJEMPLOS.md, «jugadores: mover, teletransportar y cambiar habilidades»:

ts
mundo.alTocar('#portal', (_p, j) => j.teletransportar('sala-2'));       // id de una aparición

jugador.reaparecer#

ts
jugador.reaparecer(): void

Lo devuelve a su aparición actual.

De docs/EJEMPLOS.md, «actores: personajes del script»:

ts
actores.alTocar('#enemigo', (enemigo, j) => { j.reaparecer(); enemigo.posicion = [10, 0, 10]; });

jugador.impulsar#

ts
jugador.impulsar(velocidad: Vec3): void

Suma velocidad al instante (rebotes, trampolines).

De docs/EJEMPLOS.md, «jugadores: mover, teletransportar y cambiar habilidades»:

ts
mundo.alTocar('#trampolin', (_p, j) => j.impulsar([0, 20, 0]));

jugador.pulsa#

ts
jugador.pulsa(accion: AccionEntrada): boolean

true mientras mantiene apretada la acción.

De docs/CONTRATO.md, sección 4.3:

ts
jugador.pulsa('primaria')

jugador.apunta#

ts
jugador.apunta(distancia?: number): Impacto | null

Lo primero que tiene delante, hasta distancia (por defecto 4): la pieza que mira. Sirve para «interactuar con lo que miro».

jugador.caminarA#

ts
jugador.caminarA(destino: Vec3 | null): void

Manda al avatar caminando a un punto (rodea obstáculos). null lo detiene. Cualquier movimiento del jugador lo cancela.

jugador.apuntaBloque#

ts
jugador.apuntaBloque(distancia?: number): BloqueApuntado | null

El bloque del terreno al que apunta el jugador, hasta distancia unidades de sus ojos (5 por defecto), o null. Trae la cara tocada y la celda vecina donde iría un bloque nuevo.

De games/valle-abierto/scripts/principal.ts:

ts
const a = j.apuntaBloque(ALCANCE);

Notas de comportamiento#

Puntero y barra rápida (versión 1.1). Dos acciones más, que se declaran en controles.acciones como las otras:

AcciónTeclado y ratónMandoPantalla táctil
primariaClic izquierdo, o JGatillo derechoMantener el dedo quieto sobre el juego
secundariaClic derecho, o KGatillo izquierdoToque corto sobre el juego

Se usan igual que las demás: jugadores.alAccion('primaria', fn) (una vez por pulsación) y jugador.pulsa('primaria') (mientras se mantiene). Cuando un juego declara alguna de las dos:

  • el ratón se captura al hacer clic también en tercera persona (Esc lo suelta; el clic que lo captura no cuenta como acción) y aparece la mira en el centro. Si el navegador no deja capturarlo, se mira arrastrando y los clics actúan igual;
  • jugador.puntero es el rayo desde la cámara por la mira. En primera persona es lo mismo que jugador.mirada; en tercera persona nace en la cámara, detrás del avatar. Para los bots es la mirada;
  • la barra rápida se dibuja con interfaz.barraRapida y se elige con la rueda del ratón, las teclas 1 a 9, la cruceta del mando (izquierda y derecha) o tocando una ranura. La elegida es jugador.ranura.

Sirven para cualquier juego (disparar, recoger, usar lo que se mira), no solo para los de cubos.

Detalles que conviene saber:

  • rapidez admite de 0 a 40 y salto de 0 a 30; los valores fuera de rango se recortan.
  • velocidad devuelve la velocidad real (caminar más empujes). Para saber qué quiere hacer el jugador usa entrada.
  • impulsar en horizontal se frena solo (roce 0,82 por cuadro en el suelo, 0,985 en el aire): es un empujón, no una velocidad sostenida.
  • teletransportar deja al jugador en el suelo de inmediato si hay piso bajo sus pies.
  • pantalla vale 1280 x 720, no táctil, para los bots y en greengames probar. En teléfonos, un chip del HUD muestra cómodo unos 24 caracteres por línea (hace salto de línea hasta tres).

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.

jugadores: estado por jugador, acciones y caídas#

scripts/principal.ts
import { interfaz, juego, jugadores, sonido } from '@greengames/sdk';

juego.alIniciar(() => {
  jugadores.alEntrar((j) => {
    j.datos = { vidas: 3 };
    interfaz.hud('vidas', { icono: 'corazon', texto: interfaz.t('vidas', { n: 3 }) }, j);
  });

  jugadores.alCaer((j) => {                        // la sala ya lo devolvió a su aparición
    const vidas = (j.datos.vidas as number) - 1;
    j.datos.vidas = vidas;
    interfaz.hud('vidas', { icono: 'corazon', texto: interfaz.t('vidas', { n: vidas }), estilo: vidas === 1 ? 'peligro' : 'normal' }, j);
    if (vidas <= 0) juego.terminar({ resultado: 'derrota', puntaje: j.puntos, de: j });
  });

  jugadores.alAccion('accion', (j) => {            // una vez por pulsación
    j.impulsar([0, 14, 0]);
    sonido.tocar('poder', { para: j });
  });
});

jugadores: mover, teletransportar y cambiar habilidades#

scripts/principal.ts
import { juego, mundo } from '@greengames/sdk';

juego.alIniciar(() => {
  mundo.alTocar('#trampolin', (_p, j) => j.impulsar([0, 20, 0]));
  mundo.alTocar('#portal', (_p, j) => j.teletransportar('sala-2'));       // id de una aparición
  mundo.alTocar('#botas', (botas, j) => { botas.eliminar(); j.saltosExtra = 1; j.rapidez = 11; });
  mundo.alTocar('#hielo', (_p, j) => { j.congelado = true; });
});

Sigue con#