Un
ds_grid es básicamente un tipo de array de dos dimensiones. Tú defines el
grid colocando su ancho y su alto (valores enteros), los cuales nos dan el número total de celdas dentro del grid (multiplicamos ancho por alto) y estas celdas son usadas para contener diferentes valores de datos (números reales o cadenas).
Un ejemplo de grid
Este tipo de estructura te permite colocar y recuperar el valor de las celdas en el grid dando los índices x e y (los cuales comienzan en 0 y van hasta el ancho y el alto - 1). Además tú puedes colocar valores en una región específica del grid, añadir valores sencillos, recuperar la suma, etc lo cual hace muy versátil a este estructura de datos.
Cuando accedamos a la estructura DS grid, deberíamos hacerlo siempre usando valores enteros para las posiciones de las celdas y no usar índices no enteros ya que Gamemaker los aproximará si no lo hacemos nosotros. Cuidado con ésto porque en caso de necesitarlo deberíamos redondearlos o aproximarlos nosotros antes de pasarselo a Gamemaker.
NOTA: Como con la mayoría de recursos dinámicos las estructuras de datos gastan memoria y deberían ser siempre destruidas una vez que no la vayamos a necesitar para prevenir fallos y falta de memoria en el sistema que podrían provocar lentitud e incluso algún crash en el juego.
Dado la versatilidad de estas estructuras es la que voy a usar para mantener varias tablas de records en mi juego.
Antes de nada vamos a ver algunas funciones que podemos usar con esta estructura de datos.
ds_grid_createCrea un nuevo grid.
La sintaxis es:
ds_grid_create(w, h);
Argumento Descripción
w El ancho del grid a ser creado.
h La altura del grid a ser creado.
Retorna un valor real.
DescripciónCon esta función puedes crear una nueva estructura de datos ds_grid del ancho y altura especificada. Esta función retorna un id el cual debe ser usado en todas las funciones que tengan que ver con este ds_grid.
Ejemplo:
mygrid = ds_grid_create(10, 12);
Estro crea un grid de 10 celdas de ancho y 12 celdas de altura.
ds_grid_destroyDestruye el grid liberando la memoria usada.
Sintaxis:
ds_grid_destroy(index);
Argumento Descripción
index El índice del grid a destruir.
Retorna N/A
DescripciónEsta función eliminará de la memoria la estructura de datos grid dada, liberando los recursos usados por la misma y eliminando todos los valores que contuviera. Esta función debería siempre ser usada cuando hayas terminado de usar el ds_grid para prevenir fallos de memoria y fallos en el programa.
Ejemplo:
if lives = 0
{
ds_grid_destroy(Wall_Grid);
room_goto(rm_Menu);
}
El código de arriba chequeará el valor de la variable "lives" y si es 0, destruye el ds_grid indexado por la variable "Wall_Grid" y luego salta a la room rm_Menu.
ds_grid_setColoca el valor pasado en la celda seleccionada.
Sintaxis:
ds_grid_set(index, x, y, value);
Argumento Description
index El índice del grid.
x La posición x de la celda a colocar.
y La posición y de la celda a colocar.
value El valor que colocaremos en la celda.
Retorna N/A
DescripciónEsta función puede ser usada para colocar un valor dado dentro del ds_grid, el cual puede ser un número real o un string.
La imagen que sigue ilustra lo que comentamos:
donde podemos ver que en la posición de ancho o x igual a 2 y de alto o y igual a 3 colocamos el valor 8.
Ejemplo:grid = ds_grid_create(5, 5);
var i, j;
i = 0;
j = 0;
repeat (ds_grid_width(grid))
{
repeat (ds_grid_height(grid))
{
ds_grid_set(grid, i, j, irandom(9));
j += 1;
}
j = 0;
i += 1;
}
El código de arriba crea un grid y almacena su índice en la variable "grid". Luego rellena el grid con números enteros aleatorios entre 0 y 9.
ds_grid_getDevuelve el valor de una celda en el grid.
Argumento Descripción
index El índice del grid.
x La posición x o ancho de la celda que quieres obtener el valor.
y La posición y o alto de la celda que quieres obtener el valor.
Retorna un valor real o string.
DescripciónEsta función puede ser usada para obtener el valor (ya sea real o cadena) de cualquier celda dentro del ds_grid dado. Si tu pasas unas coordenadas inválidas del grid, entonce el valor devuelto será 0.
Ejemplo:var xx, yy;
xx = irandom(ds_grid_width(grid) - 1);
yy = irandom(ds_grid_height(grid) - 1);
val = ds_grid_get(xx, yy);
El código de arriba selecciona una celda aleatoria del ds_grid indexado por la variable "grid" y almacena su valor en la variable "val".
ds_grid_sortOrdena un grid de acuerdo a los valores de una columna dada.
Sintaxis:ds_grid_sort(index, column, ascending);
Argumento Descripción
index El índice del grid a ordenar.
column La columna a usar para ordenar las filas.
ascending Para ordenar de menor a mayor (true), o de mayor a menor (false).
Retorna N/A
DescripciónEsta función puede ser usada para ordenar un ds_grid basado en los valores de una columna dada (tales como tu ordenarías ficheros por fecha, tamaño, etc en el explorador de windows). La siguiente imagen muestra un ejemplo:
Ejemplo:ds_grid_sort(grid, 3, false);
Esto tomaría todos los valores en el ds_grid indexado en la variable "grid" y los ordena de acuerdo a los valores encontrados en la tercera columna del grid (como muestra en la imagen de arriba).
ds_grid_readLee la estructura de datos del grid desde una cadena string.
Sintaxis:ds_grid_read(index, string [, legacy]);
Argumento Descripción
index El índice del grid a leer.
string La cadena a leer dentro del grid.
legacy (opcional) Puede ser tanto true como false u omitido completamente.
Retorna: N/A
DescripciónEsta función puede ser usada para convertir una cadena la cual ha sido creada anteriormente por la función ds_grid_write() en el ds_grid. El ds_grid debe haber sido creado anteriormente (ve el ejemplo de abajo). Fíjate que si la estructura de datos fue creada con versiones de gamemaker anteriores deberías añadir el argumento opcional "legacy", colocándolo a "true" como el formato de cadena que ha cambiado con esta versión.
Ejemplo:grid = ds_grid_create(room_width div 32, room_height div 32);
ini_open("Save.ini");
ds_grid_read(grid, ini_read_string("Save", "0", ""));
ini_close();
El código de arriba crea un ds_grid basado en el tamaño de la room (cada cuadrado de 32x32 pixels representa una celda del grid) y luego lee el conjunto de datos del grid salvados previamente de un fichero ini dentro del nuevo ds grid.
ds_grid_writeConvierte una estructura de datos en una cadena y devuelve esta cadena.
Argumento Descripción
index El índice del grid a escribir.
Retorna: cadena
DescripciónEsta función puede ser usada para convertir el ds_grid dado en una cadena, la cual puede ser almacenada en un fichero externo (por ejemplo). Tú puedes leer la cadena devuelta desde esta función en un ds_grid usando la función ds_grid_read().
NOTA: La cadena devuelta no es una cadena leible, sino un conjunto raro de datos.
Ejemplo:ini_open("Save.ini");
ini_write_string("Save", "0", ds_grid_write(mygrid));
ini_close();
El código de arriba abrirá un fichero ini (creándolo si no existe ya) y luego escribe el ds_grid dado como una cadena en ese fichero.