Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Samigabacho en Octubre 23, 2012, 07:03:17 PM

Título: Arary bidimensional dinámico (SOLUCIONADO)
Publicado por: Samigabacho en Octubre 23, 2012, 07:03:17 PM
Después de darme una vuelta por el foro y hacer un par de búsquedas (esperaba que esta pregunta ya habrá sido hecha) ahí va mi duda...

Tengo que recoger un montón de datos a lo largo del juego para luego guardarlos en un fichero *.txt. Para hacerlo introduzco en un array bidireccional todos los datos que voy necesitando a lo largo del juego. El problema viene porque no se cuál será el número final de filas o columnas que deberá tener, ya que dependerá de factores del juego (duración, número de disparos, etc...). Por lo que a la hora de declararlo lo hago copiando el número de filas y columnas del array que usé para cargar el juego (que posee una estructura semejante pero de dimensiones diferentes)... y claro eso finaliza en error cuando el bucle de guardado se sale fura del array

Muchas gracias.
Título: Re:Arary bidimensional dinámico
Publicado por: noshy en Octubre 23, 2012, 08:22:08 PM
Hola colega, he buscado por todos lados y no veo si se puede contar la cantidad de elementos, la unica solucion que veo es que en una variable globar cuentes la cantidad de datos que has grabado para luego hacer un for hasta ese valor.

saludos
Título: Re:Arary bidimensional dinámico
Publicado por: Samigabacho en Octubre 23, 2012, 08:29:50 PM
Compañero noshy, fue justo lo primero que pensé de manera rápida, pero al pararme un poco me di cuenta de que no me sirve.
Te explico porque.

Como tengo que ir guardando las respuestas (número de pulsaciones de una tecla) del jugador "on-line", debería  tener el array definido antes de saber cuantas filas y cuantas columnas finalmente tendrá.

En otros lenguajes de programación de teja inicializar arrays con variables no inicializadas, pero creo que en GML no.

Gracias!
Título: Re:Arary bidimensional dinámico
Publicado por: noshy en Octubre 23, 2012, 08:41:24 PM
Colega, GML si te deja, justamente es un array dinamico, deberias hacer un script que vaya cargando el array segun un contador del objeto.

Por ejemplo

Al inicio del juego declara la variable


global.contador = 0;


Luego en el script


//Script scr_insertar_en_array

vDato = argument0;

array[global.contador] = vDato;
global.contador += 1;



Luego para recorrerlo en el momento que quieras realizas un for:


for (i=0;i<global.contador-1;i+=1) {
    <sentencia>
}
Título: Re:Arary bidimensional dinámico
Publicado por: penumbra en Octubre 23, 2012, 08:45:09 PM
Quizás hay  que evitar usar el ciclo for, pues eso le quita dinamismo (tienes que saber el valor de "i" de antemano. )No sé si funcione, pero una idea es definir un arreglo parecido a

arreglote[1000, 1000] = 0

tengo entendido que en GM no tienes que especificar el contenido  celda por celda para poder crear el arreglo. El ejemplo anterior llena con ceros el millón de casillas (esto es una exageración, sólo para ejemplificar)

Ahora que ya tienes ceros, encárgate de llenar el arreglo a tu gusto, pero sin saltarte celdas ni columnas (sin dejar ceros entre datos, por así decirlo)

Puedes recorrer el array con un cilclo WHILE,  (así evitas tener que saber el límite de "i" y de "j") ir leyendo el valor de las celdas e incrementar una variable contador mientras no se encuentre con un cero, o con "" (cadena vacía). Tambien dentro del while harías la escritura al archivo txt. Al encontrar el cero o la cadena nula, se alcanza el final de los datos válidos en el arreglo y se termina el ciclo while.

Como dije, sólo es una ídea. No sé si pueda funcionar.

Edito: La variable contador no es necesaria, a menos que quieras saber el límite donde terminan los datos válidos en el arreglo, o si quieres hacer la escritura al archivo fuera del WHILE, usando un ciclo FOR
Título: Re:Arary bidimensional dinámico
Publicado por: noshy en Octubre 23, 2012, 09:08:14 PM
Lo que no entiendo es porque no conoces el numero maximo de columnas, el de filas si, generalmente es asi, pero el de columnas no, debe ser tambien porque no conozco el objetivo y el programa que quieres hacer.


Por ejemplo, si las columnas representa a la tecla presionada y la fila al segundo en que se presiona, el numero de teclas es limitado pero el segundo no.

Si me cuentas un poco mas de lo que estas haciendo a lo mejor encontremos una solucion.

saludos
Título: Re:Arary bidimensional dinámico
Publicado por: Samigabacho en Octubre 23, 2012, 09:38:35 PM
El número de filas corresponde con la clase de variables que quiero guardar en ellas, y ese número de variables si que lo se, por eso lo determino cuando inicializo el array. El problema lo tengo con las columnas porque el número de estas estará determinado por el número de segundos que el jugador esté jugando. En verdad no es el número de segundos si no más bien el número de segundos de cada uno de los momentos que cargué debería haber en el juego.

Ejemplo.
Cuando cargo el juego mediante un .txt le digo que habrá 6 momento críticos en el juego. Y que cada uno de esos momento tiene dos partes y cada parte durará 5 segundos cada una.
Cuando el juego termine el array donde guarde los datos deberá tener tantas columnas como segundos tenga cada una de las fases, por el número de fases y por el número de momentos.
A simple vista sería una simple multiplicación,y en verdad así podría ser si siempre se hiciera lo mismo para cada jugador, pero pretendo que casa txt tenga números diferentes de momentos y duraciones diferentes de esos momento.

Esto es un poco complicado de entender, pero en verdad lo que pretendo creo que también lo es.... :D
Título: Re:Arary bidimensional dinámico
Publicado por: noshy en Octubre 23, 2012, 09:57:41 PM
Colega, el que tienes es un error de diagramación, simplemente cambia lo que quieres pones en columnas a filas y las filas a columnas, el array esta hecho para tener columnas limitadas y filas dinamicas, simplemente pon los segundos en filas y enlas columnas pon las variables limitadas.

saludos
Título: Re:Arary bidimensional dinámico
Publicado por: Samigabacho en Octubre 23, 2012, 10:03:23 PM
Vaya! no tenía ni idea de eso.

Pero sigo teniendo la misma pregunta...
En el caso de cambiar el número de variables conocidas a las columnas (me va a dar un curro que me voy a poner a  :'( ) cómo sé el número de filas que tengo que asignar cuando declaro el array?

mi_array [númeroConocidoDeColumnas; ¿Filas?]
Título: Re:Arary bidimensional dinámico
Publicado por: noshy en Octubre 23, 2012, 10:09:58 PM
Es que en GM no tienes que declarar el array  de antemano, es lo bueno que tiene GM, simplemente ve cargando y contando las filas, con el contador sabes cual es la ultima cargada, y con respecto a las columnas, ya sabes que corresponde a cada una, y si te hace falta otra mas pues solo la agregar en forma dinamica.
Título: Re:Arary bidimensional dinámico
Publicado por: ferhand en Octubre 23, 2012, 11:30:06 PM
  Saludos amigo Samigabacho:


   En realidad la idea de crear unas variables que gestione esto es la correcta.  8)

   Estas variables guardará las filas y columnas del array. Antes de crear una fila/columna nuevas en el "array" se deben actualizar los valores en estas variables.  ;)

  A la hora de recorrer el "array" lo haces utilizando los valores que tienen estas variables.  :D

  No veo complicación en esto.  :-\
Título: Re:Arary bidimensional dinámico
Publicado por: Samigabacho en Octubre 24, 2012, 09:08:01 AM
Hola amigos,
Tal y como lo contáis, ¿podría declarar el array de la siguiente manera?

[gml]mi_array [misColumnas, misFillas]; [/gml]


¿sin que filas y columna estén inicializadas e ir actualizando el valor de las mismas a lo largo del juego de manera que al actualizarlo el array crezca?

Gracias!
Título: Re:Arary bidimensional dinámico
Publicado por: noshy en Octubre 24, 2012, 12:44:58 PM
Si se puede, es asi como se hace realmente.

saludos
Título: Re:Arary bidimensional dinámico
Publicado por: ferhand en Octubre 24, 2012, 04:04:11 PM
Cita de: Samigabacho en Octubre 24, 2012, 09:08:01 AM
Hola amigos,
Tal y como lo contáis, ¿podría declarar el array de la siguiente manera?

[gml]mi_array [misColumnas, misFillas]; [/gml]


¿sin que filas y columna estén inicializadas e ir actualizando el valor de las mismas a lo largo del juego de manera que al actualizarlo el array crezca?

Gracias!
  Una aclaración:

   Me parece que las variables "misColumnas" y "misFillas" deben tener al menos algún valor numérico, por ejemplo cero (0).  :D

  Creo que es de carácter obligatorio.  8)
Título: Re:Arary bidimensional dinámico
Publicado por: Samigabacho en Octubre 24, 2012, 04:23:23 PM
Muchas gracias a todos, creo que la cuestión me ha quedado aclarada.
Concluyo el tema.
GRACIAS :D