Saltar al contenido
Docs

Mundo abierto

El tipo de juego de cubos generados, con su tabla de biomas, cómo se rompen y se ponen bloques, qué se guarda y cómo partir de la plantilla.

Corresponde aFormato 1, API 1.1 Para quien escribe código

En esta página

Un juego de mundo abierto no se arma pieza por pieza: el motor genera un mundo de cubos a partir de una semilla y de una tabla de biomas, y el script pone las reglas. Es la versión 1.1 del contrato.

Partir de la plantilla#

sh
greengames crear mi-valle --tipo mundo-abierto --nombre "Mi valle"
greengames validar mi-valle
greengames probar mi-valle
Salida de probar (última línea)
mi-valle: prueba aprobada (6 de 6 corridas, .ggx de 8.4 KB)

La plantilla trae un juego completo y corto: juntar madera y después poner esos bloques. Sus archivos:

ArchivoQué trae
escenas/principal.jsonEl terreno: 31 bloques, 9 biomas y los parámetros del generador. También la pieza objetivo, la marca que guía al jugador.
scripts/principal.tsLas reglas: romper, poner, la barra rápida, el objetivo y el guardado. No genera nada.
pruebas/bot.jsonEl guion del bot: va a la marca, la mira y mantiene apretado. No conoce coordenadas.

Para hacer un mundo propio se cambia la tabla de la escena, sin tocar el script.

Desde el editor#

En el editor 0.4.0 el mundo abierto es un tipo de juego más. En Nuevo juego hay dos caminos, según lo que elijas en Cómo se programa:

  • Reglas o código: el tipo Mundo abierto con la plantilla Ejemplo de mundo abierto, que viene con código. Ver Tipos de juego.
  • Bloques: el ejemplo Cristales y cubos. Ver Mundo abierto con bloques.

El proyecto se prueba con el bot y se exporta a .ggx como cualquier otro.

El terreno en la escena#

Va en terreno, dentro del archivo de la escena. Un bloque mide 1 x 1 x 1 y sus coordenadas son enteras. El mundo mide 64 bloques de alto y llega hasta limite en X y en Z; más allá es mar. Se genera por trozos de 16 x 16 bloques de base, a medida que alguien se acerca.

PropiedadNotas
semillaSemilla fija: el mismo mundo en todas las partidas. Sin ella, o con 0, el mundo sale de la semilla de la partida: uno distinto cada vez.
nivelDelMarAltura del agua. Por defecto 22.
distanciaDistancia de dibujo que pide el juego, en trozos: de 2 a 12. Por defecto 6. El reproductor la acorta si el equipo no rinde y la vuelve a alargar.
limiteHasta dónde llega el mundo: de 64 a 2000.
subirBloquesLos personajes suben solos un bloque de alto, sin saltar. Por defecto true.
bloquesLos tipos de bloque, por id. Hasta 200. aire está reservado.
biomasLa tabla de biomas. Hasta 24, y al menos uno de tierra.
generadorParámetros del generador: piedra, agua, cuevas, minerales y estructuras. Todos opcionales.

Un bloque lleva su color y, si hace falta, arriba y abajo para esas caras. Con "liquido": true es agua: no fluye, se flota y se nada. Con "forma": "cruz" es una planta. dureza son los segundos que cuesta romperlo, y -1 quiere decir que no se rompe: es un dato para el script, el motor solo lo informa.

escenas/principal.json (fragmento)
"terreno": {
  "semilla": 2026,
  "nivelDelMar": 22,
  "distancia": 6,
  "bloques": {
    "pasto":  { "color": "#8a5a34", "arriba": "#5fc234", "dureza": 0.6 },
    "tierra": { "color": "tierra", "dureza": 0.5 },
    "agua":   { "color": "#2f8fe0", "liquido": true, "dureza": -1 },
    "tronco": { "color": "madera", "etiquetas": ["madera"] },
    "flor":   { "color": "ambar", "forma": "cruz", "dureza": 0 }
  },
  "biomas": [
    { "id": "pradera", "temperatura": 0.5, "humedad": 0.4, "altura": 3, "relieve": 5, "superficie": "pasto", "subsuelo": "tierra" },
    { "id": "oceano", "zona": "mar", "superficie": "arena" },
    { "id": "playa", "zona": "costa", "superficie": "arena" }
  ]
}

La tabla de biomas#

Cada fila dice en qué clima aparece el bioma, qué tan alto y quebrado es, de qué está hecho y qué crece.

PropiedadNotas
idÚnico.
zona"tierra", por defecto: se elige por clima. "mar": lo que queda bajo el agua. "costa": la franja a nivel del mar.
temperatura, humedadClima ideal, de 0 a 1. En cada lugar gana el bioma de tierra más parecido al clima de ahí.
altura, relieveBloques sobre el mar en las partes bajas, y cuánto sube el relieve sobre eso. Entre biomas vecinos se mezclan: la frontera es una pendiente, no un escalón.
superficie, subsuelo, profundidad, fondoBloque de arriba, el de abajo y cuántas capas antes de la piedra. fondo es la superficie cuando queda bajo el agua.
cimaDesde esa altura la superficie es otro bloque: { "desde": 40, "bloque": "nieve" }.
arbolesHasta 4: densidad, tronco, hojas, alto y copa. Sin hojas es un tronco solo, como un cactus.
plantasHasta 6: un bloque y su densidad, sueltas sobre la superficie.

Para sumar un bioma, copia una fila, cámbiale el id y dale un clima que no tenga otro. Deja siempre uno con "zona": "mar" y otro con "zona": "costa".

Estos son los nueve biomas de la plantilla, los mismos de Valle Abierto:

BiomaTemperatura y humedadAltura y relieveSuperficieQué crece
Pradera0,5 y 0,423 y 5pastoárboles sueltos, pasto alto, flores
Bosque0,42 y 0,744 y 8pastoárboles, pasto alto
Desierto0,9 y 0,123 y 6arenacactus, arbustos secos
Montaña nevada0,14 y 0,387 y 24piedra; nieve desde la altura 40pinos
Tundra0,1 y 0,783 y 5nievepinos
Pantano0,66 y 0,92-1 y 2,5barroárboles, juncos
Selva0,88 y 0,784 y 9pastoárboles de selva, pasto alto
Océanozona mararena
Playazona costaarena

Romper y poner#

Romper y poner los decide el script: el motor da el rayo, cambia el bloque y avisa. Hay dos acciones para eso, que se declaran en controles.acciones del manifiesto como las demás:

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

El esqueleto, tal como está en el contrato:

scripts/principal.ts
const terreno = mundo.terreno;

juego.cadaCuadro(() => {
  for (const j of jugadores.todos()) {
    const a = j.apuntaBloque(5);
    interfaz.marcarBloque(a ? a.posicion : null, {}, j);
    if (a && j.pulsa('primaria')) terreno.romper(a.posicion[0], a.posicion[1], a.posicion[2], j);
  }
});
jugadores.alAccion('secundaria', (j) => {
  const a = j.apuntaBloque(5);
  if (a) terreno.poner(a.vecino[0], a.vecino[1], a.vecino[2], 'tabla', j);
});
  • jugador.apuntaBloque entrega el bloque al que se apunta, la cara tocada y vecino, la celda donde iría un bloque nuevo.
  • terreno.romper devuelve el id de lo que había. La plantilla lo suma a un inventario y lo muestra con interfaz.barraRapida.
  • terreno.poner devuelve false si en esa celda hay un jugador o un actor: no deja encerrar a nadie.
  • El fondo del mundo no se toca, ni lo que queda fuera de limite.
  • La plantilla usa dureza para que romper tome tiempo: cuenta los segundos con el botón apretado y muestra el avance con interfaz.marcarBloque.

Todas las funciones: Servicio mundo.

Guardado#

El mundo no se guarda: se vuelve a generar con su semilla. Lo que se guarda es solo lo que difiere del mundo generado.

  • terreno.guardar(jugador) escribe esos cambios en el progreso de ese jugador, junto con la semilla. Devuelve cuántos bloques y cuántos bytes ocupó.
  • terreno.restaurar(jugador) vuelve a ese mundo y le pone los cambios encima. Devuelve cuántos bloques restauró.
  • terreno.borrarGuardado(jugador) los borra.

La plantilla llama a restaurar cuando entra el jugador y a guardar al terminar la partida.

TopeValor
Bloques cambiados que se recuerdan a la vez60 000
Cambios guardados320 KB, aparte de los 64 KB del progreso
Celdas por llamado a terreno.llenar4096
Ranuras de la barra rápida9

Al llegar al tope de bloques cambiados, poner y romper fallan con un mensaje claro: terreno.cambios dice cuántos van. Todos los topes: Límites.

El launcher 0.4.0 guarda esos cambios en disco junto con el resto del progreso del juego: hasta 384 KB por juego, que son los 64 KB del progreso y los 320 KB de cambios del terreno. Así un mundo de Valle Abierto que guardas sigue ahí la próxima vez que abres el launcher.

Cómo se comporta#

  • Las apariciones caen al suelo. En una escena con terreno, la altura de una aparición se ignora: el jugador queda sobre el suelo de esa columna o, si ahí hay mar, en la tierra más cercana.
  • Colisión. Jugadores, actores y piezas dinámicas chocan con el terreno. Las piezas, zonas, luces y actores siguen funcionando como siempre.
  • Agua. Quien entra a un bloque líquido flota; con saltar nada hacia arriba y sale a la orilla.
  • Niebla. El reproductor pone niebla a la distancia de dibujo. La niebla del ambiente no se usa en una escena con terreno.
  • El bot camina por el mundo generado con "ruta": true: rodea troncos y laderas, y nada si hay agua.

Qué falta#

  • El launcher 0.2.0 y el editor 0.2.0 no traen el terreno de cubos: hace falta la versión 0.3.0.
  • El editor no trae un editor de biomas ni de bloques: Detalles muestra la tabla de biomas en solo lectura, en la categoría Mundo abierto, con el rótulo «editor: próximamente» y un botón para abrir la carpeta del proyecto. La tabla se cambia en el archivo de la escena.
  • Lo que el modo Bloques todavía no hace con el mundo de cubos está en Bloques.
  • No hay mundo abierto en línea.
  • El agua no fluye y la luz de un bloque no ilumina a sus vecinos.
  • No hay enemigos ni fauna hechos para el terreno.

Sigue con#