kadazuro.com
 TutorialesPreloader/Precarga v.FL5/tiempo restante de carga y tasa de transferencia
 
por: kadazuro
|ver demostración |bajar el zip |
imprimir este documento
 
páginas: [0] [1] [2] [3] 

b)Mostrar los el tiempo restante de carga y la tasa de transferencia

Para este ejemplo se requiere paciencia para tratar de entender como funciona mi cerebro ya que está hecho a base de maña/lógica, talvez la forma no sea la correcta o habrán programadores que lo hagan distinto pero lo más importante es que este también funciona.

Como no me alcanzaba nuestro campo de texto "output" par desplegar " tiempo restante aproximadamente: tantos minutos:segundos a tanta tasa por segundos" lo que hice fué poner texto entre output y la barra con la leyenda " tiempo restante aproximado:" para así sólo ponerle a output el tiempo y la tasa de transferencia.

Lógica:
Voy a a revisar constantemente cuantos bytes se han cargado para así tener la tasa de transferencia por segundos, es decir voy a usar getTimer y lo asigno a una variable, veo cuandos bytes se han cargado y los divido entre el tiempo que llevamos( esta es la tasa de transferencia), una vez que tengo la tasa de transferencia tengo que saber cuanto tiempo me queda para eso le resto al total de bytes los que llevo y se los divido por la tasa de transferencia que tengo en ese momento, eso me dará los segundos; pero si son más de 60 segundos? entonces a los segundos que tengo tengo que dividirlos entre 60 para ver cuantos minutos; pero si son más de 60 minutos? le hacemos lo mismo a los minutos, el resto son segundos, sin tomar en cuenta que ocupamos el porcentaje pero eso es para la barra y a estas alturas ya deber ser del conocimiento público como lo hacemos.

Si hasta aquí ya tienes el estómago revuelto tómate un descanso, yo te espero; o si crees que es difícil entenderlo piensa que explicarlo lo es aún más porque de hecho lo es.

Bueno a lo que vinimos:

El total de bytes de la movie principal

onClipEvent (load) {
  b_total=_root.getBytesTotal();
}

Ahora en el evento enterFrame es donde ocurre todo lo interesante, primero cuantos bytes hemos cargado , si la movie está cargada le hago play en la etiqueta inicio.

onClipEvent (enterFrame){
  b_loaded=_root.getBytesLoaded();
  if(b_loaded >= b_total){
    _root.gotoAndPlay("inicio");
  }

Si no se ha cargado sacamos el porcentaje para la barra y se le aplicamos la escala x para salir de ella de una vez

porcentaje=(b_loaded/b_total)*100;
barra._xscale= porcentaje;

ahora, primero que todo necesitamos saber cuanto tiempo ha pasado, para eso usamos getTimer, pero como getTimer devuelve milisegundos, al monto de getTimer lo dividimos entre 1000

time=getTimer()/1000;

Sacamos la tasa de transferencia restando los bytes que tenemos entre el tiempo que llevamos, vamos redondeando para no tener problemas después

bps=Math.round(b_loaded/time);

Para saber cuantos bytes nos faltan, restamos el total de bytes a los que tenemos hasta ahora.

bytes_left= b_total-new_bytes;

Los segundos que nos faltan sería los bytes que no faltan entre la tasa de transferencia. Aquí redondeamos hacia arriba para que justo después de ver que falta 1 segundo la movie empieza; de lo contrario si se ve que faltan cero segundos porqué no empieza la movie?

seg_left= Math.ceil(bytes_left/bps);

Ok, y eso cuántos minutos son?, pues lo dividimos entre 60; redondeado hacia abajo ya que si tenemos 45 segundos, todos sabemos que no es un minuto pero 45/60 redondeado es 1, y no nos sirve.

min_left= Math.floor(seg_left/60);

Tenemos los minutos, pero que pasa si es más de una hora lo que tenemos que esperar? ( yo no esperaría tanto ); el fin es que sacamos las horas diviendo minutos entre 60, redondeado para abajo también

hrs_left=Math.floor(min_left/60);

Entonces las horas las sacamos de los minutos tenemos que saber cuántos minutos nos quedan. Pues bien sólo se los restas

min_left-=(hrs_left*60);

Osea entoces que ahora tengo que restarle las horas y los minutos a los segundos que teníamos al principio, horas por 60 nos quedan minutos, esto mas los minutos y esto otro por 60, tenemos los segundos que quedan.

seg_left-=((hrs_left * 60) + min_left) * 60;;

Si las horas son cero o menores que diez cómo hago para que se vea así 00, pues revisamos si el largo de hora, minutos, o segundos el 1 ( esto es menor que 10 ), si es así que le arrime un cero, sino que lo deje igual.

(length(hrs_left) == 1)?(hrs_left="0"+hrs_left):0;

minutos

(length(min_left) == 1)?(min_left="0"+min_left):0;

lo mismo va para los segundos.

(length(seg_left) == 1)?(seg_left="0"+seg_left):0;

Calculamos los kbps en una variable temporal ( por ahora ), dividiendo los bps entre 1024

kbps_temp= bps/1024;

Ahora formateamos los kbps para que nos muestren un decimal.

kbps= Math.floor(kbps_temp*10)/10;

al multiplicar por lo diez rendondeando y luego diviendo entre diez, obtendremos lo que buscamos
ejemplo:

tengo 25452 bytes, entre 1024
me da 24.855 (kbps_temp)
lo multiplico por diez me quedan.
248.55,
redondeado
248
ahora entre diez
24.8

Queremos que el textfied output nos muestre esto:

cant_horas : cant_minutos : cant_segundos seg. a cant_kpbs.cant_bps kbps

osea a los montos les tenemos que meter el ":"de los minutos el ":" de los segundos, luego el "seg. a" y el "kbps" para que se vea, por ejemplo:

"00:01:23 seg. a 5.2kbps";

esto lo hacemos así.

output= hrs_left+":" + min_left +":"+seg_left+"seg. a "+ kbps + "kbps";

Todo junto:

onClipEvent (load) {
  b_total=_root.getBytesTotal();
}
onClipEvent (enterFrame){
  b_loaded=_root.getBytesLoaded();
  if(b_loaded >= b_total){
    _root.gotoAndPlay("inicio");
  }else{
    porcentaje=(b_loaded/b_total)*100;
    barra._xscale=porcentaje;
    time=getTimer()/1000;
    bps=Math.round(b_loaded/time);
    bytes_left= b_total-b_loaded;
    seg_left= Math.ceil(bytes_left/bps);
    min_left= Math.floor(seg_left/60);
    hrs_left=Math.floor(min_left/60);
    min_left-=(hrs_left*60);
    seg_left-=((hrs_left * 60) + min_left) * 60;
    (length(hrs_left) == 1)?(hrs_left="0"+hrs_left):0;
    (length(min_left) == 1)?(min_left="0"+min_left):0;
    (length(seg_left) == 1)?(seg_left="0"+seg_left):0;
    kbps= (Math.floor((bps/1024)*10))/10;
   output= hrs_left+":" + min_left +":"+seg_left+"seg. a "+ kbps +"kbps";
  }
}

ver ejemplo

espero te sea de ayuda :)

bugs via email

 
regresar
{diccionario}
 

Historial:

  • agosto18,2001 se cambia método para dar formato con un decimal a los kbps.
  • mayo12,2001 se publica este documento