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
- Funciones y propiedades de jugadores
- jugadores.todos
- jugadores.humanos
- jugadores.porId
- jugadores.alEntrar
- jugadores.alSalir
- jugadores.alAccion
- jugadores.alCaer
- jugadores.alCambiarPantalla
- jugadores.alCambiarRanura
- Jugador
- jugador.teletransportar
- jugador.reaparecer
- jugador.impulsar
- jugador.pulsa
- jugador.apunta
- jugador.caminarA
- jugador.apuntaBloque
- Notas de comportamiento
- Ejemplos completos
- jugadores: estado por jugador, acciones y caídas
- jugadores: mover, teletransportar y cambiar habilidades
- Sigue con
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#
jugadores.todos(): Jugador[]Jugadores presentes, humanos y bots.
De docs/EJEMPLOS.md, «interfaz: menú»:
for (const j of jugadores.todos()) j.congelado = true; // un menú no pausa la partidajugadores.humanos#
jugadores.humanos(): Jugador[]Jugadores presentes que no son bots.
De games/copa-de-bloques/scripts/principal.ts:
hum = jugadores.humanos()[0] ?? jugadores.todos()[0];jugadores.porId#
jugadores.porId(id: string): Jugador | nullEl jugador con ese id, o null si no está.
jugadores.alEntrar#
jugadores.alEntrar(fn: (j: Jugador) => void): voidUn 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»:
jugadores.alEntrar((j) => {
interfaz.hud('puntos', { icono: 'estrella', texto: interfaz.t('puntos', { n: 0 }), lugar: 'arriba-izquierda' }, j);
});jugadores.alSalir#
jugadores.alSalir(fn: (j: Jugador) => void): voidUn jugador sale de la sala.
De games/isla-taller/scripts/principal.ts:
jugadores.alSalir((j) => {
for (const p of pilas.get(j.id) ?? []) p.eliminar();
pilas.delete(j.id);
});jugadores.alAccion#
jugadores.alAccion(accion: 'saltar' | 'accion' | 'accion2', fn: (j: Jugador) => void): voidUn jugador aprieta una acción (una vez por pulsación).
De docs/EJEMPLOS.md, «jugadores: estado por jugador, acciones y caídas»:
jugadores.alAccion('accion', (j) => { // una vez por pulsación
j.impulsar([0, 14, 0]);
sonido.tocar('poder', { para: j });
});jugadores.alCaer#
jugadores.alCaer(fn: (j: Jugador) => void): voidUn 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»:
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#
jugadores.alCambiarPantalla(fn: (j: Jugador) => void): voidCambió 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»:
// 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#
jugadores.alCambiarRanura(fn: (j: Jugador, ranura: number) => void): voidEl jugador eligió otra ranura de la barra rápida.
De games/valle-abierto/scripts/principal.ts:
jugadores.alCambiarRanura((j) => sonido.tocar('tic', { para: j, volumen: 0.4 }));Jugador#
Un jugador de la sala: una persona o un bot.
| Propiedad | Tipo | Descripción |
|---|---|---|
jugador.id | string | Solo lectura. Estable durante la partida: 'j1', 'j2'... |
jugador.nombre | string | Solo lectura. Nombre del jugador. |
jugador.esBot | boolean | Solo lectura. true si lo maneja un bot. |
jugador.indice | number | Solo lectura. 0 para el primero en entrar. |
jugador.presente | boolean | Solo lectura. false cuando el jugador salió de la sala. |
jugador.posicion | Vec3 | Posición de los pies. Asignarla teletransporta. |
jugador.velocidad | Vec3 | La velocidad real: caminar más empujes. |
jugador.direccion | number | Solo lectura. Hacia dónde mira, en grados (0 es +Z). |
jugador.enSuelo | boolean | Solo lectura. true si está parado sobre algo. |
jugador.suelo | Pieza | null | Solo lectura. Pieza sobre la que está parado, si hay. |
jugador.rapidez | number | Unidades por segundo. Por defecto 8. |
jugador.salto | number | Altura del salto en unidades. Por defecto 2.6. 0 desactiva el salto. |
jugador.saltosExtra | number | Saltos adicionales en el aire. Por defecto 0. |
jugador.congelado | boolean | true: no responde a los controles (sigue cayendo y lo llevan las plataformas). |
jugador.aparicion | string | Id de la aparición donde vuelve con reaparecer o al caer del mundo. |
jugador.puntos | number | Contador de puntos del jugador; lo muestra interfaz.marcadorDePuntos. Por defecto 0. |
jugador.datos | Record<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? } | null | Colores del avatar de este jugador. Asignar un objeto los cambia; null vuelve a los de su número de jugador. |
jugador.equipo | string | Nombre de equipo, libre. |
jugador.vista | TipoVista | Solo 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.ranura | number | Ranura 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.vuelo | boolean | true: vuela. No le afecta la gravedad; sube con saltar y baja con accion2. |
jugador.enAgua | boolean | Solo lectura. Está dentro de un bloque líquido del terreno (flota, nada con saltar). |
jugador.teletransportar#
jugador.teletransportar(destino: Vec3 | string, rotacionY?: number): voidLo 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»:
mundo.alTocar('#portal', (_p, j) => j.teletransportar('sala-2')); // id de una apariciónjugador.reaparecer#
jugador.reaparecer(): voidLo devuelve a su aparición actual.
De docs/EJEMPLOS.md, «actores: personajes del script»:
actores.alTocar('#enemigo', (enemigo, j) => { j.reaparecer(); enemigo.posicion = [10, 0, 10]; });jugador.impulsar#
jugador.impulsar(velocidad: Vec3): voidSuma velocidad al instante (rebotes, trampolines).
De docs/EJEMPLOS.md, «jugadores: mover, teletransportar y cambiar habilidades»:
mundo.alTocar('#trampolin', (_p, j) => j.impulsar([0, 20, 0]));jugador.pulsa#
jugador.pulsa(accion: AccionEntrada): booleantrue mientras mantiene apretada la acción.
De docs/CONTRATO.md, sección 4.3:
jugador.pulsa('primaria')jugador.apunta#
jugador.apunta(distancia?: number): Impacto | nullLo primero que tiene delante, hasta distancia (por defecto 4): la pieza que mira. Sirve para «interactuar con lo que miro».
jugador.caminarA#
jugador.caminarA(destino: Vec3 | null): voidManda al avatar caminando a un punto (rodea obstáculos). null lo detiene. Cualquier movimiento del jugador lo cancela.
jugador.apuntaBloque#
jugador.apuntaBloque(distancia?: number): BloqueApuntado | nullEl 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:
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ón | Teclado y ratón | Mando | Pantalla táctil |
|---|---|---|---|
primaria | Clic izquierdo, o J | Gatillo derecho | Mantener el dedo quieto sobre el juego |
secundaria | Clic derecho, o K | Gatillo izquierdo | Toque 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.punteroes el rayo desde la cámara por la mira. En primera persona es lo mismo quejugador.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.barraRapiday 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 esjugador.ranura.
Sirven para cualquier juego (disparar, recoger, usar lo que se mira), no solo para los de cubos.
Detalles que conviene saber:
rapidezadmite de 0 a 40 ysaltode 0 a 30; los valores fuera de rango se recortan.velocidaddevuelve la velocidad real (caminar más empujes). Para saber qué quiere hacer el jugador usaentrada.impulsaren 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.teletransportardeja al jugador en el suelo de inmediato si hay piso bajo sus pies.pantallavale 1280 x 720, no táctil, para los bots y engreengames 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#
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#
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#
- Servicio interfaz
- 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.