Ftime, time y cosas de la hora.

Started by Hokutoy, January 10, 2010, 02:04:14 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Hokutoy

Buenas!
Me ha surjido una duda y llevo ya un rato que no doy la solución... a ver quien me hecha un cable.
En el juego que estoy haciendo, cuento los segundos de la partida (int tiempo_juego) con una variable que se actualiza por timers a cada segundo a fin de calcular cuantos segundos ha durado tu partida.
Uso esta formula porque los timers y la cuenta la uso para varias cosas mas que aquí no aparecen.
if(timer[0]=>100) timer[0]=0;tiempo_juego++;end
El problema lo tengo a la hora de escribir en pantalla (en la tabla de Highscores)  el tiempo de la partida total. Si tengo que el tiempo_juego=3665; esto equivaldría a 1 hora, 1 minuto y 5 segundos de juego. Me gustaría expresarlo en el tipico formato 01:01:05 igual que el que se consigue al usar la expresion:
ftime("%H:%M:%S",time());

Se puede pasar un valor (3665) a la funcion ftime para substituir (elegir a dedo) el valor que devuelve el time()?
Si es que que no, como puedo conseguir que el 3665 se transforme en 01:01:05 con todos los digitos y los ":"?

Si es que las mates no son lo mío jejeje

Gracias!

Windgate

No lo he probado, pero si ftime() recibe como segundo parámetro un int deberías poder pasarle un int, sea cual sea, incluso a partir de cualquier variable o retorno de función y debería funcionar igual... ¿Lo has probado? :P
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

en teoria deberia... el valor devuelto por time, son los segundos desde el 1 de enero de 1970...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hokutoy

#3
Bueno me autorespondo... que lo mío me ha costado sacarlo a estas horas  ;D
El problema era el siguiente... si usamos:
timestring = ftime("%H:%M:%S",3665);
No obtenemos 01:01:05 sinó que obtenemos 02:01:05 y esto me ha descolocado un poco pero al final he caido en la cuenta de que, como dice Splinter, son los segundos desde el 1 de enero de 1970... pero no desde las doce de la noche (00:00:00) sinó desde la 1 de la madrugada (01:00:00).
Solo hay que sumar 23 horas (82800 segundos) al tiempo que quieres representar para poner el "marcador" a cero por lo que 3665+82800=86465. Entonces:
timestring = ftime("%H:%M:%S",86465);
Arroja el valor deseado de 01:01:05
Saludos!

Edito: Si en vez de sumar 23 horas restamos 1 hora (-3600 segundos) al valor que queremos representar funcionará igual de bien.

timestring = ftime("%H:%M:%S",65);
Arroja el valor deseado de 01:01:05 aunque si el tiempo deseado es inferior a una hora este ultimo metodo de resta no funcionará.


Windgate

¿Estás seguro de que cuenta desde la 1 de la madrugada? Eso no sería lo "deseable", desconozco la implementación, pero debería venir desde las 12 según la fecha del sistema en el cual se ejecuta. He usado esas funciones para hacer que el día y la noche funcionen en tiempo real, y pese a sus complicaciones no he tenido ese problema de que se encuentre adelantado 1 hora... Es algo que debería aclararse.
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

Hokutoy

#5
Quote from: Windgate on January 10, 2010, 03:46:16 AM
¿Estás seguro de que cuenta desde la 1 de la madrugada? Eso no sería lo "deseable", desconozco la implementación, pero debería venir desde las 12 según la fecha del sistema en el cual se ejecuta. He usado esas funciones para hacer que el día y la noche funcionen en tiempo real, y pese a sus complicaciones no he tenido ese problema de que se encuentre adelantado 1 hora... Es algo que debería aclararse.

Pues no sé, pero si pasas esto:
timestring = ftime("%H:%M:%S",0);
es decir, 0 segundos desde la fecha de inicio, te da el siguiente resultado: 01:00:00

Pruebalo tú mismo:
import "mod_time"
import "mod_timers"
import "mod_text"
import "mod_key"

Process Main();
Private
    String timestring; // The string holding the formatted time
Begin

    write_string(0,0,0,0, & timestring); // Display the timestring
    timer = 100; // Make it so it updates the timestring immediately

    Repeat
    if(timer>100) // Update the timestring every 1 second
            timer = 0;
            timestring = ftime("%d-%m-%Y %H:%M:%S",0);
        end
        frame;
    Until(key(_esc))

End


NOTA:EN LA WIKI APARECE ESTE CODIGO CON UNA ERRATA... PONE import "mod_timer " Y DEBE PONER import "mod_timers"

Lo que comentas de que siempre la usas sin ningun problema para conseguir el tiempo real, puede que se deba a que en este caso concreto nosotros le pasamos el tiempo manualmente y no usamos el comando time() para conseguirlo. Quiero pensar que el comando   time() ya preveé esa hora de mas... incluso ¿puede ser porque en españa seamos gtm+1?
Piensa que el ftime() solo es para dar formato... no calcula nada.

Saludos!

Windgate

Cierto, lo acabo de probar :S

Cuando implementé lo del tiempo real sí que utilizaba time ( ), pero obtenía horas minutos y segundos dividiendo entre 3600, entre 60 y entre 1 respectivamente, así que todo iba correcto. time ( ) devuelve la fecha del sistema, la fecha exacta, en otros juegos he tenido un marcador que mostraba la hora usando ftime ( ) y pasando time ( ) como parámetro y funcionaba perfectamente.

No sabría decir si el problema es de time ( ) o de ftime ( ) pero está claro que cuando a ftime ( ) se le pasa un valor entero en lugar de lo que retorna time ( ) cuenta 1 hora más... Curioso ???
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

me olvide de un detalle... seguramente esta teniendo en cuenta la zona horaria... no uses ftime para esto, el calculo para pasarlo a horas y minutos es tan estupido que me da verguenza ponerlo... hace mejor las divisiones necesarias y arma el texto en base a eso.

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

Windgate

Así lo hice yo, dividir entre 3600 y módulo 24 para las horas, dividir entre 60 y módulo 60 para los minutos y módulo 60 sin más para los segundos, prueba eso.

El operador módulo es % por si no lo sabes, prueba a ver si queda mejor la cosa.

Lo de la zona horaria es raro Splinter... En España que yo sepa tengo +1 y no había detectado ese problema.
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

Hokutoy

#9
Bueno, definitivamente, al hacer Ftime() si detecta la zona horaria del sistema operativo donde funciona y actua en consequencia.
Haciendo pruebas (el codigo de antes) me he dado cuenta que el mismo codigo que en el PC (España gtm +1) me da 01:00:00 en la wiz (sin zona horaria) me da 00:00:00. Si adelanto a Gtm+4 en el PC el codigo me da 04:00:00

Bueno, igualmente ya lo he arreglado para el tema que me ocupa.

Windgate gracias por lo del modulo... la verdad es que no conocia bien como era el comando... si es que soy un beginer.

Gracias!

FreeYourMind

Reabro el chiringuito.

Queria hacer un procedimiento que dure sólo 1 minuto, o sea que ponga en pantalla 'Tiempo 59 segundos' y que vaya restando segundos en tiempo real, o sea, que la variable sean segundos reales y se vayan poniendo en pantalla los segundos a medida que pasa el tiempo.
Al fin del minuto (Tiempo < 0 segundos) saldria del proceso o llamaba otro (esto no importa).

Como podria usar el Time para hacer esto ? En realidad no quiero obtener las horas ni los segundos actuales del reloj, pero si que el contador decremente a la velocidad de segundos reales.

Un ejemplo de esta cosa seria de agradecer, seguro que mas de uno ya ha puesto segundos reales en su juego.
Grácias de antemano.

SplinterGU

no veo el problema de usar

inicio = time(NULL);

...

restante = 60 - ( time(NULL) - inicio )
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Eso dentro del loop el frame no afecta el contador ?

SplinterGU

inicio = time(NULL);

obviamente debe ir fuera del loop o tener alguna variable flag que lo active solo 1 vez, eso lo decidis vos.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Hombre me refiero al restador y en que medida este puede ser afectado por el frame; de modo a que dejen de ser segundos reales.
El setear el inicio logicamente tiene que estar fuera. Mañana lo implemento que aqui son las 2 de la mañana y hay que madrugar  ;D
Grácias.