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
|