28. Descubrir tiles en un juego

Como hemos visto en el apartado anterior, si estamos pensando hacer un remake, o al menos tomar ideas de un juego clásico, nos puede interesar tratar de descubrir qué casillas repetitivas (tiles) formaban la pantalla de fondo de ese juego.

GIMP tiene una opción que puede ser de gran ayuda para conseguirlo. Se trata del filtro de "rejilla", que superpone una cuadrícula a nuestra imagen.

Lo podemos encontrar en el menú Filtros, dentro de la opción Filtros -> Renderizado -> Patrón -> Rejilla.

Nos preguntará:

  • El espaciado horizontal y vertical, que normalmente será 8 o 16 píxeles en una imagen de un juego de 8 bits que no se haya redimensionado, o bien 16 o 32 píxeles si la imagen está a doble tamaño, como ocurre con algunas que exporta CPCE y algún otro emulador.
  • El desplazamiento inicial, tanto en horizontal como en vertical, que suele ser 0.
  • La anchura de las líneas, que debería bastar con 1 píxel, para que no nos tape mucho de la imagen original.
  • El color de las líneas, que depende de cómo sea el juego: en los que tienen una pantalla predominantemente negra, podríamos dibujar líneas blancas, amarillas o incluso rojas.

Parametros de la rejilla

El resultado debería ser algo parecido a:

Juego con la rejilla superpuesta

En el que se ve claramente las casillas repetitivas que forman el fondo.

Si ahora queremos extraer esas casillas para usarlas nosotros en nuestro remake, tenemos dos opciones (ambas partiendo de la imagen original, no de la recuadrada):

  • Extraer los fragmentos que nos interesan, con un poco de paciencia y la herramienta de recorte, como ya vimos.
  • Crear un programita que extraiga todos los tiles por nosotros, y luego eliminamos los que estén repetidos.

Ese tipo de programas puede ser muy fácil de hacer, si nos apoyamos en herramientas como "nconvert" (parte de XnView: www.xnview.com), que sean capaces de convertir una imagen a PNG y de cambiarle el tamaño o recortarla, todo ello a partir de los parámetros que le indiquemos en línea de comandos. Así, nuestro programa simplemente tendría que llamar a "nconvert" (o la herramienta similar que escojamos) de forma repetitiva, indicando qué fragmento queremos extraer cada vez.

Un programa básico en C# que nos ayudara en esta tarea podría ser así (nota: este fuente tiene algunos detalles avanzados que aún no hemos visto, como puede ser la copia de ficheros, el llamar a otros programas o la lectura de los parámetros que se indican en línea de comandos; tómalo como una ayuda, sin tratar de entender todo lo que hace):

// Recortador de imágenes en tiles
// (se apoya en nconvert)
 
using System;              // WriteLine
using System.IO;           // Path
using System.Diagnostics;  // Process
 
public class RecortadorDeFicheros
{
  public static void Main( string[] args )
  {
    if (args.Length < 1)
    {
      Console.WriteLine("Indica el nombre de fichero a recortar");
      return;
    }
 
    int anchoImagen = 768;
    int altoImagen = 576;
 
    int anchoTile = 32;
    int altoTile = 32;
 
    int cantidadColumnas = anchoImagen / anchoTile;
    int cantidadFilas = altoImagen / altoTile;
 
    string nombre = args[0];
    string nombreSalida = Path.GetFileNameWithoutExtension(nombre);
    string extension = Path.GetExtension(nombre);
 
 
    for (int fila = 0; fila < cantidadFilas; fila++)
      for (int columna = 0; columna < cantidadColumnas; columna++)
      {
        Console.WriteLine("Fragmento: "+fila+","+columna);
        string filaTexto = fila.ToString("00");
        string columnaTexto = columna.ToString("00");
        string nombreFinal = nombreSalida + filaTexto +
          columnaTexto + "." + extension;
        File.Copy(nombre, nombreFinal);
        Process.Start("nconvert.exe", 
          "-out png -D -crop "
          +columna*anchoTile + " "  // x
          +fila*altoTile + " "      // y
          +anchoTile + " "          // w
          +altoTile + " "           // h
          +nombreFinal
          );
      }
  }
}