Estoy haciendo un juego en el que necesito un Cronómetro ultra preciso, y como ya conseguí hacer el cronometro, lo quería compartir con ustedes. Es un cronometro al estilo 24. Tiene Horas, minutos, segundos y centésimas y se puede adaptar fácil para días, años y siglos y milenios.
Dale click al botón de Play abajo para arrancar el cronometro
Para hacerlo, al principio trate de hacerlo con un Timer, pero me lleve una gran decepción al darme cuenta, que la clase Timer no es tan buena como nos la hace creer él. Si, él.
La decepción de Timer
Hice un cronometro funcional con solo Timer colocando un new Timer (10, 0). Pero ingrata fue mi sorpresa cuando lo compare, con un cronometro real. A los 15 segundos ya llevaba 2 segundos de retraso. Peor fue, cuando cambié la velocidad de fotogramas a 2 y el cronometro parecía estar en Matrix. Y cuando puse los fotogramas a 120 el cronometro paresia que se hubiera inyectado adrenalina. Los Timer NO SON EXACTOS, si quieres precisión utiliza getTimer.
getTimer, es un método que nos indica cuantas milésimas han trascurrido desde el inicio del .swf. Uno utiliza ese método para controlar el cronometro. El cronometro se actualiza con un Timer pero igual se puede actualizar con cualquier otro ciclo, aunque el timer es la mejor opción.
Explicación:
En el .fla como clase de documento, hay que colocar Cronometro, que es la clase que aparece más abajo. En el .fla también hay que tener 5 elementos.
Un texto dinámico llamado led_txt. La fuente que utilizo se llama Transistor. Al texto hay que darle la opción de incorporar, para que la fuente se pueda ver, aunque no se tenga instalada la fuente.
Un boton llamado botonIniciar
Un boton llamado botonPausar
Un boton llamado botonFotografia
Un boton llamado botonReiniciar
En la parte del cronometro que maneja el tiempo, me base en un muy buen cronometro hecho en AS2 que encontré en este blog. Y adapte esa parte a AS3.
Mi esperanza es que el código me haya quedado lo suficientemente claro y comentado para que se entienda por si solo.
Estilo 24
El color del texto es #FFFF99 y los filtros son los siguientes
Y ya esta, hay esta el cronometro estilo 24
Ahora viene la clase. Esta clase se llama Cronometro, así que hay que guardarla como Cronometro.as
public class Cronometro extends Sprite { private var milesimasXcentecima:uint=10; private var milesimasXsegundo:uint=1000; private var milesimasXminuto:uint=1000 * 60;// 60,000 private var milesimasXhora:uint=1000 * 60 * 60;// 3,600,000
private var hora:uint; private var minuto:uint; private var segundo:uint; private var centesima:uint;
private var hora_txt:String; private var minuto_txt:String; private var segundo_txt:String; private var centesima_txt:String;
private var milesimasTranscurridas:uint; private var copiaDe_GetTimer:uint; private var referenciaTemporal:uint;
private var cronometroPausado:Boolean=false; private var cronometroAndando:Boolean=false;
private var temporizador:Timer=new Timer(10,0);
public function Cronometro() { led_txt.text="00 : 00 : 00 : 00";
temporizador.addEventListener(TimerEvent.TIMER,tickTack); botonIniciar.addEventListener(MouseEvent.CLICK,iniciarCronometro); botonPausar.addEventListener(MouseEvent.CLICK,pausarCronometro); botonReiniciar.addEventListener(MouseEvent.CLICK,reiniciarCronometro); botonFotografia.addEventListener(MouseEvent.CLICK,fotoGrafiarCronometro); } private function tickTack(e:TimerEvent):void { milesimasTranscurridas=getTimer() - copiaDe_GetTimer; // Si por ejemplo el .SWF lleva abierto 10 segundos (10000 milesimas) y el cronometro se inicio en el segundo 4, // entonses nuestro cronometro lleva 6 segundos transcurridos. 10000 - 4000 = 6000 (6 Segundos) hora=Math.floor(milesimasTranscurridas / milesimasXhora); // Digamos que llevamos 14,687,987 milesimas trascuridas. 14,687,987 / 3,600,000 = 4.079... Redondeando 4 Horas referenciaTemporal=milesimasTranscurridas - hora * milesimasXhora; // Ejem: Llevamos 14,687,987 mile = 4 horas algo. 14,687,987 mils - (4 * milesimasXhora = 14,400,000) = 287,987 // Aca referenciaTemporal nunca va ser mayor que 3.599.999 milesimas.
minuto=Math.floor(referenciaTemporal / milesimasXminuto); // Ejem: referenciaTemporal es = 287,987 / milesimasXminuto (60,000) = 4.799.. Redondeando 4 Minutos // minuto nunca va ser mayor que 59
referenciaTemporal=referenciaTemporal - minuto * milesimasXminuto; // Ejem: referenciaTemporal es 287,987 - (4 Minutos * 60,000 = 240.000 ) = 47,987 // Aca referenciaTemporal nunca va ser mayor de 59.999
segundo=Math.floor(referenciaTemporal / milesimasXsegundo); // Ejem: referenciaTemporales 47,987 / milesimasXsegundo que son 1000 es = a 47.987 Redondeando 47 segundos // segundo nunca va ser mayor que 59
referenciaTemporal=referenciaTemporal - segundo * milesimasXsegundo; // Ejem: referenciaTemporal es 47,987 - (segundo 47 * milesimasXsegundo que son 1000 = 47,000) = 987 // Aca referenciaTemporal nunca va ser mayor que 999
centesima=Math.floor(referenciaTemporal / milesimasXcentecima); // Ejem: ahora referenciaTemporal es 987 / milesimasXcentecima que son 10 es = a 98.7 redondeando 98 centecimas // centesima nunca va ser mayor que 99
// Condicinales que hacen que todos los numeros tengan siempre dos digitos y no uno if (hora < 10) { hora_txt="0" + hora.toString(); } else { hora_txt=hora.toString(); } if (minuto < 10) { minuto_txt="0" + minuto.toString(); } else { minuto_txt=minuto.toString(); } if (segundo < 10) { segundo_txt="0" + segundo.toString(); } else { segundo_txt=segundo.toString(); } if (centesima < 10) { centesima_txt="0" + centesima.toString(); } else { centesima_txt=centesima.toString(); } // Pasanos todo al campo de texto led_txt.text=hora_txt + " : " + minuto_txt + " : " + segundo_txt + " : " + centesima_txt; } private function iniciarCronometro(e:MouseEvent):void { if (cronometroAndando == false && cronometroPausado == false) { copiaDe_GetTimer=getTimer();// Toma una foto, de las milesimas que han pasado desde el inicio. } else if (cronometroAndando == false && cronometroPausado == true) { copiaDe_GetTimer=getTimer() - milesimasTranscurridas; } temporizador.start(); cronometroAndando=true; } private function pausarCronometro(e:MouseEvent):void { if (cronometroAndando == true) { cronometroAndando=false; cronometroPausado=true; temporizador.stop(); } } private function reiniciarCronometro(e:MouseEvent):void { temporizador.stop(); led_txt.text="00 : 00 : 00 : 00"; milesimasTranscurridas=0; cronometroAndando=false; cronometroPausado=false; } private function fotoGrafiarCronometro(e:MouseEvent):void { temporizador.stop(); } } }
Buen tip!!!, después enseñas el juego que estas haciendo para darle el visto bueno Por:calsonicboo_blog
Este es un trabajo para Jack Bauer Por:Jack_blog
Siempre me he sentido orgulloso de las personas que forman parte de cristalab, cuento de todos ustedes en todas partes, a mi pobre amada ya la tengo harta de tanto hablar de cristalab, pero ni modo, me dio el si cuando le pedi que fuera mi pareja y ahora se aguanta, el por que hablo de ustedes con tal orgullo y con tal insistencia se ve reflejado en este tip de gran nivel, excelente aportacion, excelente trabajo pensante, amigo AXM ¿Te molesta si tomo como referencia tu codigo para poder hacer un cronometro que te registre por ejemplo el tiempo que hiciste entre cada lap? Bueno, es que tengo planeado un cronometro un tanto sofisticado, y la verdad si me das luz verde ya me ahorraste mucho del trabajo, por supuesto que pienso retribuirtelo, solo me gustaria que me permitieras utilizar lo que ya has hecho y si me sale ese cronometro que tengo en mente, despues lo colgamos aqui con los respectivos creditos de cada quien, ¿Dale? De antemano gracias de nuevo AXM Por:Señor Oz_blog
emmm. Dejame pensarlo.. emmmm.
Esta bien, Si. Pero me intriga lo de la retribución... De que tipo es. Especies? Mujeres? Dinero? Por:AXM
AXM :
Esta bien, Si. Pero me intriga lo de la retribución... De que tipo es. Especies? Mujeres? Dinero?
Esto es lo más hermoso que he leído
Definitivamente mis estudiantes aprendieron bien mis lecciones. Estoy orgulloso, no tengo nada más que enseñarles. Por:Freddie
Freddie :
AXM :
Esta bien, Si. Pero me intriga lo de la retribución... De que tipo es. Especies? Mujeres? Dinero?
Esto es lo más hermoso que he leído
Definitivamente mis estudiantes aprendieron bien mis lecciones. Estoy orgulloso, no tengo nada más que enseñarles.
Aprendieron no sólo AS3 avanzado sino a saber caminar en la vida Por:DanielSemper
Freddie :
Esto es lo más hermoso que he leído Definitivamente mis estudiantes aprendieron bien mis lecciones. Estoy orgulloso, no tengo nada más que enseñarles.
Juas, casi me parto cuando lei esto.
DanielSemper :
Aprendieron no sólo AS3 avanzado sino a saber caminar en la vida
Si Daniel, después del curso de AS3 y Flex de Freddie, nos hemos convertido en humanos mas evolucionados. Nos ha dotado de habilidades especiales. Cuidado. Gracias Freddie Por:AXM
Freddie :
Esto es lo más hermoso que he leído Definitivamente mis estudiantes aprendieron bien mis lecciones. Estoy orgulloso, no tengo nada más que enseñarles.
Que bonito trabajo, no sé para que puede servir, pero está muy xulo. Por:Sisco
Muy guapo el tuto, a ver si me pongo ya con el AS 3 Por:[url=http://www.codigovis
Jajajaja, señores, mas seriedad, que se trata de un buen cronometro hecho en action script 3, jajajajaja, me hicieron botanearme un rato. No AXM, no me referia a una retribucion del tipo materialista, no se, algun aporte tambien, no lo se, igual, si deseas una mujer, pues nada mas apunta caracteristicas y la edad, y vere que puedo ofrecerte de mi amplio pero modesto arem. Nota: no estoy seguro si arem lleva h o no, si es que la llevan, ahi me la dispensan Por:Señor Oz_blog
Genial el Cronometro lo unico es que los unos se ven como sietes ajajajajaj Por:jopoipo_blog
Excelente aporte, cada dia me doy cuenta que me falta muchisimo por aprender, yo desarrollo en .net, pero este cronometro esta excelente, lo felicito. Por:andres_blog
muy buena esta pagina, pero quisiera que las preguntas la respondieran de manera mas precisa sobre el dispositivo que se deberia de usar en determinados circuitos.ya que hay personas estudiantes de electronica como mi persona que desconocemos determinamos componentes como el get timer,y te felicito sigue asi. Por:iraima_blog
Errr... iraima_blog. Esto no tiene nada que ver con electrónica. Es una cronómetro hecho en Flash; creo que estás confundiéndote. Por:The Fricky!
exelente aporte! por casualisad sabe alguien crear un cronometro con Actionscript 2.0 mediante los metodos de la clase Date o de otra manera, gracias si es que me pudieron ayudar, sludos. Por:ayax
Hey .. No lo ley por que estoy apurada pero este cronometro me sirve para saber cuanto tiempo duro practicado un sermon Por:no lo lei _blog
Por:XDXDXDXDXD_blog
Muy Bueno. Gracias por dejárnoslo. Por:Inaki_blog
che y algo asi pero al reves, en vez de empezar que vaya pa tras a una fecha XX (no mediante flashvars sino mediante la modif del .fla, asi es mas facilongo q despues me piero) estilo "countdown"?? Por:Loon_blog
jajaja....electrónica...bueno che...se confundio..8-) jajajja buenisimo el tip...aver si me pongo a ver algo de AS3 porque me quede con el 2...jajaja...chau
saludos!
y nos vemos! Por:flaco_games_blog
este cronometro esta muy bien se ve elo hizo un experto en codificacion a mi me sirve de mucho. Por:julio_blog
A mi me sirve para cronometrarme las prácticas de Radio en casa antes de hacerlas en la Universidad... Gracias! Por:Enhea_blog