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!
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
en teoria deberia... el valor devuelto por time, son los segundos desde el 1 de enero de 1970...
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á.
¿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.
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!
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 ???
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.
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.
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!
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.
no veo el problema de usar
inicio = time(NULL);
...
restante = 60 - ( time(NULL) - inicio )
Eso dentro del loop el frame no afecta el contador ?
inicio = time(NULL);
obviamente debe ir fuera del loop o tener alguna variable flag que lo active solo 1 vez, eso lo decidis vos.
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.
son reales, mas reales que usar los timer.
import "mod_key"
import "mod_proc"
import "mod_proc"
import "mod_time"
import "mod_text"
Begin
cuentalo();
Repeat
frame;
Until(key(_ESC))
exit();
End
Process cuentalo()
Private
int ini_time,passed;
int m_sec_actualization = 1000;
int contador = 0;
Begin
ini_time = get_timer();
write_var(0,100, 100,0, contador);
while(!key(_esc))
passed = get_timer() - ini_time;
if (passed > m_sec_actualization)
ini_time = get_timer();
contador++;
end
frame;
End
End
Grácias DCElso.
Ya esta adaptado, no hay que complicarse tanto como lo puso DCElso, y el time tampoco lleva el parametro NULL :)
Esto te da 1 minuto de tiempo:
Process _60segundos_left()
Private
int ini_time;
int contador = 0;
Begin
ini_time = time();
write_var(0, 100, 100, 0, contador);
while(!key(_esc))
contador = 60 - (time() - ini_time);
frame;
End
End
Muy buena optimización para contar solo un minuto :D.
El ejemplo que puse era un poco más genérico de ahí su poquito más alto nivel de complegidad.
* En el mío muestras un contador que se va incrementando cada 1000 milisegundos, pero puedes configurarlo para más o menos milisegundos. :D.
* El mío es ascendente, osea sirve para ver el tiempo que has tardado, no el tiempo que te queda :D.
* También, el mío no se desbordaría si te pasas de la capacidad del int, ya que siempre vas cambiando el ini_time :D.
Hombre lo se, te conozco como genio, pero he puesto el sencillo porque es el que quiero, con este me sobra, si pongo más contadores pues que anden hacia adelante pues pondré el tuyo ;D
dcelso, free pidio segundos y eso se le respondio, si hubiese pedido milisegundos hubiese sugerido get_timer.
con respecto al null, es cierto no lleva, me confundi con C, pero la idea era esa.