Saltar al contenido
Docs

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. posicion de 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); id solo para lo que el script o el bot nombran uno por uno.
  • Lo que cambia con la dificultad va en la escena, con dificultades en 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 z en vista.plano, en origen del 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 reloj e interfaz.cronometro; azar con azar. Nada de setTimeout, Date ni Math.random.
  • Para mover una pieza, asigna un vector nuevo (pieza.posicion = [x, y, z]) o usa pieza.moverA(...).
  • Termina siempre: juego.terminar({ resultado, puntaje, tabla }).
  • Piensa en la pantalla chica. En teléfonos los textos largos se cortan: usa jugador.pantalla.vertical para elegir un texto corto, mensajes con tamano: 'chico' para lo secundario y cola: true para 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 ir por tramo cuando hay saltos y plataformas: sin ruta, 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.json con "esperado": { "resultado": "derrota" }.

Antes de compartir el juego#

  • Pruébalo donde se va a jugar: importa el .ggx en 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.terminar con un puntaje y una tabla declarada en puntajes.
  • 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 validar sin errores y con los avisos revisados.
  • Pasa gb probar en las tres dificultades (el bot gana).
  • Se ve bien en la portada del catálogo: recursos/portada.svg 16: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 probar y 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íntomaCausa y arreglo
El jugador aparece y cae al vacíoLa 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 disparaLa pieza tiene fisica: "ninguna". Para algo que se atraviesa pero avisa, usa solida: false.
El texto sale como la claveLa 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ñaLa 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 otraEl 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 rebotaDale "rebote": 0.8 (y "friccion" baja) a la pieza dinámica.
El récord aparece en una derrotaNo 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 antiguoLos 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#