Recientemente vi un vídeo de Hdeleon en Youtube, en el explicaba de una manera sencilla como se pueden crear mapas aleatorios en juegos. Lo interesante de este vídeo, es que hace uso de matrices (o arrays) bidimensionales. Primero crea una matriz con de caracteres, donde cada tipo de carácter representa algo en un mapa. Luego explica como crear una imagen, recorriendo la matriz que ha creado. Así que decidí replicarlo Free Pascal.

Lo primero será crear un nuevo proyecto que sea un programa en Lazarus.

Antes, de continuar, debes tener instalado el paquete BGRAbitmap. Este paquete permite manipular las imágenes de una manera rápida y sencilla. Aunque Lazarus tiene su propio paquete (Graphics), que podríamos usar en este caso, ya que no necesitamos velocidad, este solo funciona en aplicaciones de escritorio.

Para instalar este paquete vete al menú Herramientas->Online package manager. Y busca BGRAbitmap

Menú Paquete

Tras instalar el paquete, empezamos a programar. Lo primero es añadir las unidades que vamos a usar al principio del documento, y luego declaramos un tipo de variable llamado Tmap la cual será un array de dos dimensiones de caracteres, pero de dimensión desconocida.

Lo siguiente es crear una función que nos devuelva un mapa. Este mapa será de un ancho y alto que pasamos por parámetros.

Fíjate, que en la línea 6, se ajusta el tamaño del array según los parámetros que recibe la función.

Luego recorremos el array, y en cada posición de este, añadimos el carácter «#» en caso que sea un árbol, o el carácter «.» en el caso que no hay un árbol. Para decidir si se pone un árbol o no, lo que hace el ćodigo, es generar un número aleatorio entre 0 y 0.99. Si este número es menor de 0.15 consideremos que hay un aŕbol. Esto sería como indicar que queremos un 15% de árboles en nuestro mapa.

Para mostrar el mapa en pantalla, creamos un procedimiento llamado PrintMap, que recibe como parámetro el mapa que queremos mostrar por pantalla.

En este procedimiento recorremos el array desde su inicio, hasta el final. Para conocer el tamaño del array usamos la función High, lo cual no devolverá el tamaño de la primera dimensión (línea 5 de código anterior). Para obtener el tamaño de la segunda dimensión, lo indicamos entre corchetes. (línea 7).

Ya para terminar solo nos queda generar la imagen y guardarla en el disco duro. Para ello creamos un procedimiento llamado SaveMapAsImage, que recibe dos parámetros, el primero es un mapa, y el segundo el nombre con el que queremos guardar la imagen generada.

Lo primero es conocer las dimensiones del mapa que se pasa por parámetros, líneas 7 y 8.

Creamos tres objetos del tipo TBGRABitmap. Que llamamos Tree, Grass, Image. El objeto Image contendrá la imagen resultante, así que como imagen que voy a usar es de 16×16 pixels por cada carácter, su tamaño será el ancho del mapa por 16, y lo el alto, será el alto del mapa por 16. Esto son los datos que indicamos al crear el objeto.

En Tree cargamos una imagen de un árbol, y en Grass, cargamos una imagen de la hierba.

Después recorremos el mapa comprobando que carácter hay en cada posición. Si es el carácter «#», en la posición que nos indica el array, multiplicado por 16, para desplazarnos a la posición dentro de image, que le corresponde copiamos la imagen Tree. En el caso contrario copiaremos la imagen Grass.

Al terminar los bucles, se guarda la imagen con el nombre que se indicó en el parámetro AFileName. Y por último liberamos los objetos que hemos creado.

Con todo listo, solo queda hacer uso del código que hemos generado.

El código fuente completo así como la imágenes que usé están disponibles en mi Github, aquí.

Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.