Hace poco tuve la necesidad de tener un fondo que cambiara constantemente, cargando imágenes de una carpeta y haciendo que aparezcan lentamente sobre la anterior en loop constante. Como recién empiezo con esto del AS, preferí hacerlo a mi manera y por mi cuenta, de paso que aprendía el uso de clases. De hecho, ésta es la primera custom class que escribo en mi vida, así que probablemente pueda mejorarse mucho más.
Esta clase toma las imágenes a cargar de un array, donde escribiremos los nombres de los archivos.
Aquí el código:
Código :
package { import flash.display.MovieClip; import flash.display.DisplayObject; import flash.display.Sprite; import flash.display.Loader; import flash.display.LoaderInfo; import flash.events.Event; import flash.events.TimerEvent; import flash.net.*; import fl.transitions.Tween; import fl.transitions.TweenEvent; import fl.transitions.easing.*; import flash.utils.Timer; public class DynamicGallery extends MovieClip { //creamos las variables a usar private var imagesArray:Array; private var index:uint=0; private var container:MovieClip; private var loader:Loader; private var ruta:String="Files/img/"; //para q no escriban la ruta entera public function DynamicGallery(_imgArr:Array):void { imagesArray=_imgArr; //el container va a recibir las imagenes que se carguen container=new MovieClip(); addChildAt(container,0); //lo colocan donde deseen container.x=0; container.y=70; //se crea el loader y un listener que llamara la funcion placeImg cada vez //que el contenido se haya terminado de cargar loader=new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,placeImg); //se carga la primera imagen, para que no aparezca en blanco loader.load(new URLRequest(ruta+imagesArray[0])); //se llama una funcion que cargara las imagenes cada cierto tiempo callTimer(); } //esta funcion crea un timer que llamara cada tres segundos //otra funcion que se encargara de cargar las imagenes private function callTimer():void { var timer:Timer=new Timer(3000); timer.addEventListener(TimerEvent.TIMER,loadItems); timer.start(); } //esta funcion carga las imagenes, notaran que las llama de acuerdo al indice del array //(que se incrementa en cada pasada) private function loadItems(evt:TimerEvent):void { loader.load(new URLRequest(ruta+imagesArray[index])); } //esta funcion es la mas compleja, se llama automáticamente cada vez que ha terminado de cargar //una imagen en el loader. private function placeImg(evt:Event):void { //se pasa el contenido del loader(la imagen) a un display object provisional var tmp:DisplayObject=loader.content; //se "limpia" el loader loader.unload(); //se crea un clip vacío var clip:MovieClip=new MovieClip(); //se pasa el display obj al clip clip.addChild(tmp); //se añade el clip al container container.addChild(clip); //este condicional sirve para no aplicarlo al primer item cargado if(container.numChildren>1) { //se vuelve invisible al clip clip.alpha=0; //se usa un tween para hacerlo visible var tween1:Tween=new Tween(clip,"alpha",Regular.easeIn,0,1,1,true); //listener que llama la funcion kill cuando se acaba el tween tween1.addEventListener(TweenEvent.MOTION_FINISH,kill); } //se incrementa el index index++; //esto resetea el index si se pasa del length del array if(index==imagesArray.length) { index=0; } } //esta función borra el clip que quedó oculto(osea, siempre vamos a tener dos clips //dentro de container) private function kill(evt:TweenEvent):void { container.removeChildAt(0); } } }
Saludos
¿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.
Sólo un detalle de tu timer de 3 segundos que no lo veo necesario, el load lo podías mover al final de tu función placeImg, así cuando termine de cargar la imagen cargará la siguiente.
Y espero que este usando como IDE para el código el FlashDevelop
Esperamos más tips tuyos.
Por nazcaline el 09 de Enero de 2009
No entendi lo del timer...yo lo uso porque quiero que cargue la imagen cada 3 segundos, y el tween del alpha es solo de 1 segundo.
Ah, he mejorado la clase porque le he añadido un efecto de desaturación, es decir primero aparece lentamente la imagen pero en balnco y negro, luego hace otro tween hacia el color original.(aumente el timer a 5 segundos) ¿Tendría que hacer otro tip, o modificar éste? y ¿cómo modifico este tip? (no veo una boton de editar).
:
eso ultimo si no entendi nada...
sí, soy n00b pes...
Por roberto el 26 de Enero de 2009
luego con poner
"import clases.imagenes; "
en las acciones del frame0, ya se coloca la clase?
Por byweb el 21 de Febrero de 2009
Por Said el 09 de Julio de 2009
1037: Los paquetes no se pueden anidar.
Por ruben el 05 de Enero de 2010
1037: Los paquetes no se pueden anidar.
Por Raskh el 23 de Marzo de 2010
además, me ayuda en un par de cosas que no me había planteado bien!!
Por lucho el 02 de Diciembre de 2010
la idea es que le pases un array de esta manera
var Misfotos: Array = new Array ("foto (1).jpg","foto (2).jpg","foto (3).jpg","foto (4).jpg")
import DynamicGallery;
var galeria:DynamicGallery = new DynamicGallery(Misfotos);
addChild(galeria);
Por xenon el 23 de Enero de 2011
var Misfotos: Array = new Array ("foto (1).jpg","foto (2).jpg","foto (3).jpg","foto (4).jpg")
import DynamicGallery;
var galeria:DynamicGallery = new DynamicGallery(Misfotos);
addChild(galeria);
al codigo que hay al principio, es que soy principiante y me lio.
Por Juan el 24 de Febrero de 2014