Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Callbacks y variables "volatile"

Iniciado por 16BITBoy, 09 de Agosto de 2008, 01:08:38 AM

« anterior - próximo »

16BITBoy

Buenas. Tengo un problema con el cierre desde el boton cerrar de la ventana de mi programa. ( Xtreme Pong, el juego que enseñe antes en proyectos)

El caso es que el cierre del programa desde el boton cerrar de la aplicación se debe de programar a través de la libreria allegro que uso, entonce según la documentación, debo de usar la función:

set_close_button_callback(close_button_handler);

Esta pues ya sabeis llama a una función cada vez que se produce el evento de hacer click en el boton X de la ventana.

Y se debe hacer asi, todo esto según la documentación de allegro:

// Creamos una variable, que dirá cuando cerrar el programa

volatile int endProg;

//una función a la que llamar

void close_button(void)
{
     endProg = 1;
}
END_OF_FUNCTION(close_button) //Es necesario esto para alegro con esta función


luego, hacemos lo siguiente:

LOCK_FUNCTION(close_button_handler);//Se bloquea la funcion
set_close_button_callback(close_button_handler);//Se ajusta que funcion llamar


luego es cosa de ir comprobando en nuestro bucle si endProg == 1 y si es asi salir del bucle y que vaya cerrando el programa.

Pues lo mio esta asi:

volatile int endProg;

...

void close_window(void)
{
   endProg = 1;
}
END_OF_FUNCTION(close_window)


en mi función init_gameloop():

     
       LOCK_VARIABLE(speed_counter);
LOCK_FUNCTION(increment_speed_counter);

LOCK_VARIABLE(fps);
LOCK_VARIABLE(frame_count);
LOCK_FUNCTION(fps_proc);
LOCK_FUNCTION(close_window);//Aquí la bloqueo <------------

install_int_ex(increment_speed_counter, BPS_TO_TIMER(60));
install_int(fps_proc, 1000);

// Text with transparent background
       alfont_text_mode(-1);
text_mode(-1);

       endProg = 0;

//Setting the window close button callback
set_close_button_callback(close_window); //<---pongo la función

       buffer = create_bitmap(320,240);

       gconf = new GAME_CONFIG();

       gconf->gameType = 0;
       gconf->players = 1;

       // Finally, enter the game loop
      gameloop();
 
      // Removing timers, we dont need them anymore
      remove_int(increment_speed_counter);
remove_int(fps_proc);


ahora entrando a gameloop():

void gameloop()
{
   while(endProg == 0)
   {
       menu(gconf);
       if(endProg == 0)game(gconf);

   }
}


En otras funciones de otros modulos, modifico el valor de endProg cuando un usuario pulsa ESC desde el menú por ejemplo, o en el menu selecciona la opcion salir, y cambia de valor perfectamente, pero se ve k la función esa (close_window) que se llama en el callback, no me cambia el valor por muy volatile que sea. Ya probe cambiando el tipo, antes era bool y ahora lo hice con int como veis, pero nada hay algo ahi que no me cuadra, sera otra tonteria pero llevo tela tiempo viendo y no doy con lo que es.

Si en la función close_window pongo exit() en ve de k cambie le valor, me cierra el juego sin problemas, pero se que no es la mejor forma teniendo cosas en memoria que liberar, aparte en ciertos pc's les da fallo al cerrar con ese codigo del exit.

llevo ya un tiempazo con esto, y no doy con la solución, quiero arreglar eso que es lo unico que me falta pa dejar el codigo bonito y el juego bien, y subir el juego actualizao ya con su codigo fuente.

Un Saludo!
[/code]

chan

No tengo ni idea de allegro, pero por los ejemplos que he podido ver, parece ser que en algún momento tienes que hacerle un lock a tus variables, en éste caso LOCK_VARIABLE(endProg); , ¿puede ser eso?

16BITBoy

ya probe, pero parece ser que no, en la documentación de allegro, no dice que haya que bloquear la variable volatile, eso solo en los temporizadores.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.