Como usar colas en nuestro juego
Seguimos hablando de estructuras de datos. Ahora hablaremos de las colas, que son muy parecidas a las pilas que comentamos.
La teoría de las colas es que tenemos una serie de elementos encadenados, que el primero que ha entrado es el primero en salir. Esto suele llamarse método FIFO (first in, first out).
Ejemplos de cola
Ejemplos de estos hay muchos: una cola para pagar, un atasco (una cola de coches)… Si pensamos en el mundo del a informática, tenemos la cola de impresión, la lista de documentos que mandamos a una impresora en salir, dónde se decide que se imprime el primer documento que ha llegado.
¿Y en un juego? Se me ocurre por ejemplo las acciones especiales que pueden ocurrir en los juegos de lucha, como puede ser en Street Figther. Sabemos que el Haduken de Ryu tiene estos movimientos
↓ + ↘ + → + puño
Teniendo esa secuencia, podemos almacenarla en una cola e ir detectando en cada evento de teclado o pad si es correcto. Así vamos sacando de la cola cada elemento y dejamos para el siguiente evento detectar si lo que hemos pulsado es ocrrecto.
Otro ejemplo sería que tienes un personaje que solo puede tener un arma en la mano, pero puedes ir recogiendo más de una. Imagina que tienes un cuchillo, pero vas recogiendo una espada, un hacha, una lanza… Si descartamos el cuchillo y queremos utilizar el siguiente elemento que has recogido, usando una cola siempre tendremos el orden correcto.
Funciones para usar colas
Vamos a ver las funciones para gestionar colas. Tal y como hemos dicho, esta estructura de datos es muy parecida a una pila, y solo cambian la manera de sacar los elementos. Imaginamos el mismo ejemplo de las armas que hemos comentado. Para crear la cola
armas = ds_queue_create();
Para eliminar la cola cuando ya no la usemos
ds_queue_destroy(armas);
Podemos vaciar la cola, por ejemplo cuando perdamos una vida
ds_queue_clear(armas);
Y si necesitamos saber si está vacía
ds_queue_empty(armas);
Para saber el número de armas que tenemos (por si queremos un control de tope)
ds_queue_size(armas);
Si queremos saber el arma que tenemos ahora, pero sin eliminarla de la cola
var arma_actual = ds_queue_head(armas);
Para añadir un elemento
ds_queue_enqueue(armas, obj_espada);
Podemos añadir hasta 15 elementos de golpe. Para descartar un objeto (eliminnar de la colA)
ds_queue_dequeue(armas);
Al contrario que en la pila, al igual que podemos leer el primer valor de la cola, es posible leer el último valor añadido
ds_queue_tail(armas);
También podemos copiar una cola en otr avariable con ds_queue_copy()
. Además, podemos almacenar y leer estos datos a un fichero de texto, con las funciones ds_queue_read()
y ds_queue_write()
.
Resumen final
Hemos visto algunos ejemplos para usar esta estructura de datos en nuestros proyectos de Game Maker Studio. Ejemplos para usar colas hay muchos, así que espero vuestros comentarios para sugerir o preguntar sobre como poder usarlas.
Hola muy buenos los tutoriales sigo muy amenudo , aun estoy muy verde con esto de pogramar, me podrias recomendar algunos libros de pogramacion en gml o algo asi gracias
Hola Rául,
la verdad es que leerme no me he leído ninguno, así que poco te puedo ayudar en este sentido. Se que existen algunos en inglés, pero no se si están muy actualizados, aunque para aprender te sirve cualquiera.
SI quieres aprender GML, la mejor guía que he visto es la de Escuela de Videojuegos. ¡Pásate y me dices!
David