Agosto 30, 2019, 12:27:31 PM Ultima modificación: Agosto 30, 2019, 04:15:37 PM por :StonerStanley:
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?
Mi firma.

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:
[gml]
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));
[/gml]

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



#2 Agosto 30, 2019, 06:12:38 PM Ultima modificación: Agosto 30, 2019, 09:13:28 PM por dixon
..............................  MODIFICACIÓN 6

Hola,

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



[CREATE EVENT]

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]

///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.
Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.

Cita de: Black_Cat 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:
[gml]
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));
[/gml]

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.

Cita de: dixon en Agosto 30, 2019, 06:12:38 PM
Hola,

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



[CREATE EVENT]

texto=""

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




[DRAW EVENT]

///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.

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.



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.
Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.