Autor Tema: Estructura ds_grid  (Leído 649 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado empardopo

  • Admin
  • *
  • Mensajes: 21739
  • Gracias 761
  • Espero mejorar al KungFu Master!
    • Mi canal de Youtube
  • Ciudad: Norte de África
  • Pais: Escoña
  • Iniciales nick: EPP
Estructura ds_grid
« en: Octubre 16, 2018, 09:46:10 am »
Advertisement
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_create
Crea un nuevo grid.

La sintaxis es:
Código: [Seleccionar]
ds_grid_create(w, h);
Código: [Seleccionar]
Argumento   Descripción
w           El ancho del grid a ser creado.
h           La altura del grid a ser creado.

Retorna un valor real.

Descripción

Con 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:
Código: [Seleccionar]
mygrid = ds_grid_create(10, 12);Estro crea un grid de 10 celdas de ancho y 12 celdas de altura.


ds_grid_destroy
Destruye el grid liberando la memoria usada.

Sintaxis:
Código: [Seleccionar]
ds_grid_destroy(index);
Código: [Seleccionar]
Argumento Descripción
index         El índice del grid a destruir.

Retorna N/A

Descripción
Esta 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_set
Coloca el valor pasado en la celda seleccionada.

Sintaxis:
Código: [Seleccionar]
ds_grid_set(index, x, y, value);
Código: [Seleccionar]
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ón
Esta 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:

Código: [Seleccionar]
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_get
Devuelve el valor de una celda en el grid.

Código: [Seleccionar]
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ón
Esta 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:

Código: [Seleccionar]
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_sort
Ordena un grid de acuerdo a los valores de una columna dada.

Sintaxis:
Código: [Seleccionar]
ds_grid_sort(index, column, ascending);
Código: [Seleccionar]
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ón
Esta 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:
Código: [Seleccionar]
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_read
Lee la estructura de datos del grid desde una cadena string.

Sintaxis:
Código: [Seleccionar]
ds_grid_read(index, string [, legacy]);
Código: [Seleccionar]
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ón
Esta 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:

Código: [Seleccionar]
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_write
Convierte una estructura de datos en una cadena y devuelve esta cadena.

Código: [Seleccionar]
Argumento Descripción
index         El índice del grid a escribir.

Retorna: cadena

Descripción
Esta 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:
Código: [Seleccionar]
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.
« Última modificación: Octubre 16, 2018, 07:01:36 pm por empardopo »



Desconectado empardopo

  • Admin
  • *
  • Mensajes: 21739
  • Gracias 761
  • Espero mejorar al KungFu Master!
    • Mi canal de Youtube
  • Ciudad: Norte de África
  • Pais: Escoña
  • Iniciales nick: EPP
Re:Estructura ds_grid
« Respuesta #1 en: Octubre 16, 2018, 06:55:20 pm »
Como ejemplo de uso en mi caso, voy a usar las estructuras ds_grid para almacenar varias tablas de records; en concreto, 6 ya que habrá 3 modalidades distintas de juego con dos niveles de dificultad cada una lo que hace 6 tablas de records.

Con lo siguiente creo el grid
Código: [Seleccionar]
global.records = ds_grid_create(10,12);
« Última modificación: Octubre 16, 2018, 07:16:09 pm por empardopo »

 


* ¿A qué estáis jugando ahora mismo?  Autor: Zael Foro: Offtopic 15/05/2024 (16:09)
* Retro 320 - Wizard of wor  Autor: Zael Foro: Competiciones y concursos 15/05/2024 (15:54)
* Salón Recreativo #55 (27-04-2024 / 26-05-2024)  Autor: beaches Foro: Salón Recreativo FaseBonus 14/05/2024 (22:08)
* MPAGD (Multi Platform Arcade Game Designer)  Autor: Zael Foro: Creación de juegos 14/05/2024 (10:53)
* [N3DS] Red Viper - Emulando Virtual Boy como Dios manda  Autor: sirdrak Foro: Noticias de emuladores 13/05/2024 (00:53)
* El megapost del ZX Spectrum  Autor: Zael Foro: Offtopic 12/05/2024 (20:30)
* La inteligencia artificial ha llegado a la música  Autor: Zael Foro: Offtopic 12/05/2024 (20:24)
* Info sobre MARP  Autor: empardopo Foro: Records y wolfmame 12/05/2024 (20:09)
* Stop the express  Autor: empardopo Foro: ZX Spectrum 12/05/2024 (20:05)
* Retro Portable Maker ArcadeSpain (RPMA)  Autor: empardopo Foro: Otros programas 12/05/2024 (17:37)
* Recopilatorio Retos: Desde el 1 hasta .....  Autor: montypepa Foro: Competiciones y concursos 05/05/2024 (21:30)
* iojukebox Theme, un JukeBox para Attract-Mode  Autor: gucaza Foro: Themes AM 04/05/2024 (02:47)
* Nuevo miniPc para mi vieja recre y juegos Windows compatibles formato 4:3  Autor: jmpuk Foro: Offtopic 02/05/2024 (23:31)
* Homenaje a Locomalito  Autor: beaches Foro: Otros programas 02/05/2024 (23:03)
* [Recomendación] Cine para los findes en casa (bueno, bonito y barato)  Autor: arquillos Foro: Offtopic 02/05/2024 (09:39)
* [Recomendacion] Series para ver  Autor: jmpuk Foro: Offtopic 01/05/2024 (21:54)
* Etpa8: El Reino Subterráneo  Autor: jmpuk Foro: ZX Spectrum 01/05/2024 (21:49)
* Amiga Games + 1.9.2  Autor: empardopo Foro: Emuladores 01/05/2024 (20:58)
* West Bank para ZX Spectrum  Autor: empardopo Foro: ZX Spectrum 01/05/2024 (20:07)
* Patrocinador para el foro ArcadeSpain  Autor: empardopo Foro: Noticias 29/04/2024 (19:37)
* Aprende a hacerte un PORTABLE de tu juego arcade favorito  Autor: empardopo Foro: Records y wolfmame 29/04/2024 (19:27)
* Screenshot de empardopo  Autor: empardopo Foro: Otros programas 24/04/2024 (19:42)
* Concurso Bytemaniacos 2025  Autor: empardopo Foro: Creación de juegos 23/04/2024 (21:46)
* Van dos y se cae el del medio - Hilo de cachondeo general  Autor: empardopo Foro: Offtopic 21/04/2024 (18:47)

Countdown
Buscaunchollo.click