Re:Hacer una pausa de n segundos (Solucionado)

Started by jomagopo, June 01, 2012, 12:32:30 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

jomagopo

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.

Rein (K´)ah Al-Ghul

una opcion es usar timers
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)

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

gecko

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)
Torres Baldi Studio
http://torresbaldi.com

KeoH

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"

jomagopo

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 ?

SplinterGU

wait en bennugd?

no recuerdo haberla puesto, seguramente pusiste wait y estas usando el mismo dcb compilado con la version frame.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

jomagopo

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

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.


Kloppix

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))

Kloppix

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

jomagopo

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.
;)

KeoH

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í

jomagopo

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.

SplinterGU

juro que mire el codigo y no habia visto esa funcion escrita... curiosamente el codigo esta editado despues de mi comentario...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

jomagopo

#13
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.

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2