Esta función sólo está disponible en la versión registrada de Game Maker.
En los juegos normalmente necesitas guardar información. Por ejemplo, necesitas guardar listas de ítems que lleva un personaje o nombres de lugares que necesita visitar. Puedes usar arrays para esto. Pero si necesitas hacer operaciones más complicadas, como ordenar los datos o buscar un ítem determinado, necesitas escribir grandes trozos de código en GML, que pueden ser lentos al ejecutarse.
Para remediar esto, Game Maker dispone de un número de funciones de estructuras de datos. Hasta el momento hay 6 tipos de estructuras de datos diferentes: stacks (pilas), queues (colas), lists (listas), maps (mapas), priority queues (colas de prioridad) y grids (rejillas). Cada uno de estos tipos está preparado para un uso particular.
Todas las estructuras de datos funcionan generalmente de la misma manera. Creas una estructura de datos con una función que devuelve la id de esa estructura y luego usas esa id para hacer diferentes operaciones. Cuando has terminado, puedes destruir la estructura para ahorrar espacio. Puedes usar tantas estructuras a la vez como desees y éstas pueden guardar valores reales o cadenas de texto.
Observa que las estructuras de datos no se guardan cuando guardas el juego usando las funciones o acciones apropiadas. Para guardarlas, deberás crear tu propio sistema.
Al comparar valores, por ejemplo al ordenar una lista, Game Maker debe decidir cuándo dos valores son iguales. Al usar cadenas de texto y valores enteros esto es evidente, pero para valores reales, debido a errores de redondeo, números iguales pueden convertirse en diferentes. Por ejemplo, (5/3)*3 no será igual a 5. Para evitar esto, puedes especificar la precisión que deseas usar. Cuando la diferencia entre dos números es menor que esta precisión, los dos números se consideran iguales. Por defecto se utiliza una precisión de 0.0000001.Puedes cambiar este valor con las funciones siguientes:
ds_set_precision(prec)
Especifica la precisión usada en comparaciones.Esta precisión se utiliza en las estructuras de datos pero no en el resto de comparaciones en GML! Las estructuras de datos disponibles son las siguientes:
Pilas
Una pila es una estructura LIFO (último en entrar, primero en salir). Puedes empujar (push) valores en la pila o quitarlos tirando de ellos (pop). El último valor que se empujó en la lista es el primero al que se accede al tirar de la lista. Es como si vas poniendo un libro encima de otro: cuando quieras coger un libro, el último que pusiste estará encima de todos los demás y será el que cojas. Las pilas se utilizan para gestionar interrupciones o cuando se usan funciones recursivas:
ds_stack_create()
Crea una nueva pila. La función devuelve un número entero con la id de la pila para usarla en las diferentes funciones. Puedes crear varias pilas.ds_stack_destroy(id)
Destruye la pila, liberando la memoria usada. No olvides usar esta función cuando ya no necesites la pila.ds_stack_clear(id)
Limpia la pila, borrando todos los valores que contiene pero no la destruye.ds_stack_size(id)
Devuelve el número de valores en la pila.ds_stack_empty(id)
Devuelve true si la pila está vacía. Es lo mismo que chequear si el número de valores en la pila es cero.ds_stack_push(id,val)
Empuja el valor dentro de la pila.ds_stack_pop(id)
Devuelve el valor al final de la pila (esto es, el último valor introducido) y lo elimina de la pila.ds_stack_top(id)
Devuelve el valor al principio de la pila (el primero que se introdujo) pero no lo elimina.Colas
Una cola es parecido a una pila, pero funciona como una estructura FIFO (primero en entrar, primero en salir). El primer valor que se mete en la cola es el primero en salir, como una cola en una tienda. El primer cliente en llegar será el primero en ser atendido y los demás tendrán que esperar su turno en orden. Para trabajar con colas existen las funciones siguientes (observa que las 5 primeras son equivalentes a las funciones de las pilas: todas las estructuras de datos poseen estas 5 funciones)
ds_queue_create()
Crea una nueva cola. La función devuelve un número entero con la id de la cola para usarla en las diferentes funciones. Puedes crear varias colas.ds_queue_destroy(id)
Destruye la cola, liberando la memoria usada. No olvides usar esta función cuando ya no necesites la cola.ds_queue_clear(id)
Limpia la cola, borrando todos los valores que contiene pero no la destruye.ds_queue_size(id)
Devuelve el número de valores en la cola.ds_queue_empty(id)
Devuelve true si la cola está vacía. Es lo mismo que chequear si el número de valores en la cola es cero.ds_queue_enqueue(id,val)
Introduce el valor en la cola.ds_queue_dequeue(id)
Devuelve el último valor de la cola (el primero en introducirse) y lo elimina de la cola.ds_queue_head(id)
Devuelve el valor al principio de la cola, esto es, el primero que se introdujo, pero no lo elimina de la cola.ds_queue_tail(id)
Devuelve el último valor de la cola pero no lo elimina.Listas
Una lista guarda una colección de valore en un orden determinado. Puedes añadir valores a la lista a la posición que desees. Por eso, puedes acceder acceder a los valores usando un índice de su posición en la lista. También puedes ordenar los elementos de forma ascendente o descendente. Las listas se pueden usar para muchas cosas, por ejemplo, para guardar valores que cambian. Las listas se han programado usando arrays, pero al estar definidas en código compilado son mucho más rápidas que los arrays.
ds_list_create()
Crea una nueva lista. La función devuelve un número entero con la id de la lista para usarla en las diferentes funciones. Puedes crear varias listas.ds_list_destroy(id)
Destruye la lista, liberando la memoria usada. No olvides usar esta función cuando ya no necesites la lista.ds_list_clear(id)
Limpia la lista, borrando todos los valores que contiene pero no la destruye.ds_list_size(id)
Devuelve el número de valores en la lista.ds_list_empty(id)
Devuelve true si la lista está vacía. Es lo mismo que chequear si el número de valores en la lista es cero.ds_list_add(id,val)
Inserta el valor al final de la lista.ds_list_insert(id,pos,val)
Inserta el valor en la posición pos. La primera posición es 0 y la última es igual al tamaño de la lista menos 1.ds_list_replace(id,pos,val)
Reemplaza el valor en la posición pos por val.ds_list_delete(id,pos)
Elimina el valor en la posición pos.ds_list_find_index(id,val)
Devuelve la posición en la lista del valor val. Si no encuentra el valor en la lista devuelve -1.ds_list_find_value(id,pos)
Devuelve el valor en al posición pos.ds_list_sort(id,ascend)
Ordena los valores de la lista. Si ascend es true o 1 los ordena de forma ascendente, en caso contrario los ordena de manera descendenteMapas
En algunas ocasiones necesitas guardar pares de valores consistentes de una llave (key) y un valor. Por ejemplo, un personaje puede llevar varios ítems diferentes y puede tener un número diferente de cada uno. En este caso, el ítem será la llave y la cantidad será el valor. Los mapas manejan estas parejas de valores, ordenándolos por la llave. Puedes añadir valores al mapa y buscar uno concreto usando las llaves. Como las llaves también están ordenadas, puedes
encontrar los valores correspondientes a la llave siguiente o anterior. A veces es útil usar un mapa para guardar llaves sin ningún valor asignado. En este caso puedes asignarles a todas las llaves el valor 0.
ds_map_create()
Crea un nuevo mapa. La función devuelve un número entero con la id del mapa para usarla en las diferentes funciones. Puedes crear varios mapas.ds_map_destroy(id)
Destruye el mapa, liberando la memoria usada. No olvides usar esta función cuando ya no necesites el mapa.ds_map_clear(id)
Limpia el mapa, borrando todos las parejas llave-valor que contiene pero no lo destruye.ds_map_size(id)
Devuelve el número de parejas llave-valor en el mapa.ds_map_empty(id)
Devuelve true si el mapa está vacía. Es lo mismo que chequear si el número de valores en el mapa es cero.ds_map_add(id,key,val)
Añade la pareja llave (key)-valor (val) al mapa.ds_map_replace(id,key,val)
Reemplaza el valor correspondiente a la llave con un nuevo valor.ds_map_delete(id,key)
Elimina la pareja llave-valor especificada del mapa. Si hay varias parejas con la misma llave sólo 1 es eliminada.ds_map_exists(id,key)
Devuelve true si la llave existe en el mapa.ds_map_find_value(id,key)
Devuelve el valor correspondiente a la llave.ds_map_find_previous(id,key)
Devuelve la mayor llave que sea menor que la indicada.ds_map_find_next(id,key)
Devuelve la menor llave que sea mayor que la indicada.ds_map_find_first(id)
Devuelve la menor llave del mapa.ds_map_find_last(id)
Devuelve la mayor llave del mapa.Colas de prioridad
En una cola de prioridad a cada valor se le asigna una prioridad. Así puedes buscar los valores con mayor o menor prioridad y controlar ciertas cosas según su prioridad.
ds_ priority _create()
Crea una nueva cola. La función devuelve un número entero con la id de la cola para usarla en las diferentes funciones. Puedes crear varias colas.ds_ priority _destroy(id)
Destruye la cola, liberando la memoria usada. No olvides usar esta función cuando ya no necesites la cola.ds_ priority _clear(id)
Limpia la cola, borrando todos los valores que contiene pero no la destruye.ds_ priority _size(id)
Devuelve el número de valores en la cola.ds_ priority _empty(id)
Devuelve true si la cola está vacía. Es lo mismo que chequear si el número de valores en la cola es cero.ds_priority_add(id,val,prio)
Añade el valor con la prioridad especificada a la cola.ds_priority_change_priority(id,val,prio)
Cambia la prioridad del valor especificado al nuevo valor.ds_priority_find_priority(id,val)
Devuelve la prioridad del valor especificado.ds_priority_delete_value(id,val)
Elimina el valor (con su prioridad) de la cola de prioridad.ds_priority_find_min(id)
Devuelve el valor con la menor prioridad pero no lo elimina de la cola.ds_priority_delete_max(id)
Devuelve el valor con la mayor prioridad y lo elimina de la cola.ds_priority_find_max(id)
Devuelve el valor con la mayor prioridad pero no lo elimina de la cola.Rejillas
Una rejilla es simplemente un vector (o arreglo) bidimensional. Una rejilla tiene un entero con su altura y anchura. Esta estructura te permite acceder a los valores indicando el valor de la celda deseada (el primer valor en las direcciones x e y es 0). Pero también puedes dar valores por regiones, añadirlos y encontrar los valores máximo, mínimo o medio de una región. Esta estructura es útil para representar por ejemplo un campo de juego. Aunque todo lo que hace esta estructura se puede conseguir usando vectores, las operaciones por regiones son mucho más rápidas.
ds_grid_create(w,h)
Crea una rejilla con la anchura especificada en w y la altura especificada en h. La función devuelve la id de la rejilla que debe usarse en las demás funciones.ds_grid_destroy(id)
Destruye la rejilla, liberando la memoria usada. No olvides usar esta función cuando ya no necesites la rejilla.ds_grid_resize(id,w,h)
Aumenta el tamaño de la rejilla a la nueva anchura y altura especificadas. Las celdas ya existentes mantienen su valor.ds_grid_width(id)
Devuelve la anchura de la rejilla.ds_grid_height(id)
Devuelve la altura de la rejilla.ds_grid_clear(id,val)
Hace que todos las celdas de la rejilla tomen el valor val (puede ser un número o una cadena de texto).ds_grid_set(id,x,y,val)
Asigna a la celda x,y el valor val.ds_grid_add(id,x,y,val)
Suma el valor a la celda especificada. Para cadenas de texto, la cadena se concatena a la que ya existe en la celda.ds_grid_multiply(id,x,y,val)
Multiplica la celda por el valor. Sólo se puede usar con números.ds_grid_set_region(id,x1,y1,x2,y2,val)
Todas las celdas de la región especificada toman el valor especificado.ds_grid_add_region(id,x1,y1,x2,y2,val)
Suma el valor a la región especificada. Para cadenas de texto, concatena la cadena de texto a la existente en cada celda.ds_grid_multiply_region(id,x1,y1,x2,y2,val)
Multiplica el valor por todas las celdas de la región (sólo para valores numéricos).ds_grid_set_disk(id,xm,ym,r,val)
Da el valor especificado a toda las celdas dentro del círculo de centro xm,ym y radio r.ds_grid_add_disk(id,xm,ym,r,val)
Suma el valor a la región especificada por el círculo. Para cadenas de texto, concatena la cadena de texto a la existente en cada celda.ds_grid_multiply_disk(id,xm,ym,r,val)
Multiplica el valor por todas las celdas de la región (sólo para valores numéricos).ds_grid_get(id,x,y)
Devuelve el valor de la celda indicada.especificada. Sólo funciona con valores numéricos.