05 febrero 2011

Descubrir tiles en un juego

Si estamos pensando hacer un remake, o al menos tomar ideas de un juego clásico, nos puede interesar tratar de descubrir que casillas repetitivas (tiles) formaban la pantalla 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.

El resultado debería ser algo parecido a:

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 repetidos.
Ese tipo de programas puede ser muy fácil de hacer si nos apoyamos en herramientas como "nconvert" (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. 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í:


// 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
);
}
}
}