Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Arrays / ds_grid tridimensionales  (Leído 598 veces)

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

Desconectado :StonerStanley:

en: Agosto 30, 2019, 12:27:31 pm
Muy buenas. Estaba ideando un manera de realizar colisiones tridimensionales a través de una variable con un array tridimensional. Esta variable puede ser 'true' o 'false' según las coordenadas x, y, z. El problema que se me plantea es que en Game Maker no se pueden crear arrays tridimensionales, solo unidimensionales y bidimensionales. ¿Hay alguna solución para este problema?

Gracias.

Edit:

Tras intentar implementar este sistema, me he dado cuenta de que resulta más eficiente crear un ds_grid. Sin embargo, la pregunta sigue: ¿que alternativa habría para implementar un ds_grid tridimensional?
« última modificación: Agosto 30, 2019, 04:15:37 pm por :StonerStanley: »

Mi firma.
 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Black_Cat

Respuesta #1 en: Agosto 30, 2019, 05:09:01 pm
Se puede, conceptualmente una array bidimensional es un array dentro de otro. Una tabla , que es lo mismo, es una lista de listas.
Siguiendo el concepto, un array3D sería una grilla de listas. Entonces:
lis1 = ds_list_create(); // primera dim
lis2 = ds_list_create(); // segunda dim
lis3 = ds_list_create(); //tercera dim

ds_list_add(lis3, "3D"); // en lis3[0] hay un valor
ds_list_add(lis2, lis3); //en lis2[0] hay otra lista
ds_list_add(lis1, lis2); //en lis1[0] hay una lista


lista2 = ds_list_find_value(lis1, 0) //recuperamos la lista2
lista3 = ds_list_find_value(lis2, 0)
elemento = ds_list_find_value(lista3, 0);

show_message_debug(string(elemento));

No se bien como estes implementando el juego pero creo que te conviene usar una grilla de Nx4 donde cada lugar guardaria coordenada x,y,z y el valor true/false.

No probé hacer una ds_grid con una lista dentro para evitar hacer la lista de lista. Pero en teoría deberia funcionar joya

Únete al servidor mas chidori de Discord

 
Los siguientes usuarios dieron las gracias a este tema: :StonerStanley:


Desconectado dixon

Respuesta #2 en: Agosto 30, 2019, 06:12:38 pm
..............................  MODIFICACIÓN 6

Hola,

Solicitando permiso de  Black_Cat para sugerir otro método, indico:



[CREATE EVENT]

Código: [Seleccionar]
texto=""
///colisiones en 2D
xy[0,2]=1
xy[1,2]=1
xy[0,3]=1
xy[1,3]=1
xy[0,2]=1
xy[1,2]=1
xy[0,3]=1
xy[1,3]=1
xy[room_width,room_height]=0
///COLISIONES EN 2D + Z donde el primer argumento delarray es el resultado de otro array (xy[ ]) y el segundo argumento es la posición z del cubo.
colision[1,0]=1
colision[1,1]=1
colision[room_width,room_height]=0


[DRAW EVENT]
Código: [Seleccionar]
///POSICIÓN DEL OBJETO QUE COLISIONARÁ CON EL CUBO IMAGINARIO
xpos=3
ypos=3
zpos=5

///EVALUADOR DE COLISIÓN 3D
if(colision[xy[xpos,ypos],zpos]){texto="Ha colisionado"}else{texto="no ha colisionado"}

//SALIDA TEXTUAL DE LA COLISIÓN
draw_text(10,10,texto)

En la imágen se vé un cubo ubicado en una posición predeterminada. En el código de [CREATE EVENT] se puede observar un array llamado colisión que indica cuando existirá colisión donde el primer argumento  indica si hay colisión en dos dimensiones y el segundo es la posición z del objeto cubo. Para evaluar este código modifique los valores xpos, ypos, zpos que representan la posición del objeto que colisionará con el cubo imaginario y compare con la imagen.
« última modificación: Agosto 30, 2019, 09:13:28 pm por dixon »

Yo, formo parte de un grupo de programadores, mi única función es prepararles el café.
 
Los siguientes usuarios dieron las gracias a este tema: :StonerStanley:


Desconectado :StonerStanley:

Respuesta #3 en: Agosto 30, 2019, 08:10:26 pm
Se puede, conceptualmente una array bidimensional es un array dentro de otro. Una tabla , que es lo mismo, es una lista de listas.
Siguiendo el concepto, un array3D sería una grilla de listas. Entonces:
lis1 = ds_list_create(); // primera dim
lis2 = ds_list_create(); // segunda dim
lis3 = ds_list_create(); //tercera dim

ds_list_add(lis3, "3D"); // en lis3[0] hay un valor
ds_list_add(lis2, lis3); //en lis2[0] hay otra lista
ds_list_add(lis1, lis2); //en lis1[0] hay una lista


lista2 = ds_list_find_value(lis1, 0) //recuperamos la lista2
lista3 = ds_list_find_value(lis2, 0)
elemento = ds_list_find_value(lista3, 0);

show_message_debug(string(elemento));

No se bien como estes implementando el juego pero creo que te conviene usar una grilla de Nx4 donde cada lugar guardaria coordenada x,y,z y el valor true/false.

No probé hacer una ds_grid con una lista dentro para evitar hacer la lista de lista. Pero en teoría deberia funcionar joya

Entiendo lo que me intentas explicar (básicamente como una especie de array al cubo), sin embargo, no entiendo la función final del código que has escrito.

Hola,

Solicitando permiso de  Black_Cat para sugerir otro método, indico:



[CREATE EVENT]

Código: [Seleccionar]
texto=""

colision[4,2]=1
colision[9,3]=1
colision[8,3]=1
colision[room_width,room_height]=0



[DRAW EVENT]
Código: [Seleccionar]
///POSICIÓN DEL OBJETO QUE COLISIONARÁ CON EL CUBO IMAGINARIO
xpos=3
ypos=3
zpos=5

///EVALUADOR DE COLISIÓN
if(colision[xpos*ypos,zpos]){texto="Ha colisionado"}else{texto="no ha colisionado"}

//SALIDA TEXTUAL DE LA COLISIÓN
draw_text(10,10,texto)

En la imágen se vé un cubo ubicado en una posición predeterminada. En el código de [CREATE EVENT] se puede observar un array llamado colisión que indica los puntos de colisión donde el primer argumento es la multiplicación de la posición X por la posición Y de un punto específico del cubo y el segundo argumento representa la posición z. Para evaluar este código modifique los valores del objeto que colisionará con el cubo imaginario y compare con la imagen.

No entiendo muy bien lo que intentas explicar.

Mi firma.
 


Desconectado Black_Cat

Respuesta #4 en: Agosto 30, 2019, 08:32:58 pm
Es simplemente para demostrar que se guarda el valor en la lista, de lista de lista.  :-\
La respuesta a que si se puede implementar un array3D en game maker.

De hecho siguiendo la logica, se puede hacer array n dimensional.

Únete al servidor mas chidori de Discord

 


Desconectado dixon

Respuesta #5 en: Agosto 30, 2019, 08:55:57 pm
Al final se ha creado un array dentro de otro array para simular uno de tres dimensiones.

1. El array xy del evento create es el que indica colisión en 2D donde su primer argumento contiene las posiciones X del cubo y el segundo argumento las posiciones Y.
 2. El array colisión indica colision en 3D: El primer argumento nos indica si ya existe colición 2D y el argumento 2 es el valor de las posiciónes z del cubo.

Yo, formo parte de un grupo de programadores, mi única función es prepararles el café.