Jue 22 Feb 2007
Clase PrecargaSerie actionscript 2.0
Posted by Alex Sánchez under Flash , Actionscript , OOP[5] Comments
Soy la leche. Hago una clase que puede ser útil para la humanidad, y la tengo dos años y medio cogiendo polvo, y sin apenas usar en plan gollum ( tesoooro) en vez de soltarla, hasta que casi queda obsoleta. Así que, para que la mejoréis y para que la disfrutéis, por aquí suelto esta clase antes de que no la use ni yo.
Es una Clase que maneja precargas en serie en Actionscript 2.0, está implementada con LoadMovie para permitir cargar sonidos y demás. Es útil en galerías de imágenes donde las cargas en paralelo no son tan útiles porque hace falta ir mostrando el contenido según va cargando, en el orden de carga. Usa modelo de despachado de eventos, con lo que es muy fácil integrarla con otras clases.
Actionscript:
-
-
import com.gskinner.events.GDispatcher;
-
import mx.utils.Delegate;
-
/**
-
* @author Alejandro Sánchez Marcos
-
* http://www.electroduendes.com/
-
* @version 1.1
-
* @usage Clase para cargar Jpgs o swfs en un contenedor en serie (una detrás
-
* de otra). Suele ser útil para galerías de imágenes.
-
*
-
* listeners:
-
* - onLoadProgress; devuelve un objeto del tipo:
-
* {type:"onLoadProgress", mc:MovieClip, progress:Number, total:Number, percent:Number};
-
*
-
* - onLoadActualStart; devuelve un objeto del tipo:
-
* {type:"onLoadActualStart", mc:MovieClip}
-
*
-
* - onLoadActualComplete; devuelve un objeto del tipo:
-
* {type:"onLoadActualComplete", mc:MovieClip}
-
*
-
* - onLoadAllComplete; devuelve un objeto del tipo:
-
* {type:"onLoadAllComplete"}
-
*
-
* <code>
-
* import com.electroduendes.precarga.PrecargaSerie;
-
* import mx.utils.Delegate;
-
*
-
* var precarga:PrecargaSerie = new PrecargaSerie();
-
* var urls:Array = new Array("1.jpg", "2.jpg", "3.jpg", "4.jpg");
-
* var clips:Array = new Array(_root.uno,
-
* _root.dos, _root.tres, _root.cuatro);
-
* precarga.addEventListener("onLoadProgress",
-
* Delegate.create(this, progreso));
-
* precarga.addEventListener("onLoadActualComplete",
-
* Delegate.create(this, fincarga));
-
* precarga.addEventListener("onLoadAllComplete",
-
* Delegate.create(this, fintodo));
-
* precarga.addEventListener("onLoadActualStart",
-
* Delegate.create(this, inicioCarga));
-
* precarga.loadClips(urls, clips);
-
*
-
* function progreso(obj) {
-
* trace("progreso despachado para mc "+obj.mc+ " al : "+obj.percent+"%");
-
* }
-
* function inicioCarga(obj){
-
* trace("inicio de carga para el mc"+obj.mc);
-
* }
-
* function fincarga(obj) {
-
* trace("fincarga despachada para movieclip: "+obj.mc);
-
* }
-
*
-
* function fintodo() {
-
* trace("fintodo despachado");
-
* }
-
* </code>
-
*/
-
class com.electroduendes.precarga.PrecargaSerie {
-
-
private var numCargados:Number = 0;
-
// número de objetos que ya están cargados
-
private var actualProgress:Number = 0;
-
// almacena el progreso de carga
-
private var actualTotal:Number = 0;
-
private var actualPercent:Number = 0;
-
private var actualTarget:MovieClip = null;
-
private var urlArray : Array;
-
private var targetArray : Array;
-
private var interval:Number = 0;
-
var dispatchEvent:Function;
-
var addEventListener:Function;
-
var removeEventListener:Function;
-
function PrecargaSerie(){
-
GDispatcher.initialize(this);
-
}
-
/*
-
* inicia el proceso de carga
-
* @param urlArray el arrray de películas a cargar
-
* @param targetArray el array de contenedores (movieclips)
-
*/
-
function loadClips(urlArray:Array, targetArray:Array, type:String) {
-
-
this.urlArray = urlArray;
-
this.targetArray = targetArray;
-
load();
-
}
-
/**
-
* efectua el loadMovie.
-
* se va a ejecutar 'n veces' tantas como numCargados.
-
*/
-
private function load():Void {
-
targetArray[numCargados].loadMovie(urlArray[numCargados]);
-
// con el setInterval, nos aseguramos de que actualProgress sea> 0
-
// guardamos la referencia actual en el atributo actualTarget
-
actualTarget = targetArray[numCargados];
-
interval = setInterval(Delegate.create(this, loadStart), 50);
-
}
-
/**
-
* permite saber si la carga está iniciada
-
* se usa porque la carga no devuelve 0 hasta que no se comienza a cargar
-
*/
-
private function loadStart():Void {
-
actualProgress = targetArray[numCargados].getBytesLoaded();
-
// si ya ha empezado a cargar...
-
if (actualProgress>=0) {
-
// limpiamos esta funcion
-
clearInterval(interval);
-
onLoadActualStart();
-
// con esto conseguimos que actualProgress siempre esté actualizado
-
interval = setInterval(Delegate.create(this,onLoadProgress), 50);
-
}
-
}
-
/**
-
* permite escuchar el porcentaje de la carga
-
* actualiza las propiedades tales como actualProgress, actualPercent.
-
*/
-
private function onLoadProgress():Void {
-
actualProgress = actualTarget.getBytesLoaded();
-
actualTotal = actualTarget.getBytesTotal();
-
actualPercent = Math.round((actualProgress*100)/actualTotal);
-
-
var eventObj:Object = { type:"onLoadProgress",
-
mc:MovieClip,
-
progress:Number,
-
total:Number,
-
percent:Number
-
};
-
eventObj.mc = actualTarget;
-
eventObj.progress = actualProgress;
-
eventObj.total = actualTotal;
-
eventObj.percent = actualPercent;
-
-
//despacho evento para los preloaders
-
dispatchEvent(eventObj);
-
if (actualPercent>=100) {
-
clearInterval(interval);
-
actualProgress = 0;
-
numCargados++;
-
onLoadActualComplete(actualTarget);
-
if (numCargados<targetArray.length) {
-
load();
-
} else {
-
//acabamos!
-
onLoadAllComplete();
-
}
-
}
-
}
-
/**
-
* función que se ejecutará cuando empiece la precarga de
-
* algún objeto
-
* @param ref
-
* una referencia del objeto que se ha cargado
-
*/
-
public function onLoadActualStart():Void {
-
var eventObj:Object = {type:"onLoadActualStart", mc:MovieClip};
-
eventObj.mc = actualTarget;
-
dispatchEvent(eventObj);
-
}
-
/**
-
*
-
* @usage función que se ejecutará cuando termine la precarga de
-
* algún objeto
-
* @param ref
-
* una referencia del objeto que se ha cargado
-
*/
-
private function onLoadActualComplete(ref:Object):Void {
-
var eventObj:Object = {type:"onLoadActualComplete", mc:Object};
-
//despacho evento
-
eventObj.mc = actualTarget;
-
dispatchEvent(eventObj);
-
}
-
/**
-
*
-
* @usage función que se ejecutará cuando termine la precarga de
-
* de el último objeto a cargar
-
*/
-
private function onLoadAllComplete():Void {
-
var eventObj:Object = {type:"onLoadAllComplete"};
-
//despacho evento
-
dispatchEvent(eventObj);
-
}
-
/**
-
* @usage getter target array
-
* los contenidos
-
* @return un array de clips
-
*/
-
public function getTargetArray():Array {
-
return targetArray.slice();
-
}
-
}
-
-

