Hola a todos.
Siguiendo el manual de Osk hice un ejemplo que muestra imagenes aleatorias obtenidas desde un archivo fpg.
Funcionar, funciona, pero las imagenes se muestran muy rapido.
La duda que tengo es si se puede hacer una pausa de n segundos como se haria en C con sleep(5000).
Aqui os pongo el codigo y de paso me comentais si hay algo que este mal.
Import "mod_video";
Import "mod_screen";
Import "mod_map";
Import "mod_rand";
Import "mod_key";
Process Main()
private
int imagen;
end
begin
set_fps(32,0);
set_mode(640,480,32);
imagen=load_fpg("playas.fpg");
Repeat // Mostramos las imagenes hasta que se pulsa la tecla ESC
put_screen(imagen,rand(1,4));
frame;
Until(key(_esc))
end
Salu2.
una opcion es usar timers
http://wiki.bennugd.org/index.php?title=Timer (http://wiki.bennugd.org/index.php?title=Timer)
pones el timer elegido en 0
preguntas si el tiempo es mayor o igual al que necesitas
cambias el fotograma
lo vuelves a poner en 0
vuelves arriba (a la pregunta)
en ese mismo ejemplo, donde dice frame; podes cambiarlo por frame(5000); o un numero mas grande.
Lo que hace eso es que lo que esta dentro del repeat en vez de ejecutarse una vez por frame, se ejecuta una vez cada 5000 frames.
(porfa corregirme si estoy confundido)
Quote from: gecko on June 01, 2012, 01:37:42 AM
en ese mismo ejemplo, donde dice frame; podes cambiarlo por frame(5000); o un numero mas grande.
Lo que hace eso es que lo que esta dentro del repeat en vez de ejecutarse una vez por frame, se ejecuta una vez cada 5000 frames.
(porfa corregirme si estoy confundido)
frame(3200); para hacer una pausa de 1 segundo porque tiene puesto el programa a 32 fps , si no me equivoco es que ese proceso "necesitaría 32 frames en pintarse"
Muchas gracias a todos por responder tan rapido.
He probado las 2 maneras que comentais.
Poniendo Wait(300) y Frame(9600).
En los 2 casos, si hace la espera el tiempo que debe, pero no sale de la aplicacion al pulsar la tecla Esc, la tengo que pulsar varias veces para que funcione.
Import "mod_video";
Import "mod_screen";
Import "mod_map";
Import "mod_rand";
Import "mod_key";
Import "mod_timers";
Process Main()
private
int imagen;
end
begin
set_fps(32,0);
set_mode(640,480,32);
imagen=load_fpg("playas.fpg");
Repeat // Mostramos las imagenes hasta que se pulsa la tecla ESC
put_screen(imagen,rand(1,4));
//wait(300);
FRAME(9600); // Espera un rato
Until(key(_esc))
end
Function int wait(int t)
Begin
t += timer[0];
While(timer[0]<t) frame; End
return t-timer[0];
End
Estara el problema en el bucle repeat ?
wait en bennugd?
no recuerdo haberla puesto, seguramente pusiste wait y estas usando el mismo dcb compilado con la version frame.
wait es una funcion (al parecer es una funcion de usuario) que puse al final del codigo del ejemplo, la saque de:
http://wiki.bennugd.org/index.php?title=Timer (http://wiki.bennugd.org/index.php?title=Timer)
Los dcb los he borrado cada vez que he compilado si he hecho algun cambio en el codigo.
Y la cosa sigue igual, si se muestran las imagenes con una pausa de segundos entre ellas, pero la tecla Esc no funciona a la primera.
Asi es que cada vez estoy mas perdido.
Splinter: Wait es como llamó a una función en su programa.
Creo que programa tarda en responder porque con tu wait o con frame(9600) estas diciendo al programa que no haga nada por un tiempo. Ni siquiera leer pulsaciones del teclado. Podrías poner un " if(key(_esc)) break; end "
Me parece que el wait es complicarse un poco. Yo haría algo como:
Repeat // Mostramos las imagenes hasta que se pulsa la tecla ESC
put_screen(imagen,rand(1,4));
timer[0]=0;
while (timer[0]<300)
if(key(_esc)) break; end
frame;
end;
Until(key(_esc))
Jomagopo, contestaste antes de que terminara de escribir :)
No, wait es simplemente como llamaron a la función. Lo tienes al final de tu programa
Function int wait(int t)
Begin
t += timer[0];
While(timer[0]<t) frame; End
return t-timer[0];
End
Antes quise decir que wait era una funcion creada por un usuario, esta claro que le llamaron wait en este caso.
He probado lo que a comentado Kloppix y ya funciona a la perfeccion.
Poco a poco ire aprendiendo.
Muchas gracias a todos.
;)
Yo creo q otra manera de q te funcione la tecla escape durante las pausas .. es haciendo q sea otro proceso el que compruebe la pulsacion de esa tecla. Porq si la comprobacion y el frame(9600) estan en el mismo proceso, la ejecucion esta parada en el frame, y no llega a la comprobación ... no se si me esplico.... poniendo la comprobacion en otro proceso q tenga frame normal (frame;) puedes hacer q la condicion se compruebe en cada fotograma, y no cada 96 fotogramas (3 seg) q es lo q ocurre así
Tienes razon en lo que comentas, KeoH.
Tuve que retocar el codigo con lo que comento antes Kloppix.
Este es el codigo final, funcionando bien, perdon por no ponerlo antes.
Import "mod_video";
Import "mod_screen";
Import "mod_map";
Import "mod_rand";
Import "mod_key";
Import "mod_timers";
Process Main()
private
int imagen;
end
begin
set_fps(32,0);
set_mode(640,480,32);
imagen=load_fpg("playas.fpg");
Repeat // Mostramos las imagenes hasta que se pulsa la tecla ESC
put_screen(imagen,rand(1,4));
timer[0]=0;
while (timer[0]<300)
if(key(_esc)) break; end
frame;
end;
Until(key(_esc))
end
Gracias a todos por la ayuda.
juro que mire el codigo y no habia visto esa funcion escrita... curiosamente el codigo esta editado despues de mi comentario...
No edite el codigo del primer post, de verdad, para que iva a mentir.
Lo que hice fue editar el primer post para poner (solucionado) en el asunto.
Edito:
Es en mi segundo post donde esta puesta la funcion wait y ese post no esta editado.
no, no, simplemente se me paso a mi... solo que el hecho de que este editado puede dar a confusion... pero se me paso a mi...