Reloj

Started by Yawin, November 20, 2010, 11:55:07 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Yawin

Bueno, la cosa es que haciendo el arcad de mi marcianitos, he necesitado hacer animaciones. Y en vez de decirle cada tantos frames me haces tal y nosequé. Prefería hacerlo por segundos. Asi puedo medir cuantos segundos dura la coreografía del boss, ss animaciones, los levels, etc...

Este es el reloj:
process reloj(int modo, int fs) //El parámetro "fs" es para pasarle los frames por sgundo a los que va a ir. Para poder calcular cuanto dura un segundo.
public
tmp=0;
end
private
int i;
end
begin
loop
switch(modo)
case 0: //El modo 0 mide segundos
for(i=0; i<fs; i++)
frame;
end
tmp++;
end
case 1: //El modo 1 mide medios segundos
for(i=0; i<(fs/2); i++)
frame;
end
tmp++;
end
case 2: //El modo 2 mide cuartos de segundos
for(i=0; i<(fs/4); i++)
frame;
end
tmp++;
end
end
end
end


La idea la saqué del objeto "Timer" que hay en .Net. Este, cada X milisegundos genera un evento Tick.

edit: Sé que existe la funcion get_timer();, pero, no se, me gusta más medirme mi propio tiempo xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

en bennu tambien tienes 10 timers, que se actualizan solos, son variables timer[0] a [10], podes resetearlas, poniendolas a 0 (o al valor que quieras), y luego bennu seguira incrementandolas.

los eventos deberas hacerlos tu.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

mmm no se, aun asi, prefiero hacerme yo mi timer. Ya se que lo trae, pero... no se, imagina que necesito contar cuartos de segundo, pos ahi lo tengo xD

No se, a mi me gusta hacer todo aquello que puedo hacerme xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

#3
no te entiendo... y como harias tu timer?

me imagino que querras hacerlo basado en frames, y eso es el peor error de tu vida... porque los frames no son 100% precisos... los timers y get_timer si lo son, get_timer mas que que ningun otro, y no hay otra funcion de timers en bennugd, asi que no entiendo que queres hacer.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Bueno, los timers miden CENTÉSIMAS de segundo, no segundos.
Y de nuevo la eterna discusión de timers contra contadores: timers es muy preciso, pero no tiene en cuenta las ralentizaciones del programa, los contadores siempre van a ir sincronizados con él, así que conviene usar cada uno según el caso ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Quote from: Drumpi on November 21, 2010, 01:30:15 AM
Bueno, los timers miden CENTÉSIMAS de segundo, no segundos.
Y de nuevo la eterna discusión de timers contra contadores: timers es muy preciso, pero no tiene en cuenta las ralentizaciones del programa, los contadores siempre van a ir sincronizados con él, así que conviene usar cada uno según el caso ;)

drumpi, se esta hablando de tiempos.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

¿Los timers no medían frames? Menos mal que no he programado nada medianamente serio con ellos...
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

SplinterGU

#7
timers = frames???????!!!!!

timers son timers.

EDIT: yo en el juego de la crap anterior de zombies, use timers, por eso sin importar los frames a que el juego iba, las animaciones eran siempre exactas en cuanto al tiempo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Yo siempre tengo esa duda a la hora de crear animaciones para los juegos, usar timers o usar contadores. los timers está claro que son tiempos reales siempre, pero con contadores puedes regular la velocidad general de tu juego cambiando el fps con set_fps, es decir que si lo ves rápido puedes bajar la velocidad general del juego o al revés.
Se supone que si pones un set_fps(20,loquesea) y usas frame en tu bucle, tu contador se incrementará 20 veces por segundo independientemente de en que maquina lo estés ejecutando o no es así.
private
   contador
Begin
    Set_fps(20,0);
    Loop
        contador++;
        Frame;
    End
End
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

todo depende de lo que debes hacer, imaginate que tu animacion lleva sonido sincronizado con la imagen, evidentemente no puedes usar frames para eso, tienes que usar tiempo, ya que el sonido no se regula por frames.

y asi muchas cosas, pero todo depende de lo que y como quieras hacerlo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Cierto, en 3D las animaciones van por tiempo, no por frames.

Tendré que modificar mi módulo de animación para que use timer entonces... Interpreté que medían frames y preferí usar en su lugar un contador para no hacerlo dependiente de esa dll...

Gracias Splinter :D
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

Drumpi

Las animaciones en 3D también pueden ir por frames.
Es lo que discutimos siempre: los timers siempre van a ir en tiempo real, pero si el juego se ralentiza, la respuesta de las teclas y todo lo que vaya con frame se ralentiza, manteniendo todo sincronizado.
El ejemplo de siempre: pongamos un juego de carreras en el que das 5 minutos para superarlo. Si el reloj se controla con contadores, si la máquina se ralentiza por falta de potencia, el reloj no tardará 5 minutos en llegar a cero, tardará más. Si el reloj se controla con timers, sí, tardará 5 minutos exactos en llegar a cero, pero como el juego va ralentizado, el coche se mueve más despacio, y seguramente no llegue a la meta en esos 5 minutos (porque estaba previsto que tardase ese tiempo a velocidad NORMAL).

¿Se pueden usar timers? sí, sin problema, sobre todo cuando sabemos que nunca vamos a tener problemas de velocidad, ni se va a pausar el juego.
Pero hay más ejemplos para los timers, como dice Splinter, para sincronizarlo con el sonido (que no va por frames, usa un hilo aparte), para hacer pantallas de espera (ir leyendo datos y hacer un frame cada segundo, para que no nos salga la ventana de "el programa no responde"), un reloj en tiempo real, independiente del juego/aplicación...

Hay que usar cada cosa en su contexto. Por eso opino (repito: opino) que las animaciones, salvo que sean videos (y aun así, podrían haber excepciones), usen contadores en lugar de timers para calcular el retardo entre imagen e imagen.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Yawin

Soy de la misma opinión. El día pasado, probando los timers de Bennu, hice la animación de bajada de un boss. La primera vez que lo reproduje bajó a media pantalla. La siguiente vez, se pasó de largo y continuó bajando xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Eso puede deberse a que con los timers hay que tener cuidado con la comparación "==" porque es posible que se pase esa centésima de segundo: suponinendo que cada frame dure 2 centésimas de segundo, poner:
if (timer[ 0 ]==7)
Nunca se va a cumplir, porque el timer marcará 2, 4, 6, 8, ó 10 centésimas. Y esto hablando en un mundo ideal. Con los timers hay que recurrir siempre a comparaciones ">=" o "<=", y además, inicializarlo al valor que nos convenga.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)