Cómo usar estructuras de datos
Hasta ahora hemos aprendido a usar variables para almacenar tipos de datos simples, como puede ser un número o un texto. Incluso sabemos como almacenar una lista de valores en una variable, ya sea una lista simple o un mapeado en dos dimensiones, gracias al uso de las arrays.
Pero es muy posible que nos quedemos cortos manejando este tipo de datos. Quizás queremos ordenar una lista, o buscar un valor en concreto. Por eso existe, en todos los lenguajes de programación, opciones para estructurar los datos y almacenarlos de una manera más precisa y ordenada. Hablaremos de las estructuras de datos.
Qué es una estructura de datos
Las estructuras de datos son tipos de datos especiales que nos facilitan la gestión a la hora de programar: simplifica tener que codificarlo, además que mejora el rendimiento. En Game Maker: Studio podemos definir una variable como si fuese una estructura de datos, y mediante unas funciones especiales de sistema poder gestionar esa estructura.
Dependiendo de como queremos gestionar nuestra información tenemos diferentes estructuras de datos. En este post comentaremos todas las que nos podemos encontrar en Game Maker: Studio, pero será en próximos posts que detallaremos cada una de ellas y sus diferentes funciones.
Estructuras de datos ocupando memoria
Como cualquier otra variable, al definir una estructura de datos, ésta ocupará memoria, y tenemos que destruirla cuando no nos interese usarla más (al igual que los objetos, aunque estos se destruyen automaticamente al cambiar de room, si no son persistentes). Es decir, si declaramos una variable que es un número, ésta se destruirá cuando se elimine ese objeto. Pero si es una variable que contiene una estructura de datos, aunque se elimine ese objeto, lo que ocupa en memoria no se eliminará, a no ser que se lo digamos nosotros.
Así que es muy importante eliminarlas, ¡si no queremos que nuestro juego se vaya quedando sin memoria!
Como funcionan las estructuras de datos
En esencia, todas las estructuras de datos funcionan de la misma manera: en la variable se almacena el índice de referencia, al igual que cuando gestionamos ficheros de texto, y se utiliza esa variable para llamar a las funciones que pueden operar con ellas (añadir elementos, eliminar, ordenar, destruir la estructura, etc.).
Todas las estructuras pueden almacenar cualquier tipo de valor, y podemos mezclar números y texto en la misma estructura.
Además, al igual que tenemos la función is_array()
para saber si una variable es de ese tipo, tenemos la función ds_exists()
, para saber si una variable es de una estructura de datos en concreto.
Leer y guardar una estructura de datos
Todas las estructuras de datos tiene dos funciones, read()
y write()
, que las gestiona como si fuesen cadenas. Estas funciones pueden ser muy útiles si queremos almacenar todos los datos en un fichero de texto, como puede ser una clave de un fichero ini.
Ahora vamos a ver las diferentes estructuras de datos que podemos encontrarnos para programar nuestros juegos.
Pilas
Existen estructuras de datos que son muy parecidas a las arrays, es decir, que es un listado de valores. La principal diferencia es la manera en que añadimos valores, y sacamos o eliminamos valores.
Por ejemplo, en las pilas se utiliza el sistema LIFO, o lo que es lo mismo, el último valor en entrar es el primero en salir. Imaginemos unos platos apilados, en el ejemplo tenemos claro que el plato de más abajo no saldrá hasta que no se hayan vaciado los de arriba.
¿Os imagináis tener que gestionar eso con una array? No digo que no se pueda, pero complicaría mucho la gestión del código, como hemos dicho más arriba.
Si queremos apilar cosas en nuestro juego, como pueden ser monedas o programar alguna mecánica de algún enemigo, ya sabemos que ésta es la mejor opción.
Colas
Al contrario que las pilas, las colas utilizan el método FIFO para gestionar los valores, es decir, el primero que entra es el primero en salir. Colas podemos imaginarnos muchas: la cola para pagar en el supermercado, en un atasco, la cola de impresión si mandamos varios documentos…
Las colas se pueden usar de muchas maneras en nuestros juegos: podemos almacenar una serie de acciones a realizar, enemigos que hay que destruir con un orden específico, secuencuas de teclas que hay que pulsar, etc.
Listas
Podemos decir que las listas son como arrays de una dimensión, pero con funcionalidades avanzadas. Debido a su flexibilidad podemos almacenar valores al final de la lista, pero también al principio sin perder su orden, o incluso en una posición específica. También nos permite elegir ordenar la lista o mezclar los valores (muy útil si queremos usarlas para aleatoriedad).
Mapas
Los mapas es una de las estructuras de datos más útiles. En una array, tenemos un índice, que es un número, para poder acceder al valor. Los mapas funcionan de una manera parecida, pero ese índice es una clave, que puede ser cualquier valor.
Lo mejor es verlo con un ejemplo. Los mapas se pueden utilizar para gestionar inventarios, dónde los diferentes items serían las claves y la cantidad su valor. En un juego de rol, podemos tener 250 de monedas de oro, 10 pociones, una espada, un hacha, etc… Es decir, t
Con las claves podemos acceder directamente a esos elementos y su valor, pero no podríamos ordenar estos elementos. Lo que si que podemos es recorrer todo el mapa para saber que elementos tenemos.
También hay que tener claro que hay una relación de “una clave-un valor”, así que no podemos tener dos claves con el mismo valor, ni una clave con dos valores.
Para acabar, también hay que comentar un detalle curioso: existen funciones específicas para guardar y leer un mapa de manera encriptada, para guardar información sensible como pueden ser contraseñas, compras hechas en la aplicación, etc.
Colas de prioridad
Funcionan de una manera muy parecida a las colas que hemos visto antes, pero cuando añadimos un valor le damos también una prioridad. En una cola de prioridad, en vez de sacar el valor que primero hemos añadido, sacaríamos el valor dependiendo de la prioridad que tenga, sea el máximo o el mínimo.
Se pueden utilizar de muchas maneras, por ejemplo crear unas listas de usuarios con puntuación y utilizar esa puntuación para gestionar niveles, partidas, etc.
Grids o rejillas
Al igual que como vemos en el editor de rooms, cuando lo dividimos en una grid, una estructura de datos que sea una grid es una array de dos dimensiones, pero con funciones avanzadas.
Estas funciones avanzadas sirven para poder trabajar con regiones dentro de la grid: podemos añadir valores individuales a un área, buscar valores en un área rectangular (o incluso circular), o buscar dentro de una región el valor más alto, el mínimo o hacer una media.
Su utilidad puede radicar en usar esta estructura de datos para controlar que tenemos en nuestra room, y utilizar las áreas para ver si existen elementos, enemigos, crear laberintos, etc.
Resumen final
Hemos hablado de las estructuras de datos que encontraremos en Game Maker: Studio. Hay otras muchas que el programa no contempla, como pueden ser los árboles o los grafos, pero con los 6 tipos que hemos visto podemos hacer muchas cosas.
En próximos posts pondré algún proyecto de ejemplo de cada estructura para que ver su uso.
Hola, quería saber si podias enseñar a hacer un joystick en game maker para los juegos en android, que se multitouch haci se pueden usar con virtual keys.
Ah y gracias por todos tus aportes 😉
-Un abrazo.
jaja, nose porque escribí “haci”
Bueno, yo también tengo lapsus, no pasa nada 😉
Buenas Erik,
lo tengo pendiente, pero como no lo he hecho nunca me cuesta un poco más. ¡Espero sacarlo en breve!
¡Merci por los ánimos!
David