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#
greengames crear mi-valle --tipo mundo-abierto --nombre "Mi valle"
greengames validar mi-valle
greengames probar mi-vallemi-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:
| Archivo | Qué trae |
|---|---|
escenas/principal.json | El 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.ts | Las reglas: romper, poner, la barra rápida, el objetivo y el guardado. No genera nada. |
pruebas/bot.json | El 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.
| Propiedad | Notas |
|---|---|
semilla | Semilla 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. |
nivelDelMar | Altura del agua. Por defecto 22. |
distancia | Distancia 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. |
limite | Hasta dónde llega el mundo: de 64 a 2000. |
subirBloques | Los personajes suben solos un bloque de alto, sin saltar. Por defecto true. |
bloques | Los tipos de bloque, por id. Hasta 200. aire está reservado. |
biomas | La tabla de biomas. Hasta 24, y al menos uno de tierra. |
generador | Pará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.
"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.
| Propiedad | Notas |
|---|---|
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, humedad | Clima ideal, de 0 a 1. En cada lugar gana el bioma de tierra más parecido al clima de ahí. |
altura, relieve | Bloques 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, fondo | Bloque de arriba, el de abajo y cuántas capas antes de la piedra. fondo es la superficie cuando queda bajo el agua. |
cima | Desde esa altura la superficie es otro bloque: { "desde": 40, "bloque": "nieve" }. |
arboles | Hasta 4: densidad, tronco, hojas, alto y copa. Sin hojas es un tronco solo, como un cactus. |
plantas | Hasta 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:
| Bioma | Temperatura y humedad | Altura y relieve | Superficie | Qué crece |
|---|---|---|---|---|
| Pradera | 0,5 y 0,42 | 3 y 5 | pasto | árboles sueltos, pasto alto, flores |
| Bosque | 0,42 y 0,74 | 4 y 8 | pasto | árboles, pasto alto |
| Desierto | 0,9 y 0,12 | 3 y 6 | arena | cactus, arbustos secos |
| Montaña nevada | 0,14 y 0,38 | 7 y 24 | piedra; nieve desde la altura 40 | pinos |
| Tundra | 0,1 y 0,78 | 3 y 5 | nieve | pinos |
| Pantano | 0,66 y 0,92 | -1 y 2,5 | barro | árboles, juncos |
| Selva | 0,88 y 0,78 | 4 y 9 | pasto | árboles de selva, pasto alto |
| Océano | zona mar | arena | ||
| Playa | zona costa | arena |
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ó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 |
El esqueleto, tal como está en el contrato:
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.apuntaBloqueentrega el bloque al que se apunta, la cara tocada yvecino, la celda donde iría un bloque nuevo.terreno.romperdevuelve el id de lo que había. La plantilla lo suma a un inventario y lo muestra coninterfaz.barraRapida.terreno.ponerdevuelvefalsesi 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
durezapara que romper tome tiempo: cuenta los segundos con el botón apretado y muestra el avance coninterfaz.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.
| Tope | Valor |
|---|---|
| Bloques cambiados que se recuerdan a la vez | 60 000 |
| Cambios guardados | 320 KB, aparte de los 64 KB del progreso |
Celdas por llamado a terreno.llenar | 4096 |
| Ranuras de la barra rápida | 9 |
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
saltarnada hacia arriba y sale a la orilla. - Niebla. El reproductor pone niebla a la distancia de dibujo. La
niebladel 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#
- Escenas: el resto del archivo de la escena.
- Servicio mundo:
mundo.terreno, función por función. - Guion del bot: cómo se prueba un juego sin pantalla.
- Herramienta de línea de comandos