Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: Texic en Mayo 22, 2010, 08:09:17 PM

Título: Array tridimensional (o m?s)
Publicado por: Texic en Mayo 22, 2010, 08:09:17 PM
Creador: Yo

Version de GM utilizada: :GM8:

Descripcion:
Bueno, hoy les traigo dos scripts que hice hace alg?n tiempo que sirven para crear una ilusi?n de arrays de tres dimensiones, el primer script es para crear el array o darle un valor a uno de sus componentes y el otro es para obtener lo que hay en cierto componente. Es muy simple, quiz?s demasiado, pero muy necesario en algunas ocasiones en que los array de 2 diemsiones no alcanzan. Inclusive siguiendo la misma linea de pensamiento que us? para crearlo, cre? uno de cuatro diemnsiones, para un juego... relativista  XD (guerdaba la posicion tridimensional de el objeto a cada segundo)

Script para guardar-crear
arrayset
//argument0 = nombre del array tridimensional
//argument1 = primer indice
//argument2 = segundo indice
//argument3 = tercer indice
//argument4 = valor
//Ej: arrayset("vector",1,1,1,variable)
variable_global_set(string(argument0)+"_"+string(argument1)+"_"+string(argument2)+"_"+string(argument3),argument4)


Script para cargar
arrayget
//argument0 = nombre del array tridimensional
//argument1 = primer indice
//argument2 = segundo indice
//argument3 = tercer indice
//Ej: arrayget("vector",1,1,1)
return variable_global_get(string(argument0)+"_"+string(argument1)+"_"+string(argument2)+"_"+string(argument3))


Como dije, es una ilusi?n de arrays  XD
Pero trabaja m?s o menos de la misma manera

Suerte, espero que les sirva tanto como a mi  :)
Título: Re: Array tridimensional (o m?s)
Publicado por: knd144 en Mayo 22, 2010, 08:16:08 PM
Vaya interesante forma de cubrir la inexistencia de los arrays tridimensionales en GM... Muy bueno y parece funcionar igual que un array verdadero  :D

Muchas gracias Texic :P
Título: Re: Array tridimensional (o m?s)
Publicado por: Texic en Mayo 22, 2010, 08:22:44 PM
Me alegro que te haya gustado  XD

EDIT: Otra ventaja son los l?mites, los vectores comunes dejaban desde >-1 a <32000, con esto todavia no encontr? el l?mite , hasta n?meros negativos deja poner  :D
Título: Re: Array tridimensional (o m?s)
Publicado por: Killer en Mayo 23, 2010, 06:47:09 PM
Hay un peque?o problema, la forma en que pones los nombres de las variables hace que ciertas posiciones se sobreescriban. Por ejemplo, si llamo al script de esta forma:

arrayset("vector",1,11,2,5)

Es decir array vector[1,11,2]=5 el nombre de la variable seria vector1112. Si llamo al script de esta otra forma:

arrayset("vector",11,1,2,15)

Osea vector[11,1,2]=15 el nombre de la variable tambien sera vector1112.

Para solucionarlo se puede poner alg?n caracter entre cada posicion, ya sea letras, guines bajos o lo que quieras.
Título: Re: Array tridimensional (o m?s)
Publicado por: Soujiro en Mayo 23, 2010, 06:59:46 PM
Si bien el script es correcto, pens? que todos los arrays se crean a partir de un array de una dimensi?n. As? que si quer?s se puede hacer un falso array 3d sin necesidad de crear miles de variables globales, mira:

si queres simular un array de dos dimensiones lo unico que tenes que hacer es crear un array normal y hacer el calculo del indice:
array[5*total+3] => array[5,3]
total seria el maximo de "columnas" del array.

Asi tambien lo podes hacer con array de tres dimensiones:
array[5*tot_a*tot_l+3*tot_l+5] => array[5,3,5]

Y asi sucesivamente, podes crearlos con todas las dimensiones que quieras. Lo unico que tenes que hacer es crearte un script cortito, tipo "sub(x,y,z)" para que ya te devuelva el indice calculado y poder escribir "vector[sub(x,y,z)]".

PD: estoy casi seguro que lo que puse es correcto, estoy medio oxidado con programacion asi que hace pruebas antes de estar seguro
Título: Re: Array tridimensional (o m?s)
Publicado por: Texic en Mayo 23, 2010, 07:32:29 PM
CitarSi bien el script es correcto, pens? que todos los arrays se crean a partir de un array de una dimensi?n. As? que si quer?s se puede hacer un falso array 3d sin necesidad de crear miles de variables globales, mira:

si queres simular un array de dos dimensiones lo unico que tenes que hacer es crear un array normal y hacer el calculo del indice:
array[5*total+3] => array[5,3]
total seria el maximo de "columnas" del array.

Asi tambien lo podes hacer con array de tres dimensiones:
array[5*tot_a*tot_l+3*tot_l+5] => array[5,3,5]

Y asi sucesivamente, podes crearlos con todas las dimensiones que quieras. Lo unico que tenes que hacer es crearte un script cortito, tipo "sub(x,y,z)" para que ya te devuelva el indice calculado y poder escribir "vector[sub(x,y,z)]".

PD: estoy casi seguro que lo que puse es correcto, estoy medio oxidado con programacion asi que hace pruebas antes de estar seguro
Cierto, pero el problema es la limitacion de los vectores o matrices, el indice llega solo hasta 32000, y si creas dimensiones falsas, el limite desciende como a 200, o parecido, fijate, por eso hice esta manera

CitarHay un peque?o problema, la forma en que pones los nombres de las variables hace que ciertas posiciones se sobreescriban. Por ejemplo, si llamo al script de esta forma:

C?digo:

arrayset("vector",1,11,2,5)


Es decir array vector[1,11,2]=5 el nombre de la variable seria vector1112. Si llamo al script de esta otra forma:

C?digo:

arrayset("vector",11,1,2,15)


Osea vector[11,1,2]=15 el nombre de la variable tambien sera vector1112.

Para solucionarlo se puede poner alg?n caracter entre cada posicion, ya sea letras, guines bajos o lo que quieras.

Cierto  ;D
Ya estoy modificando el script, gracias  :)

EDIT: Se quieren sorprender? Me cans? de agregar digitos. Pongan esto en el draw de un objeto cualquiera y prueben
vector_123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789=5
draw_text(0,0,string(vector_123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789))

o
vector_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789=5
draw_text(0,0,string(vector_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789))

oooo
vector_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789vector_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789=5
draw_text(0,0,string(vector_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789vector_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789_123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789))

Esto NO TIENE LIMITEEEEE  :o
Título: Re: Array tridimensional (o m?s)
Publicado por: LuisYx en Mayo 30, 2010, 03:02:41 AM
Yo tengo una duda en el script, soy yo o no capto la idea.

?En que me puede servir?, da un ejemplo porque la verdad no veo lo
que un array de 2D no pueda hacer.

Si puedes darme algunos ejemplos en donde los peudo utilizar para
despavilarme de esta duda.
Título: Re: Array tridimensional (o m?s)
Publicado por: Texic en Mayo 30, 2010, 03:29:06 AM
Pues claro, como no?
Dar? un ejemplo. Sup?n que quieres crear un juego de cartas online como el mio. Ahora piensa que necesitas un indice para cada jugador que est? registrado. Contando, primer indice. Ahora, cada jugador tiene su propio mazo, baraja de sobra, etc, segundo indice. Cada carta tiene un lugar en ese mazo, tercer indice. Y por ultimo, cada carta tiene sus propiedades (hp, ataques, tipo, etc), cuarto indice. Pues bien, quedaria que:
array[5,2,52,3] //Ser?a la tercera caraceristica de la 52va carta del segundo mazo del 5to jugador registrado
Por qu? asi y no en distintos arrays? Porla misma raz?n que hicieron los vectores en s?. Porq facilita, por ej, una b?squeda, una asignaci?n, lo que sea
en un simple for o while. Adem?s de que el script mejora los array convencionales, les quita el l?mite tan molesto que tienen. Ver?s, simplemente usando los de un solo indice inclusive puedes crear (de hecho yo lo hice) un juego que incluya backward o replay. Puedes guardar en cada step hasta 10 variables, consumiendo un recurso constante de algo de 1mb de ram por cada 30 segundos o m?s. De esta manera puedes crear un juego que guarde losmovimientos que hiciste y los haga de vuelta en reversa cuando tu quieras, como el prince of persia the sands of time.
Las posibilidades no est?n dadas por el script, es s?lo una herramienta m?s, debes encontrarle tu propio uso, ver?s que alg?n d?a te va a ser muy ?til  :)

Dejo el ejemplo de mario flashback, es una modificacion del propio mario que subi una vez a la comunidad con esa ?nica diferencia (los enemigos no tienen flashback por ahora, pero eso es tema aparte, el flash se hace con el bot?n de borrar)
Título: Re: Array tridimensional (o m?s)
Publicado por: LuisYx en Mayo 30, 2010, 04:04:04 AM
Pues de cierta forma tienes razon con lo de las "cartas",
pero pues bueno ya me aclarastes como era tu idea en si puesto que al leer el
primer post
Citar(guerdaba la posicion tridimensional de el objeto a cada segundo)
Pense que tratabas de guardar las posiciones "X,Y,Z" y me quede  :-\, porque
puedes hacerlo array[0,1]=x...z
Por esa misma razon quise preguntar  :P.

P-Volviendo al tema sobre las "cartas", independientemente los atributos serian
P-cuando programas x carta y ahi mismo declararia todo, y no tener que definir, guardar y luego llamar,
P-con lo que veo se podria hacer perfectamente con 3 dimensiones.
P-Y es cierto lo que dices Texic que es solo una herramienta mas.
PD: Me di cuenta que en el primer parrafo tenia puras "P" y decidi seguir  XD
Título: Re: Array tridimensional (o m?s)
Publicado por: Zeit en Julio 22, 2011, 06:27:54 AM
Hola, se que este post es un poco viejo pero hoy me di cuenta de como generar un array tridimensional:

http://www.comunidadgm.org/index.php?topic=15333.0 (http://www.comunidadgm.org/index.php?topic=15333.0)

Saludos.