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
Código :
package { import flash.display.*; import flash.events.*; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.utils.Timer; import flash.utils.getTimer; 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(); } } }
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Zguillez el 13 de Octubre de 2007
Por Kinduff el 13 de Octubre de 2007
Por jripper el 14 de Octubre de 2007
Por calsonicboo el 14 de Octubre de 2007
Por Jack el 14 de Octubre de 2007
Por Señor Oz el 15 de Octubre de 2007
Por AXM el 15 de Octubre de 2007
Esta bien, Si. Pero me intriga lo de la retribución... De que tipo es. Especies? Mujeres? Dinero?
Por Freddie el 15 de Octubre de 2007
AXM :
Definitivamente mis estudiantes aprendieron bien mis lecciones. Estoy orgulloso, no tengo nada más que enseñarles.
Por DanielSemper el 15 de Octubre de 2007
Freddie :
AXM :
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 AXM el 16 de Octubre de 2007
Freddie :
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 :
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 Bleend el 16 de Octubre de 2007
Freddie :
Definitivamente mis estudiantes aprendieron bien mis lecciones. Estoy orgulloso, no tengo nada más que enseñarles.
Por Sisco el 16 de Octubre de 2007
Por [url=http://www.codi el 17 de Octubre de 2007
Por Señor Oz el 17 de Octubre de 2007
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 jopoipo el 19 de Octubre de 2007
Por andres el 29 de Octubre de 2007
Por iraima el 17 de Noviembre de 2007
Por The Fricky! el 17 de Noviembre de 2007
Por ayax el 28 de Noviembre de 2007
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 no lo lei el 12 de Diciembre de 2007
Por XDXDXDXDXD el 12 de Diciembre de 2007
Por Inaki el 12 de Diciembre de 2007
Por Loon el 05 de Enero de 2008
Por flaco_games el 30 de Enero de 2008
saludos!
y nos vemos!
Por julio el 27 de Febrero de 2008
Por Enhea el 10 de Marzo de 2008
Gracias!
Por jpcw el 10 de Marzo de 2008
Por Javier el 03 de Junio de 2008
Gracias
Javier
Por pdjazr el 17 de Junio de 2008
gracias
al compilar me da error.
Por fernando el 28 de Agosto de 2008
hasi sabria cuanto tardan los repartidores en regresar solo tendria que adaptarle algo para incluir el numero de pedido al cronometrto y aci poder abrir tiempo por reparto mi correo [email protected]
Por Rodrigo Castillo el 08 de Octubre de 2008
Suerte y buen dia!
Saludos
ROC@S
Mexico
Por blackholeman el 31 de Octubre de 2008
Por reggie el 02 de Noviembre de 2008
como le haría para q el cronometro fuera en retroceso???
Por Stranyer el 19 de Febrero de 2009
"Damn it!!" cada 5 min, igual que la serie.
Buenisimo man, te luciste. Gracias!
Por ANAIS Y MARGIORY el 27 de Abril de 2009
HUBIERA SIDO DEL MUNDO
Por pablo el 07 de Julio de 2009
1120: Acceso a una propiedad led_txt no definida.
1061: Llamada a un método addEventListener posiblemente no definido mediante una referencia con tipo estático Class.
1061: Llamada a un método addEventListener posiblemente no definido mediante una referencia con tipo estático Class.
1061: Llamada a un método addEventListener posiblemente no definido mediante una referencia con tipo estático Class.
1061: Llamada a un método addEventListener posiblemente no definido mediante una referencia con tipo estático Class.
1120: Acceso a una propiedad led_txt no definida.
1120: Acceso a una propiedad led_txt no definida.
de codigo le puse
var aux:Cronometro;
aux = new Cronometro();
gracias de antemano
Por nico69 el 13 de Julio de 2009
Modifique el codigo para que un solo boton sea play y pausa y todo bien.
Luego lo que quiero hacer es que si el cronometro es detenido en cierto tiempo salga un cartel y sino otro, que se encuentra en el MC msj fotograma 2 y 3. Hasta ahí todo bien. Junto con dichos mensajes hay un boton de "Volver a intentar" con el nombre de instancia botonReiniciar que se encuentra dentro del MC msj, lo que intenta hacer es reiniciar el cronometro y llevar la cabeza lectora al fotograma 1, pero no lo hace.
Me tira el siguiente error:
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Minuto$iinit()
El código se encuentra en un archivo Minuto.as y es el siguiente:
package {
//import flash.display.Sprite;
import flash.display.*;
import flash.events.*;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.Timer;
import flash.utils.getTimer;
public class Minuto 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 Minuto() {
reloj.led_txt.text="0:00:00";
temporizador.addEventListener(TimerEvent.TIMER,tickTack);
msj.botonIniciar.addEventListener(MouseEvent.CLICK,iniciarYpausar);
msj.botonReiniciar.addEventListener(MouseEvent.CLICK,reiniciarCronometro);
}
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=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
reloj.led_txt.text=minuto_txt + ":" + segundo_txt + ":" + centesima_txt;
}
private function iniciarYpausar(e:MouseEvent):void {
if (cronometroAndando == false) {
iniciarCronometro(e);
} else if (cronometroAndando == true) {
pausarCronometro(e);
}
}
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();
if (reloj.led_txt.text == "1:00:00") {
msj.gotoAndStop(2);
} else {
msj.gotoAndStop(3);
}
}
}
private function reiniciarCronometro(e:MouseEvent):void {
temporizador.stop();
reloj.led_txt.text="0:00:00";
milesimasTranscurridas=0;
cronometroAndando=false;
cronometroPausado=false;
msj.gotoAndStop(1);
}
}
}
Por claudia el 28 de Julio de 2009
Por Manolito_BCN el 27 de Agosto de 2009
Pero algo no me funciona.
Instancio la clase en el fla asi:
var c:Cronometro = new Cronometro();
y me retorna:
1046: No se encontró el tipo o no es una constante en tiempo de compilación: Cronometro.
¿que pasa? ¿que hago mal?
Por eracongo el 19 de Abril de 2010
Soy un absoluto ignorante de programación.
Vi tu cronómetro y, más allá de su aspecto muy cuidado, me pareció excelente pàra utilizarlo en una película, pero encuentro un problema al transcribirlo y es que el debug me dice que los paquetes no se pueden anidar.
Además, quisiera preguntarte cómo se podría hacer para que el timer estuviera en varias escenas y cuando se pase de una a otra continúe contando el tiempo desde el valor de la anterior escena sin necesidad de reiniciarlo en cada una de ellas (o tener esa opción pero utilizarla sólo cuando apetezca).
Desde ya muchas gracias, y voy a ir consiguiendo alguna chic.. ejem, alguna retribución, jajajajaj
_________________
eracongo
Por ema el 10 de Mayo de 2010
Por JordiMataró el 29 de Mayo de 2010
Mi pregunta es de novato absoluto (y no del todo relacionada con tu cronómetro).
Como consigues "lincar" los botones del FLA? Pasa de mi cada vez que intento un addEventListener en un botón de dentro del Clip (y debo reconvertirlo todo en MovieClip y es más co**zo).
-------
'eracongo', mi recomendación (desde mi ignorancia), seria que dejaras el cronómetro (addChild) en el marco/clase dónde cargues los escenarios. Entonces lo escondes y/o muestras dependiendo de tu necesidad.
Por otro lado, incluyes 2 nuevos métodos públicos para la pausa/reinicio del cronómetro. Así podrás pararlo y reiniciarlo a tu gusto desde la clase dónde cargas todos los clips.
Como dices que no sabes de código, te pongo mi propuesta (Sólo añádelo)
public function pausoCronometro():void
{
if (cronometroAndando == true) {
cronometroAndando=false;
cronometroPausado=true;
temporizador.stop();
}
}
publicfunction inicioCronometro():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;
}
Vale lo suyo sería que las funciones privadas de los eventos, llamaran a éstas 2 funciones; o que las 4 llamaran a otras 2 funciones privadas con éste código (dependiendo de tus gustos y "técnica") para no repetir todo el código, pero con sólo pegar ésto, no te complicarás la vida.
Nota que los nombres de las funciones a llamar no es el mismo!
Saludos
Por Jorge Tovas el 07 de Febrero de 2011
Por MaxiiSan20 el 11 de Abril de 2011
Por Eduardo el 23 de Julio de 2011
Porque cuando copio y pego no me anda.
Otra pregunta:
Se puede utilizar estre cronómetro en diapositivas de powerpoint?
Se le puede quitar la parte de los milisegundos? Cómo?
Muchas Gracias!
Por Arturo el 06 de Septiembre de 2011
Por Carlos el 21 de Septiembre de 2011
function showClock1(event:Event):void{
addEventListener(Event.ENTER_FRAME, showClock);
//pasar los milisegundos
var timePassed:int = getTimer()-startTime;
//calcular minutos y segundos
var seconds:int = Math.floor(timePassed/1000);
var minutes:int = Math.floor(seconds/60);
seconds -= minutes*60;
//convertir el reloj a una cadena
var timeString:String = minutes + ":" + String(seconds+100).substr(1,2);
//actualizar el campo de texto
timeDisplay.text = timeString;
}
lo demas lo hacen los diseñadores todo esa marikerita q tu pones
Por Freddy el 18 de Noviembre de 2011
Por nNMn el 17 de Febrero de 2012
Por silvioguerrero el 19 de Julio de 2012
Por Roberto Goyes el 14 de Marzo de 2019