Grabar estructuras en el RC17

Started by Noivern, September 18, 2010, 03:25:19 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Noivern

¡Buenas!

Hoy estaba orgullosamente mostrando el juego a unos familiares, cuando mencioné que era posible cambiar las teclas para jugar. Nada más dicho esto, mi primo va e intenta cambiar las teclas y... no funcionó. El problema, es que ANTES, con un  RC más antiguo (no recuerdo cual era =/), si funcionaba el modo que tenía para grabar las teclas.

Lo que hacía, y repito, FUNCIONABA es:

[code language="bennu"]
//teclasLeidas es un arreglo de int
for (posTeclasLeidas = 0; posTeclasLeidas < sizeof(teclasLeidas)/sizeof(teclasLeidas[0]); posTeclasLeidas++)                        
      scan_code = 0;                        
      while (scan_code == 0)
              frame;
      end                  
      teclasLeidas[posTeclasLeidas] = scan_code;
            
end
[/code]

Luego, una vez que se leyeron las teclas hago la asignación y llamo a mi función para guardar:
[code language="bennu"]
//controles es un arreglo  de struct global de 2 posiciones, jugador puede ser 1 o 2 y cada registro es un int  
controles[jugador-1].arriba = teclasLeidas[0];
controles[jugador-1].abajo = teclasLeidas[1];
controles[jugador-1].izquierda = teclasLeidas[2];
controles[jugador-1].derecha = teclasLeidas[3];
controles[jugador-1].disparoNormal = teclasLeidas[4];
controles[jugador-1].disparoSecundario = teclasLeidas[5];
controles[jugador-1].inicio = teclasLeidas[6];                  
      
guardarDatosControles(tipoControl);
[/code]

finalmente, mi funcion para guardar datos es:
[code language="bennu"]
function byte guardarDatosControles(byte tipoControl)
begin
   switch (tipoControl)
      case CTRL_TECLADO:
         if (!file_exists("config/"))
            mkdir("config");
         end         
         save("config/teclado.conf", controles);//AQUI es la duda
      end
      
      case CTRL_JOY:
         if (!file_exists("config/"))
            mkdir("config");
         end         
         save("config/joy.conf", controles);
      end
   end
end   
[/code]
Entonces me crea un archivo en la carpeta config llamado teclado.conf de 56 bytes, lo que es correcto (4 bytes * 7 registros * 2 posiciones)

Peeeeeeeeeeero al momento de mover la nave no funciona.... y la nave se mueve de la manera:
[code language="bennu"]
IF (key(controles[numeroJugador-1].arriba))
          y-=13 + modificadorVelocidad;
END
[/code]

Entonces lo que antes funcionaba, ahora no lo hace y no tengo ni idea por qué, no me queda más que citar a The Beatles y decir:
HELP!
??? ??? ??? ???

FreeYourMind

Eso ya es programación muy avanzada para mis neuronas :)
Si te sirve de algo pon algunos say's para ver en la consola que valores esta pillando en cada momento.

panreyes

Aunque estés grabando una estructura, ¿no haría falta referenciar el puntero con &?

Noivern

#3
Quote from: PiXeL on September 18, 2010, 07:54:55 AM
Aunque estés grabando una estructura, ¿no haría falta referenciar el puntero con &?

Nopes, ya lo he intentado y pide una variable, no un puntero. Lo raro, como ya mencioné antes, con una RC anterior esto funcionaba perfectamente... entonces quedo con cara de ??? !!

Quote from: FreeYourMind on September 18, 2010, 07:49:53 AM
Eso ya es programación muy avanzada para mis neuronas :)
Si te sirve de algo pon algunos say's para ver en la consola que valores esta pillando en cada momento.

Soy un imbécil, no he hecho lo de los says lolz... bueno llegué a casa después de comer unas empandas por el bicentenario de la independencia de mi país, y me puse a perder tiempo en el warcraft 3 xD
Probando ya mismo lo de los say y posteo resultados...

EDIT:
Y bien los resultados son:


Los primeros 7 valores son al momento de leer el teclado, es decir el scan_code durante el for. Luego los bytes escritos por la funcion save() y finalmente Los otros 7 valores son como queda la struct despues de la asignación y grabar.

Ahora veo la api, y sale que los valores para el scancode usando la función key() son TODOS NEGATIVOS D:
http://wiki.bennugd.org/index.php?title=Scancodes

Quedo más ??? ??? ??? ??? aún




FreeYourMind

Me alegra que hasta los que no tienen puñetera idea puedan ayudar  :D

Windgate

¿Problema para asignar valores a estructuras complejas con punteros? No es por presumir :D pero con mi visor 3D creo que hice la estructura dinámica más compleja jamás hecha en Bennu, tuve algún problemilla, si pones más código te lo puedo mirar a ver si veo algo raro.

De momento aquí:

for (posTeclasLeidas = 0; posTeclasLeidas < sizeof(teclasLeidas)/sizeof(teclasLeidas[0]); posTeclasLeidas++)

Añade paréntesis a esa división, supongo que la prioridad de operandos hace que se opere correctamente, pero nunca se sabe. Cuando hay errores así no cuesta nada ir alisando terreno y eliminando posibilidades.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Noivern

Quote from: Windgate on September 18, 2010, 12:57:12 PM
¿Problema para asignar valores a estructuras complejas con punteros? No es por presumir :D pero con mi visor 3D creo que hice la estructura dinámica más compleja jamás hecha en Bennu, tuve algún problemilla, si pones más código te lo puedo mirar a ver si veo algo raro.

De momento aquí:

for (posTeclasLeidas = 0; posTeclasLeidas < sizeof(teclasLeidas)/sizeof(teclasLeidas[0]); posTeclasLeidas++)

Añade paréntesis a esa división, supongo que la prioridad de operandos hace que se opere correctamente, pero nunca se sabe. Cuando hay errores así no cuesta nada ir alisando terreno y eliminando posibilidades.

Nop, ese no es el origen del error. teclasLeidas es un arreglo de int auxiliar de 7 posiciones, y estoy 100% seguro que la condición de salida funciona bien, uso lineas así por todos lados que tenga que recorrer un arreglo. De lo contrario, en la foto de la consola los scancodes al momento de presionar no concordarían con los valores que tira despues de supuestamente haber grabado a disco duro la struct.

Noivern

#7
Solucionado:
Era una imbecilidad del porte de un transatlántico, pero juro por todo lo sagrado que antes funcionaba :$.

[code language="bennu"]
if (diamanteId.opcionElegida == 1 || diamanteId.opcionElegida == 2)
  //congelar ventana actual, esconder el puntero de selección de menu y comenzar
  //a leer las teclas                  
  idCheckeoMarcos = 0;
  signal(diamanteId, S_SLEEP);
  signal(id, S_FREEZE);
  ventanaCambiarControles(CTRL_TECLADO, diamanteId.opcionElegida);
  diamanteId.opcionElegida = 0;//esto lo tenia puesto antes de llamar a la ventana para cambiar controles, haciendo que
                               //jugador valga 0 y... si miran arriba tengo un jugador-1 en el índice del arreglo dejando la cagá u.u :$.
end
[/code]

Hago y hago memoria y no consigo recordar cuando cometí semejante burrada :s

Bueno gracias a todos, hipermegafail here xD.
Vuelvo a jurar que antes funcionaba el mismo código :s


SplinterGU

llegue tarde, me alegro que lo hayas solucionado, pero evidentemente con ese cambio y cualquier version anterior no funciona.

a ver si nos muestras tu juego, que ahora me dio intriga.

saludos.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Noivern

Jeje se ve complicando pero realmente no lo es, es solo que uso el mismo proceso nave tanto para el jugador 1 y 2 sin tener que hacer 2 comportamientos para cada jugador en lo que a lectura de teclas se refiere. Es la costumbre de usar objetos creo en vez de estructurada. Splinter, debo solucionar un pequeño bug en el comportamiento de un tipo de enemigo antes de liberar una nueva version. El bug es menor y ni se nota en medio de la acción, pero yo se que está ahí, no siempre se comportan como yo esperaba, por lo que necesito solucionarlo primero para estar tranquilo conmigo mismo.