Buenas prácticas y lista de calidad
Lo que conviene hacer al fabricar un juego, la lista de comprobación de calidad con casillas para marcar y la tabla de errores frecuentes con su causa y su arreglo.
Corresponde aFormato 1, API 1 Para quien escribe código
En esta página
Un juego que pasa el validador todavía puede ser confuso, injusto o imposible de jugar en un teléfono. Esta página junta lo que la guía del autor de Green Games pide además de "no tener errores".
Antes de escribir#
Decide el juego en una frase: qué hace el jugador, cómo gana, cómo pierde y qué número mide lo bien que le fue.
Cruza el circuito hasta la meta; gana al llegar, pierde si se acaba el tiempo; el puntaje es el tiempo.
Si no puedes escribir esa frase, el juego todavía no está decidido. Todo lo demás (la escena, el script, el guion del bot, la tabla de puntajes) sale de ella.
Al armar la escena#
- Parte por el suelo y las apariciones.
posicionde una pieza es su centro; la de una aparición son los pies del avatar. - 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.
- Etiquetas para todo lo que se repite (
moneda,peligro,control);idsolo para lo que el script o el bot nombran uno por uno. - Lo que cambia con la dificultad va en la escena, con
dificultadesen la pieza o la zona. - Lo que se mueve siempre igual va en la escena, con
movimiento. Lo que depende del juego, desde el script. - Solo colores con nombre. Para los peligros,
{ "color": "coral", "acabado": "neon" }: se entiende sin explicación. - Si el juego es 2D, el nivel es un mapa de baldosas, no pieza por pieza, y los dibujos son láminas. Usa el mismo
zenvista.plano, enorigendel mapa y en las piezas sueltas. Ver Mapas de baldosas.
Al escribir el script#
- Registra todo dentro de
juego.alIniciar. - Estado por jugador en
jugador.datos; estado de la partida en variables del archivo. No escribas pensando en "el jugador": puede haber bots y varias personas en el mismo equipo. Ver Varios jugadores. - Textos siempre con
interfaz.t('clave', { variables }), con la clave en los dos idiomas del manifiesto. - Tiempo con
relojeinterfaz.cronometro; azar conazar. Nada desetTimeout,DateniMath.random. - Para mover una pieza, asigna un vector nuevo (
pieza.posicion = [x, y, z]) o usapieza.moverA(...). - Termina siempre:
juego.terminar({ resultado, puntaje, tabla }). - Piensa en la pantalla chica. En teléfonos los textos largos se cortan: usa
jugador.pantalla.verticalpara elegir un texto corto, mensajes contamano: 'chico'para lo secundario ycola: truepara que no se apilen.
Al escribir el guion del bot#
- El bot debe poder ganar en todas las dificultades.
- En un escenario de un nivel (patio, laberinto, arena), usa
{ "ir": "zona:meta", "ruta": true }: rodea muros y huecos solo. - Un paso
irpor tramo cuando hay saltos y plataformas: sinruta, el bot va en línea recta. - Deja señales desde el script (
juego.senalar('ronda', 2)) para que el guion sepa en qué momento está el juego. - Para peligros con ritmo, haz que el script avise: etiqueta una pieza cuando sea seguro pasar y espera con
{ "esperarPieza": "id", "con": "libre" }. - Prueba también que se puede perder, si el juego se puede perder:
pruebas/bot-derrota.jsoncon"esperado": { "resultado": "derrota" }.
Antes de compartir el juego#
- Pruébalo donde se va a jugar: importa el
.ggxen el launcher y juega una partida entera. Ver Importar un .ggx. - Si es de varios jugadores, pruébalo con varios:
greengames probar <slug> --jugadores 4, y una partida de verdad con dos personas en el mismo equipo.
Lista de comprobación de calidad#
Es la lista con que se decide si un juego entra al catálogo de Green Games. Sirve igual para un juego que vas a compartir como archivo. gb es la herramienta greengames.
- Se entiende en 10 segundos. Al empezar, un mensaje o el propio nivel dice qué hacer. La descripción del manifiesto lo explica en una o dos frases.
- Tiene objetivo, puntaje y final. Se puede ganar; si se puede perder, también termina. Siempre se llega a
juego.terminarcon unpuntajey una tabla declarada enpuntajes. - Tres dificultades (
facil,normal,dificil) que cambian algo real: tiempo, velocidad de los peligros, ayudas. - Español e inglés en nombre, descripción, acciones, dificultades, tablas y todos los
textos. Con tildes. Ningún texto escrito directo en el script. - Funciona con teclado, táctil y mando. Usa solo moverse, cámara y las acciones declaradas (
saltar,accion,accion2). Nada exige precisión que una palanca táctil no dé. - Pasa
gb validarsin errores y con los avisos revisados. - Pasa
gb probaren las tres dificultades (el bot gana). - Se ve bien en la portada del catálogo:
recursos/portada.svg16:9, propia, sin marcas ni personajes de terceros. - Es justo: los peligros se ven venir (color coral, sonido de alerta), hay puntos de control si el recorrido es largo, y caer al vacío devuelve al último control.
- Usa sonido para lo importante (recoger, golpe, final) y no satura.
- No inventa datos: el autor es real, y no hay récords, usuarios ni cifras de mentira.
- Rinde: menos de 1 ms de script por cuadro en
gb probary menos de 600 piezas si se puede.
Los dos números del último punto salen en cada línea de greengames probar: script 0.022 ms/cuadro y 12 piezas. Ver Rendimiento.
Errores frecuentes#
| Síntoma | Causa y arreglo |
|---|---|
| El jugador aparece y cae al vacío | La aparición no está sobre una pieza sólida. Su posicion son los pies: pon y igual a la cara superior de la plataforma. |
| "falta la propiedad obligatoria tamano" | Las claves van sin tildes ni eñes: tamano, posicion, rotacion, cuna. |
Una pieza no se mueve al cambiar posicion[0] | Leer posicion da una copia. Asigna un vector nuevo: p.posicion = [x, y, z]. |
| El toque no se dispara | La pieza tiene fisica: "ninguna". Para algo que se atraviesa pero avisa, usa solida: false. |
| El texto sale como la clave | La clave no está en textos del idioma. gb validar lo detecta si usas interfaz.t('literal'). |
| El bot "no llegó al destino" | Hay un obstáculo en la línea recta, el hueco es muy largo o el destino está a otra altura. Agrega pasos intermedios. |
| "el juego no es reproducible" | Usas Math.random, Date o dependes del orden de un objeto. Usa azar y reloj. Ver Determinismo. |
| No se puede subir una cuña | La pendiente supera los 50 grados: alarga la pieza o bájala. |
interfaz.t(...) + ' algo' muestra [object Object] | t devuelve un objeto traducible. Pon el texto completo en la plantilla, con variables; una variable puede ser otro interfaz.t(...). |
| El bot gana con una semilla y pierde con otra | El juego tiene azar. Mejora el guion (señales, repetir ... hasta) o declara "semillas" y "aprobarCon". |
| "el bot completó sus pasos y la partida no había terminado" | El juego termina solo más tarde: agrega { "esperarFin": true } al final del guion. O falta llamar a juego.terminar. |
| Una pelota no rebota | Dale "rebote": 0.8 (y "friccion" baja) a la pieza dinámica. |
| El récord aparece en una derrota | No pasa: una derrota no entra a la tabla. Para registrar igual, termina con resultado: 'fin'. |
| El juego funciona en el portal y no en un launcher antiguo | Los launcher 0.1.0 y 0.2.0 traen un motor anterior. Actualiza al launcher 0.4.0. Ver Antes de compartir el juego. |
Sigue con#
- Caso de estudio: un juego que cumple la lista, leído por dentro.
- El validador: qué significa cada código de error.
- Ficha y exportar: la misma revisión, desde el editor.