Escenas
El archivo escenas/<id>.json completo: piezas, formas, materiales, movimiento automático, apariciones, zonas, luces, ambiente, vistas 2D y 3D, láminas y mapas de baldosas.
Corresponde aFormato 1, API 1 Para quien escribe código
En esta página
Una escena es el mundo del juego escrito como datos: una lista de piezas, los puntos donde aparecen los jugadores, las zonas que avisan cuando alguien entra, las luces y el ambiente. También dice con qué vista se juega (tercera persona, primera persona, 2D de lado, desde arriba o isométrica) y puede traer mapas de baldosas. Cada escena es un archivo escenas/<id>.json. Un juego puede tener hasta 16 y empieza en la que nombra escenaInicial del manifiesto.
Solo formato, id, piezas y apariciones son obligatorias.
Una escena real#
Esta es la escena de la plantilla (packages/toolkit/plantilla/escenas/principal.json), recortada: un suelo, una tarima con su subida, una de las seis monedas y una de las cuatro losas de lava.
{
"$schema": "../../../packages/sdk/esquemas/escena.schema.json",
"formato": 1,
"id": "principal",
"ambiente": { "cielo": "dia", "luzAmbiente": 0.8, "alturaCaida": -10 },
"piezas": [
{ "id": "suelo", "forma": "caja", "posicion": [0, -0.5, 0], "tamano": [24, 1, 24], "material": { "color": "papel", "patron": "rejilla" } },
{ "id": "tarima", "forma": "caja", "posicion": [7, 1, 6], "tamano": [6, 2, 6], "material": { "color": "violeta", "patron": "cuadros" } },
{ "id": "subida", "forma": "cuna", "posicion": [7, 1, 0.5], "tamano": [3, 2, 5], "material": "madera" },
{ "id": "moneda-1", "forma": "cilindro", "posicion": [8, 1, -6], "rotacion": [90, 0, 0], "tamano": [0.9, 0.16, 0.9], "material": { "color": "ambar", "acabado": "brillante" }, "solida": false, "etiquetas": ["moneda"], "movimiento": { "tipo": "giro", "velocidad": [0, 160, 0] } },
{ "forma": "caja", "posicion": [3, 0.1, -1], "tamano": [3, 0.2, 3], "material": { "color": "coral", "acabado": "neon" }, "etiquetas": ["lava"], "dificultades": ["normal", "dificil"] }
],
"apariciones": [
{ "id": "inicio", "posicion": [0, 0, -9], "rotacionY": 0 }
]
}Qué mirar:
- El suelo mide 1 de alto y su centro está en y = -0,5: su cara superior queda en y = 0, donde está la aparición.
- La moneda es un cilindro acostado (
rotacionde 90 grados en X), no sólido, con una etiqueta y un giro automático. - La lava no tiene
id: se reconoce por su etiqueta, y existe solo en dos de las tres dificultades.
Piezas#
Todo lo que se ve y se toca es una pieza. forma, posicion, tamano y material son obligatorias.
| Propiedad | Tipo | Notas |
|---|---|---|
id | texto | Opcional. Único en la escena. Minúsculas, números y guiones. |
forma | caja, esfera, cilindro, cuna, rampa, lamina, modelo | Ver Formas. lamina es una imagen plana: ver Láminas. modelo es un modelo 3D, desde la versión 1.2: ver Modelos, texturas y sonidos. |
posicion | [x, y, z] | El centro de la pieza. Coordenadas de -2000 a 2000. |
rotacion | [x, y, z] en grados | Por defecto [0, 0, 0]. |
tamano | [ancho X, alto Y, largo Z] | La caja que envuelve a la pieza. Cada medida de 0,05 a 500. |
material | color o { color, acabado, patron } | Ver Materiales. |
fisica | fija, dinamica, ninguna | Por defecto fija. dinamica: la empuja la física. ninguna: decorado, sin colisión ni toques. |
solida | booleano | Por defecto true. Con false se atraviesa pero avisa los toques (monedas, rayos de luz). |
visible | booleano | Por defecto true. |
etiquetas | lista de textos | Para buscar piezas y para los eventos con #etiqueta. Máximo 16. |
movimiento | objeto | Movimiento automático, sin script. Ver Movimiento declarativo. |
dificultades | lista de ids | La pieza existe solo en esas dificultades. Sin esto, en todas. |
datos | objeto JSON | Datos libres que el script lee en pieza.datos. |
grupo | texto | Nombre de grupo: piezas que el script mueve, gira, oculta o elimina juntas con mundo.grupo(nombre). |
rebote | 0 a 1,5 | Cuánto rebota. Por defecto 0,05. Una pelota: 0,8. En un choque manda la pieza que más rebota. |
friccion | 0 a 2 | Roce de la superficie (0 es hielo). Por defecto 0,7. |
densidad | 0,05 a 50 | Peso por volumen de una pieza dinámica. Por defecto 0,6. |
opacidad | 0 a 1 | 0 invisible, 1 opaca. Por defecto 1. |
emision | 0 a 1 | Brillo propio, sin depender de las luces. Por defecto 0. |
Una escena admite hasta 2000 piezas declaradas, y hasta 150 piezas dinámicas vivas a la vez. Todos los topes: Límites.
Formas#
| Forma | Cómo se mide |
|---|---|
caja | tamano son sus tres lados. |
esfera | Las tres medidas iguales: el diámetro. |
cilindro | Eje en Y; ancho y largo iguales (el diámetro). Para acostarlo, usa rotacion. |
cuna | Prisma triangular macizo. La cara inclinada sube hacia +Z: altura 0 en -Z y altura completa en +Z. |
rampa | Como la cuña, pero es una tabla inclinada, hueca por debajo: se puede pasar por debajo de su extremo alto. |
lamina | Una imagen plana de píxeles. Ocupa el ancho y el alto de tamano; el tercer número es el fondo de su caja de colisión. Ver Láminas. |
La forma se escribe cuna, sin eñe, como todas las claves y valores del formato.
Para que una cuña o una rampa se pueda subir caminando, alto / largo debe ser menor que 1,19 (50 grados). La subida de la plantilla mide 2 de alto y 5 de largo: 0,4.
Materiales#
Un material es un nombre de color ("madera") o un objeto { "color", "acabado", "patron" }.
Color. Un nombre de la paleta base o uno agregado en paleta de la escena. La paleta base tiene 25 colores:
tinta, papel, verde, violeta, coral, ambar, blanco, gris, grafito, piedra, cielo, azul, noche, menta, bosque, lima, rosa, magenta, rojo, naranja, amarillo, arena, tierra, madera, hielo.
Acabado.
acabado | Cómo se ve |
|---|---|
mate | Por defecto. |
brillante | Refleja la luz. |
neon | Color pleno, no recibe sombra. Sirve para luces y peligros. |
cristal | Semitransparente. |
Patrón. liso (por defecto), cuadros, franjas o rejilla. Se dibujan por código, en unidades del mundo: una rejilla en el suelo te deja contar distancias a ojo.
Textura. Desde la versión 1.2, un material puede llevar además una imagen de texturas/ con textura, repetida con repetir: { "color": "blanco", "textura": "ladrillo", "repetir": [2, 2] }. Ver Modelos, texturas y sonidos. Las imágenes de pixel art del juego son láminas.
Colores propios#
Si la paleta base no alcanza, la escena declara los suyos en paleta, como colores hexadecimales de seis dígitos. Así queda la escena del patio del tutorial después de pedirle al asistente del editor «cambia los colores a atardecer» (documentacion/ejemplos/patio-al-atardecer/escenas/principal.json):
"paleta": {
"atardecer-sombra": "#2b1b3f",
"atardecer-ciruela": "#5c2a5e",
"atardecer-vino": "#a13d63",
"atardecer-brasa": "#e2584a",
"atardecer-mandarina": "#ff8a3c",
"atardecer-durazno": "#ffb86b",
"atardecer-crema": "#ffe3b0"
}y los usa por nombre, igual que los de la paleta base:
{"id": "suelo", "forma": "caja", "posicion": [0, -0.5, 0], "tamano": [24, 1, 24], "material": {"color": "atardecer-crema", "patron": "rejilla"}}Los nombres empiezan con minúscula y llevan letras, números y guiones, sin tildes ni espacios: verde-agua o verdeAgua. Hasta 32 por escena.
Movimiento declarativo#
Lo que se mueve siempre igual se declara en la escena, sin script. Sirve en piezas fija o ninguna.
tipo | Propiedades | Qué hace |
|---|---|---|
vaiven | hasta (posición absoluta), duracion (segundos de un tramo), espera, desfase, suavizado (lineal o suave) | Va de la posición de la pieza a hasta y vuelve, para siempre. |
giro | velocidad (grados por segundo en cada eje) | Gira sin parar. |
La plataforma móvil de Circuito Luz Verde (games/circuito-luz-verde/escenas/principal.json) cruza un hueco de ida y vuelta, con una pausa en cada extremo:
{ "id": "movil-1", "forma": "caja", "posicion": [0, -0.3, 32.7], "tamano": [3.4, 0.6, 3.4], "material": { "color": "cielo", "patron": "cuadros" }, "movimiento": { "tipo": "vaiven", "hasta": [0, -0.3, 38.3], "duracion": 2.6, "espera": 0.9 } }Las plataformas que se mueven llevan a los jugadores y a los actores parados encima. Lo que depende de lo que pasa en la partida (una puerta que se abre, un ascensor que alguien llama) se mueve desde el script, con pieza.moverA: ver mundo.
Apariciones#
Los puntos donde aparecen los jugadores. Tiene que haber al menos una, y hasta 64.
| Propiedad | Tipo | Notas |
|---|---|---|
id | texto | Obligatorio. |
posicion | [x, y, z] | Donde quedan los pies del avatar. |
rotacionY | grados | Hacia dónde mira. 0 es hacia +Z. |
La primera de la lista es donde empiezan los jugadores. Las demás sirven de puntos de control: el script cambia jugador.aparicion = 'control-2' y, desde entonces, ese jugador vuelve ahí cuando cae o cuando el juego lo hace reaparecer. Las apariciones de Circuito Luz Verde:
"apariciones": [
{ "id": "salida", "posicion": [0, 0, -3], "rotacionY": 0 },
{ "id": "control-1", "posicion": [0, 0, 27.5] },
{ "id": "control-2", "posicion": [0, 4, 51] },
{ "id": "control-3", "posicion": [0, 4, 71] },
{ "id": "control-4", "posicion": [0, 4, 108] }
],Zonas#
Una zona es un volumen invisible que avisa cuando un jugador o un actor entra o sale. Con ellas se hacen metas, puntos de control y sectores con reglas propias, y también tramos que se juegan con otra vista. Hasta 200 por escena.
| Propiedad | Tipo | Notas |
|---|---|---|
id | texto | Obligatorio. |
forma | caja, esfera, cilindro | Obligatoria. |
posicion | [x, y, z] | El centro. |
tamano | [x, y, z] | Obligatorio. |
rotacion | grados | Opcional. |
etiquetas | lista de textos | Para atender varias zonas con un solo evento ('#control'). |
dificultades | lista de ids | La zona existe solo en esas dificultades. |
datos | objeto JSON | Datos que el script lee en zona.datos. |
vista | una vista | Mientras un jugador está dentro, juega con esa vista. Ver Juegos híbridos. |
transicion | segundos | Cuánto dura el cambio de cámara al entrar y al salir. Por defecto 0,6. |
"zonas": [
{ "id": "zona-control-1", "forma": "caja", "posicion": [0, 1.5, 28], "tamano": [7, 3, 5], "etiquetas": ["control"] },
{ "id": "zona-corredor", "forma": "caja", "posicion": [0, 6, 90], "tamano": [6, 4, 29] },
{ "id": "meta", "forma": "caja", "posicion": [0, 11.9, 131.5], "tamano": [7, 3, 4] }
],Haz las zonas de 3 unidades de alto o más cuando el jugador llega caminando o saltando: una zona baja se puede cruzar por encima.
Luces#
Luces puntuales de color. Hasta 8 por escena.
| Propiedad | Tipo | Notas |
|---|---|---|
posicion | [x, y, z] | Obligatoria. |
color | nombre de color | Obligatorio. De la paleta base o de paleta. |
intensidad | 0 a 10 | |
alcance | 1 a 200 | Hasta dónde llega, en unidades. |
id | texto | Opcional. Con id, el script puede cambiar la luz (mundo.luz(id)). |
dificultades | lista de ids | La luz existe solo en esas dificultades. |
"luces": [
{ "posicion": [0, 3, 2], "color": "verde", "intensidad": 2, "alcance": 14 },
{ "posicion": [0, 8, 63.5], "color": "coral", "intensidad": 2.5, "alcance": 14 }
]Ambiente#
El cielo, la luz general y dos números que cambian cómo se juega.
| Propiedad | Valores | Qué hace |
|---|---|---|
cielo | dia, atardecer, noche, tinta, o { "arriba": color, "abajo": color } | El fondo. Con dos colores hace un degradado. |
luzAmbiente | 0 a 2 | Luz pareja que llega a todo. |
sol | { direccion, intensidad, color } | La luz que proyecta sombras. intensidad de 0 a 3. |
niebla | { desde, hasta } | Distancias a las que empieza y a la que tapa todo. |
gravedad | de -200 a -1 | Por defecto -40. Menos negativa: saltos más largos y flotantes. |
alturaCaida | número | Por debajo de esta altura, el jugador "cayó" y reaparece. Por defecto -30. |
El ambiente de Circuito Luz Verde: cielo en degradado, sol de lado y niebla lejana.
"ambiente": { "cielo": { "arriba": "noche", "abajo": "violeta" }, "luzAmbiente": 0.85, "sol": { "direccion": [-0.45, -1, 0.35], "intensidad": 1.1 }, "niebla": { "desde": 70, "hasta": 220 }, "alturaCaida": -14 },Sube alturaCaida hasta poco más abajo de tu plataforma más baja: quien cae vuelve antes y no espera mirando el vacío.
Vistas#
Todos los juegos usan el mismo mundo 3D de piezas. La vista decide la cámara, cómo se mueve el jugador y, en las 2D, a qué plano queda restringido. Se declara en la escena ("vista"), en una zona (vale mientras el jugador está dentro) o la fija el script con camara.vista. Sin vista, la escena es de tercera persona.
Esta es la vista de la plantilla de plataformas 2D (packages/toolkit/plantillas/plataformas-2d/escenas/principal.json):
"vista": { "tipo": "lateral", "zoom": 13, "plano": { "eje": "z", "valor": 0 }, "limites": { "min": [0, -2, 0], "max": [64, 16, 0] } },tipo | Qué es | Cámara | Movimiento |
|---|---|---|---|
tercera-persona | La vista por defecto | En perspectiva, orbital detrás del avatar; el jugador la gira | Relativo a la cámara |
primera-persona | Se ve por los ojos del avatar | En perspectiva, en los ojos. Se mira con el ratón (un clic lo captura), con la palanca derecha o arrastrando. El avatar propio no se dibuja | Relativo a la mirada |
isometrica | La diagonal clásica | Ortográfica, 35,26 grados de inclinación y 45 de giro | Relativo a la pantalla |
cenital | Desde arriba, algo inclinada (aventura, estrategia) | Ortográfica, 60 grados | Relativo a la pantalla |
lateral | 2D de plataformas | Ortográfica de lado, con zona muerta y límites | Solo a lo largo del plano; salto y gravedad; "arriba" también salta |
plano | 2D visto exactamente desde arriba (laberintos, arcade) | Ortográfica recta hacia abajo | En el plano del suelo; sin salto, salvo con "salto": true |
Todos los parámetros son opcionales: cada tipo tiene sus valores por defecto.
| Parámetro | Vistas | Qué hace | Por defecto |
|---|---|---|---|
campo | tercera y primera persona | Campo de visión vertical, en grados | 62 (78 en pantallas verticales) y 75 |
zoom | las ortográficas | Unidades del mundo que caben en el alto de la pantalla | isométrica 18, cenital 20, lateral 14, plano 18 |
distancia | tercera persona | Distancia al avatar | 10 |
inclinacion | todas menos primera persona | Grados sobre el horizonte | tercera 22, isométrica 35,264, cenital 60, lateral 0, plano 90 |
giro | todas | Grados; 0 mira hacia +Z | isométrica 45; lateral 180 (mira hacia -Z, con +X a la derecha) |
altura | primera persona | Altura de los ojos | 1,6 |
suavizado | todas | 0 deja la cámara pegada al jugador; 1, muy suelta | 0,35 (0 en primera persona) |
limites | las ortográficas | { "min": [x, y, z], "max": [x, y, z] }: la cámara no muestra fuera del nivel | sin límites |
zonaMuerta | lateral | [ancho, alto]: la cámara no se mueve mientras el avatar esté en esa caja | [3, 2] |
plano | lateral | { "eje": "z" o "x", "valor": n }: el eje que se bloquea y su coordenada | eje z, en la coordenada del jugador |
giroPorPasos | isométrica y cenital | El jugador gira la vista de a 90 grados (Z y C, los botones superiores del mando o los botones en pantalla) | false |
clicParaMover | isométrica, cenital y plano | Un clic o un toque en el suelo manda al avatar a ese punto, rodeando obstáculos | false |
reticula | primera persona | Una mira en el centro de la pantalla | true |
salto | plano | Permite saltar | false |
Reglas de las vistas 2D:
- En
lateral, la sala lleva al jugador al plano (a 9 unidades por segundo: entrar a una zona 2D no es un salto) y lo mantiene ahí; ignora la entrada en el eje bloqueado. Las piezasdinamicade una escena lateral también quedan en el plano, y los actores igual. - Con
"eje": "z"se camina en X y la cámara mira desde +Z (X crece hacia la derecha). Con"eje": "x"se camina en Z. - Diseña el nivel sobre el plano: las piezas deben cruzarlo. Basta con que tengan 2 o 3 unidades de fondo.
- En
planoy encenitalconvienejugador.salto = 0si los muros son bajos.
Juegos híbridos: zonas que cambian la vista#
Un juego puede mezclar 2D y 3D. Hay tres maneras:
- Zona con vista. Una zona con
vistacambia la vista de quien entra y, al salir, vuelve la que tenía.transicionson los segundos que dura el cambio (por defecto 0,6). Si no se daplano.valor, se usa el centro de la zona. - Escenas con vistas distintas. Cada escena tiene su
vista;juego.cambiarEscenacambia las dos cosas. - Desde el script.
camara.vista('isometrica'),camara.vista({ tipo: 'lateral', plano: { eje: 'z', valor: 0 } }, { transicion: 1 }, jugador)ycamara.vista(null), que devuelve la de la escena. La vista de una zona manda sobre la del script mientras se está dentro. Ver camara.
Las dos zonas de la plantilla híbrida (packages/toolkit/plantillas/hibrido/escenas/principal.json): un túnel que se juega de lado y una plaza isométrica, dentro de un mundo de tercera persona.
"zonas": [
{ "id": "tunel", "forma": "caja", "posicion": [26, 4, 0], "tamano": [28, 10, 6], "vista": { "tipo": "lateral", "zoom": 13, "plano": { "eje": "z", "valor": 0 } }, "transicion": 0.6 },
{ "id": "plaza-iso", "forma": "caja", "posicion": [46, 3, 0], "tamano": [12, 8, 12], "vista": { "tipo": "isometrica", "zoom": 16 }, "transicion": 0.6 }
]Cómo se comporta el cambio:
- Transición. Entre dos vistas con la misma proyección, la cámara viaja de una pose a la otra. Entre perspectiva y ortográfica, o hacia la primera persona, no hay mezcla posible: funde a negro, cambia a mitad de camino y vuelve.
- Controles. Se reasignan al instante con la vista: lo que era "adelante" pasa a ser relativo a la cámara nueva. Al dejar una vista
lateral, el eje se libera y el jugador queda donde está. Al volver a tercera persona, la cámara conserva el giro que tenía el jugador. - La vista es por jugador. En una partida con varios jugadores, cada uno puede estar en una vista distinta.
- Para que el cambio no confunda: haz la zona más ancha que el pasillo (el jugador entra al plano de a poco); pon la entrada y la salida sobre el plano; mueve el punto de reaparición al entrar; y no cambies de vista en medio de un salto difícil.
En el editor las vistas se eligen sin escribir JSON: Tipos de juego.
Láminas#
Una lámina es un dibujo de píxeles guardado como datos, sin archivos de imagen. Vive en laminas/<id>.json. El nombre del archivo es su id: minúsculas, números y guiones.
La moneda de la plantilla de plataformas 2D (packages/toolkit/plantillas/plataformas-2d/laminas/moneda.json), con tres cuadros y una animación:
{
"$schema": "../../../packages/sdk/esquemas/lamina.schema.json",
"formato": 1,
"ancho": 8,
"alto": 8,
"paleta": ["tierra", "ambar", "papel"],
"cuadros": [
[
"..0000..",
".011110.",
"01121110",
"01211110",
"01211110",
"01111110",
".011110.",
"..0000.."
],
[
"...00...",
"..0110..",
"..0120..",
"..0120..",
"..0110..",
"..0110..",
"..0110..",
"...00..."
],
[
"...00...",
"...00...",
"...00...",
"...00...",
"...00...",
"...00...",
"...00...",
"...00..."
]
],
"animaciones": {
"girar": {"cuadros": [0, 1, 2, 1], "fps": 8}
}
}| Propiedad | Notas |
|---|---|
ancho, alto | Píxeles de cada cuadro. De 1 a 64 por lado. |
paleta | Hasta 36 colores: nombres de la paleta de Green Games o colores "#rrggbb". |
cuadros | Hasta 64. Cada cuadro es una lista de alto filas de ancho caracteres. Cada carácter es un color de paleta: 0 el primero, 9 el décimo, a el undécimo, hasta z. El punto . es transparente. |
animaciones | Opcional. Nombre → { cuadros, fps, repetir }. fps vale 8 por defecto y repetir, true. |
Los píxeles se dibujan nítidos, sin suavizado y sin luces: el color es el que escribiste. Un juego admite hasta 128 láminas.
Una lámina tiene tres usos.
Pieza plana. Una pieza con "forma": "lamina". Así está la primera moneda de esa plantilla:
{ "id": "moneda-1", "forma": "lamina", "lamina": "moneda", "animacion": "girar", "posicion": [4, 1, 0], "tamano": [0.9, 0.9, 0.4], "material": "ambar", "solida": false, "etiquetas": ["moneda"] }La imagen ocupa el ancho y el alto de tamano y mira hacia +Z; se gira con rotacion, como cualquier pieza. El tercer número de tamano es el fondo de su caja de colisión. material se exige como en toda pieza, pero no se dibuja. Hasta 400 piezas con lámina a la vez.
| Propiedad | Notas |
|---|---|
lamina | Obligatoria con esta forma. El id de la lámina. |
animacion | El nombre de una animación o un número de cuadro fijo. Sin ella, la primera animación. |
espejo | true: se dibuja al revés en horizontal. |
mirarCamara | true: gira sola para dar siempre la cara. Sirve para poner láminas dentro de un mundo 3D (árboles, monedas, carteles). Con cámara en perspectiva gira solo en el eje vertical; con cámara ortográfica queda de frente. |
Desde el script se cambian con pieza.lamina, pieza.animacion (asignarla la reinicia) y pieza.espejo.
Baldosa de un mapa. Ver Mapas de baldosas.
Personaje. "avatar": { "lamina": "heroe" } en la escena dibuja a los jugadores con esa lámina en vez del avatar de bloques. Con un actor es apariencia: { lamina: 'guardia' }, y desde el script, jugador.apariencia = { lamina: 'heroe' }.
- La lámina se estira a la altura del avatar (1,8) y conserva su proporción: 8 x 16 píxeles calza con su ancho de choque.
- Dibuja al personaje mirando a la derecha: el motor lo espeja solo cuando va hacia la izquierda.
- Estas animaciones se usan solas, si existen:
quieto,caminar,saltarycaer; y en las vistas desde arriba,quieto-arriba,caminar-arriba,quieto-abajoycaminar-abajo(de espaldas y de frente). La que falte se reemplaza por la más parecida. - La colisión del personaje no cambia: sigue siendo la cápsula del avatar.
Mapas de baldosas#
Un mapa es una rejilla escrita como texto: cada carácter es una baldosa. Es la forma de hacer niveles 2D, y pisos y muros de juegos vistos desde arriba, sin colocar pieza por pieza. Una escena declara sus mapas en mapas, hasta 8.
El mapa del nivel de la plantilla de plataformas 2D, recortado a sus primeras 14 columnas (el archivo trae 64 y dos capas de fondo con cerros):
"mapas": [{
"id": "nivel",
"plano": "xy",
"origen": [0, 12, 0],
"baldosas": {
"T": { "lamina": "tierra", "cuadro": 0 },
"#": { "lamina": "tierra", "cuadro": 1 },
"=": { "lamina": "tabla", "colision": "plataforma" },
"^": { "lamina": "puas", "colision": "peligro" },
"H": { "lamina": "escalera", "colision": "escalera" },
"m": { "material": "cerro-lejos", "colision": "ninguna" },
"n": { "material": "cerro", "colision": "ninguna" }
},
"capas": [
{ "id": "suelo", "filas": [
".",
".",
".",
".",
".",
".",
".",
".",
".",
".",
".",
".",
"TTTTTTTTTTTTTT",
"##############"
] }
]
}]| Propiedad | Notas |
|---|---|
id | Obligatorio. Único en la escena. |
plano | "xy": mapa vertical, para la vista lateral. Las columnas crecen hacia +X y las filas hacia abajo. "xz": mapa de suelo, para cenital, plano, isometrica y los mundos 3D. Las columnas crecen hacia +X y las filas hacia +Z, igual que en pantalla con la vista cenital. |
origen | La esquina de la celda de la columna 0 y la fila 0. En xy es la de arriba a la izquierda, y su z es el plano del nivel (el mismo de vista.plano). En xz es la de menor x y z, y su y es la altura del piso. |
celda | Tamaño de una baldosa, en unidades. Por defecto 1. |
grosor | Solo xy: fondo de los bloques de colisión. Por defecto 3. |
baldosas | Carácter → baldosa. Un solo carácter, que no sea punto ni espacio. Hasta 60. |
capas | De 1 a 8. Cada una con filas (texto; . o un espacio es vacío; la fila 0 es la de arriba) y, opcionales, id, fondo, paralaje y profundidad. |
dificultades | El mapa existe solo en esas dificultades. Sirve para sumar un mapa de trampas en la más difícil. |
Con "origen": [0, 12, 0] y celdas de 1, la fila 12 va de y = 0 a y = -1: su borde de arriba es el piso en y = 0.
Una baldosa se dibuja con material (un color) o con lamina (y cuadro), puede llevar etiquetas y choca según colision:
colision | Dónde | Comportamiento |
|---|---|---|
solida (por defecto) | xy y xz | Bloque. En xz mide alto unidades de alto (por defecto, una celda): un muro. |
suelo | xz | Piso por el que se camina, a la altura de origen[1]. |
plataforma | xy | De un sentido: se atraviesa saltando desde abajo y se pisa desde arriba. Con "abajo" (palanca o tecla), el jugador se deja caer a través de ella. |
peligro | xy y xz | No estorba, pero avisa el toque: sus bloques llevan la etiqueta peligro. Es un poco más angosta que la celda, para que rozarla de costado no cuente. |
escalera | xy | Con "arriba" y "abajo" se sube y se baja sin gravedad; al soltar, el jugador queda colgado; saltar la suelta. El tope se pisa como una plataforma: ponla a ras de la plataforma a la que lleva (H====). |
ninguna | xy y xz | Decorado. |
Un piso con muros visto desde arriba es lo mismo con "plano": "xz". Así declara sus baldosas la plantilla cenital (packages/toolkit/plantillas/cenital/escenas/principal.json): un piso por el que se camina y un muro de 2 unidades de alto.
"baldosas": { "s": { "lamina": "piso", "colision": "suelo" }, "M": { "lamina": "ladrillo", "alto": 2, "etiquetas": ["muro"] } },Cómo se comporta un mapa:
- Colisión fusionada. Las baldosas iguales y contiguas se juntan en rectángulos (por trozos de 32 x 32 celdas): un piso de mil baldosas es un puñado de bloques. Los bloques no son piezas: no cuentan para los límites de piezas ni salen en
mundo.piezas(), pero los ven los toques, los rayos, el enrutador del bot yjugador.caminarA. - Etiquetas de los bloques.
mapa,mapa-<id>, las deetiquetasde la baldosa y, según la colisión,peligro,escaleraoplataforma. Asímundo.alTocar('#peligro', (bloque, jugador) => jugador.reaparecer())sirve igual para púas hechas con piezas o con baldosas. Enbloque.datosvienenmapa,baldosa,columnayfila. - Capas de fondo (
"fondo": true). Solo se dibujan.profundidadlas aleja del plano (por defecto 1; negativa las pone delante, como primer plano) y, en mapasxy,paralajedice cuánto se mueven con la cámara: 1 normal, 0,5 la mitad (parecen lejos), 0 quietas en pantalla. - Dibujo. En un mapa
xy, las baldosas sólidas y las plataformas tienen volumen (elgrosor), así que el nivel también se ve bien si la cámara pasa a 3D; lo demás (escaleras, púas, adornos) queda plano, justo detrás del avatar. En un mapaxz, las baldosas reciben luz y sombras como las piezas. Elacabadoy elpatrondel material no se aplican a las baldosas: solo el color. - Tamaños. Hasta 512 x 512 celdas por mapa, 8 mapas por escena y 200 000 baldosas por escena.
- En mundos 3D. Un mapa
xytiene volumen, así que un tramo 2D se ve como un pasillo de bloques al salir a 3D. Usa el mismozenorigendel mapa y enplano.valorde la zona. - Las láminas que miran a la cámara en una vista desde arriba quedan acostadas a su altura: un muro vecino más alto las tapa. Las de los personajes se dibujan sobre su cabeza para evitarlo; las demás, súbelas o aléjalas.
El script lee y cambia las baldosas con mundo.mapa(id): ver Mapa. Un mapa no crece más allá de las filas y columnas declaradas.
Lo que los mapas todavía no hacen: las baldosas no se animan solas (para agua o lava que se mueve, usa piezas con "forma": "lamina"), no hay pendientes y las piezas dinámicas chocan con las plataformas de un sentido por los dos lados.
Consejos para un nivel 2D#
- El plano del nivel lateral es el de
vista.plano(por defecto z = 0): usa ese mismozenorigendel mapa y en las piezas sueltas (monedas, plataformas que se mueven). - Deja el salto en lo que da el avatar. Una plataforma a 2 celdas de alto se alcanza; a 3, no.
- El personaje se dibuja mirando a la derecha, en una lámina de proporción 1 a 2 (por ejemplo 8 x 16).
- Todo lo demás (script, HUD, bot, puntajes) es igual que en un juego 3D.
Consejos para armar la escena#
- Centro contra pies.
posicionde una pieza es su centro; la de una aparición son los pies. Una plataforma con la cara superior en y = 0 es"posicion": [x, -0.5, z], "tamano": [a, 1, l], y la aparición sobre ella va en y = 0. - Parte por el suelo y las apariciones. Si la aparición no está sobre una pieza sólida, el jugador aparece y cae. El validador avisa.
- Diseña con las medidas del avatar: huecos de hasta 4 unidades, escalones de hasta 0,45 sin saltar, saltos de hasta 2,6 de alto. La tabla completa está en Estructura de un paquete.
- Etiquetas para lo que se repite,
idpara lo único.moneda,peligro,controlson etiquetas; elides para lo que el script o el bot nombran uno por uno (ascensor,meta). Si son muchas piezas iguales, omite elid. - Lo que cambia con la dificultad va en la escena, con
"dificultades": ["facil"]en la pieza o la zona. Circuito Luz Verde tiene dos juegos de losas en el mismo lugar: las anchas parafacilynormal, y las angostas (con otroid) paradificil. - Los peligros se entienden por el color. Usa
{ "color": "coral", "acabado": "neon" }y no hace falta explicarlos. - Decorado sin costo de física. Lo que nadie toca va con
"fisica": "ninguna".
Sigue con#
- Scripts: darle comportamiento a lo que declaraste.
- mundo: leer, crear, mover y eliminar piezas desde el script.
- La escena en el editor: armar lo mismo sin escribir JSON.
- Tipos de juego: elegir la vista al crear un proyecto en el editor.