Como usar pilas en nuestro juego
Hemos hablado de una de las estructuras de datos que más usaremos en nuestros proyectos, las listas enlazadas. Ahora toca hablar de otra estructura de datos: las pilas.
Una pila en Game Maker Studio es como una lista, pero tiene una peculiaridad: podemos añadir elementos, pero solo podemos sacar el último que hemos añadido. A menudo te lo puedes encontrar como método LIFO: last in first out.
Podemos pensar en una pila de platos: conforme añadimos platos y más platos, cuando queremos sacar una solo podemos con el que está más arriba, si queremos uno que esté en medio debemos de sacar antes todos los que están por encima de él.
He buscado un ejemplo de la vida real, pero os podéis imaginar que este tipo de dato es muy usado. Un ejemplo informático sería la pila de funciones. Imaginad un evento Create de un objeto personaje, que dentro tenemos un instance_create()
de un escudo. Este objeto escudo también tiene código en su evento Create(por ejemplo, le asignamos un valor de resistencia). Cuando se hace esté tipo de llamadas, se suele meter en una pila de llamada de funciones, para poder volver al evento del personaje. Sería algo así:
Una vez se ha ejecutado el evento del escudo, se elimina de la pila, y sabemos que el siguiente es la función instance_create
, y cuando se elimina volvemos al evento del personaje.
Un ejemplo para un juego que queramos hacer sería gestionar una mochila. Si queremos llegar a lo que tenemos al fondo, ¡debemos de sacar todo lo que hay antes!
Funciones para gestionar pilas
Vamos a hacer un repaso de todas las funciones para gestionar pilas en Game Maker Studio.
Vamos a imaginar que tenemos una mochila, como hemos comentado antes. Si queremos crear una pila, hacemos esta llamada
mochila = ds_stack_create();
¡ SIEMPRE hay que liberar la memoria de la pila cuando ya no se use! Sabemos que al cambiar de room las instancias se eliminan, pero el espacio que ocupa una estructura de datos no (aunque se pierda la variable del objeto). Así que siempre debemos eliminarla así
ds_stack_destroy(mochila);
Podemos borrar todos los datos de una pila
ds_stack_clear(mochila);
Para comprobar si está vacía
ds_stack_empty(mochila);
y si queremos saber el número total de elementos
ds_stack_size(mochila);
Ahora vamos a ver las funciones para tratar los datos. Si queremos leer, que no sacar, lo que tenemos en la parte superior de la pila
var elemento = ds_stack_top(mochila);
¡Recordemos que ese es el único dato accesible! Para añadir valores tenemos la función (aquí añadimos un objeto)
ds_stack_push(mochila, obj_monedas);
Esta función admite hasta 15 valores para añadir de golpe (y en orden).
Para sacar elementos de la pila
var elemento = ds_stack_pop(mochila);
Ahora no solo hemos leído sino que hemos eliminado el valor. Otras funciones que puede ser de ayuda es copiar una pila en otra variable.
with (instance_create(x, y, obj_enemy) { pila = ds_stack_create(); ds_stack_copy(other.pila); }
Por último, recordad que también tenemos las funciones ds_stack_read()
y ds_stack_write()
para leer y escribir valores en el disco duro.
Resumen final
Hemos visto todas las funciones necesarias para poder crear, controlar y eliminar pilas, una estructura de datos que puede ser muy útil cuando estamos creando juegos en Game Maker Studio. ¿Se te ocurre algún ejemplo para poder usar pilas en tu proyecto?