Te lo podría explicar con mas detalle pero con el código creo que lo verás sencillito: Te pongo mi clase "Semáforo" y luego la clase "Pantalla" (lo mismo que una sección), que es genérica. Normalmente no hace gran cosa. La utilizo para extender de ella, pero por lo menos tiene implementados los métodos de mostrar() y ocultar(). ¿por qué tiene implementado un sistema de eventos al mostrar y ocultar? Pues eso me sirve para poder hacer animaciones con twinings, etc de cada sección y una vez terminado avisamos al semáforo de que esto ha ocurrido...
/** * Esta clase controla la aparición y desaparición de pantallas o secciones. Vínculando estas de manera que solo se puede mostrar una al mismo tiempo * Si se le ordena mostrar una pantalla, primero ocultará la que se mostraba anteriormente esperando su evento "onOcultado", y luego mostrará la nueva * * @author Diego Ponce de León * @version 0.1 */ import net.xleon.utils.Delegate; import com.gskinner.events.GDispatcher; class net.xleon.ui.logica.Semaforo { private var dispatchEvent : Function; public var addEventListener : Function; public var removeEventListener : Function; public var removeAllEventListeners : Function; private var pantallas:Array; public function Semaforo(_pantallas:Array) { GDispatcher.initialize(this); pantallas = new Array(); if(_pantallas){ for(var i:Number=0; i<_pantallas.length; i++){ if(add_pantalla(_pantallas[i]) == false ) trace("Semaforo: no se puede agregar la pantalla "+_pantallas[i].toString()+" mas de una vez"); } } } public function add_pantalla(_pantalla:Object):Boolean{ var pantalla_agregada:Boolean = true; for(var i:Number=0; i<pantallas.length; i++){ if(pantallas[i] == _pantalla) pantalla_agregada = false; } if(pantalla_agregada) pantallas.push(_pantalla); return pantalla_agregada; } public function tracear_pantallas():Void{ trace("===== Pantallas de la aplicación ==============="); for(var i:Number=0; i < pantallas.length; i++){ trace(pantallas[i].toString()+" => mostrandose = "+pantallas[i].mostrandose_ahora); } trace("===== Fin de Pantallas ==============="); } public function mostrar_pantalla(_pantalla:Object):Void{ //trace("mostrando pantalla"); dispatchEvent({type:"onTransicion"}); if(get_mostrandose_ahora()!= null){ get_mostrandose_ahora().removeAllEventListeners(); _pantalla.addEventListener("onMostrado", Delegate.create(this, this.finTransicion)); get_mostrandose_ahora().addEventListener("onOcultado", Delegate.create(_pantalla, _pantalla.mostrar) ); get_mostrandose_ahora().ocultar(); } else { _pantalla.addEventListener("onMostrado", Delegate.create(this, this.finTransicion)); _pantalla.mostrar(); } } private function finTransicion():Void{ dispatchEvent({type:"onFinTransicion"}); } public function ocultar_actual():Void{ get_mostrandose_ahora().removeAllEventListeners(); get_mostrandose_ahora().ocultar(); } public function get_mostrandose_ahora():Object{ for(var i:Number=0; i<pantallas.length; i++){ if(pantallas[i].mostrandose_ahora==true) { return pantallas[i]; } } return null; } public function getPantallas():Array{ return pantallas; } public function toString():String{ return "Semaforo"; } } /** * Clase con las funciones básicas de una pantalla. * Crear vista, mostrar, ocultar * @author Diego Ponce de León * @version 0.1 */ import com.gskinner.events.GDispatcher; //import net.xleon.utils.Delegate; class control.pantallas.Pantalla { private var dispatchEvent : Function; public var addEventListener : Function; public var removeEventListener : Function; public var removeAllEventListeners : Function; private var scope:MovieClip; public var vista:MovieClip; // es una instancia en el escenario de ui.pantallas.Configuracion, aunque diga MovieClip, sirve igual public var vinculacion:String; // nombre de vinculación en la libreria, de la ui que será manejada por esta pantalla public var mostrandose_ahora:Boolean = false; private var se_habia_mostrado:Boolean = false; /* * @scope: el ámbito donde vamos a atachar la pantalla * @vinculacion: el nombre de clip vinculado en la libreria perteneciente a esta pantalla */ public function Pantalla(_scope:MovieClip, _vinculacion:String) { GDispatcher.initialize(this); scope = _scope; vinculacion = _vinculacion; set_ui(); } /* Coloca solo una vez la ui en el scope */ private function set_ui():Void{ vista = scope.attachMovie(vinculacion, vinculacion, scope.getNextHighestDepth(),{_visible:false}); } public function mostrar(terminado:Boolean):Void{ if(terminado) { mostrandose_ahora = true; se_habia_mostrado = true; dispatchEvent({type:"onMostrado"}); //trace("mostrada: "+toString()) return; } vista._visible = true; // Animaciones para mostrar y luego: mostrar(true); // logicamente esto habrá que llamarlo desde otro método o por ejemplo un callback de un twining } public function ocultar(terminado:Boolean):Void{ if(terminado){ vista._visible = false; mostrandose_ahora = false; dispatchEvent({type:"onOcultado"}); //trace("ocultada: "+toString()) return; } // Animaciones para ocultar y luego: ocultar(true); // logicamente esto habrá que llamarlo desde otro método o por ejemplo un callback de un twining } public function toString():String{ return "control.pantallas.Pantalla"; } } > -----Mensaje original----- > De: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] En > nombre de sergio arranz > Enviado el: domingo, 25 de noviembre de 2007 23:37 > Para: Lista dedicada a Actionscript > Asunto: Re: [ASNativos] efecto de carga de secciones > > > Buenas, lo que tengo es parecido a lo que dice xleon, tengo las secciones en la > biblioteca y las cargo con un con un for, todo eso me va bien, pero no entiendo bien lo > de la clase semaforo que me indicas, estoy un poco pez todavia en el tema de las > clases, como bien dices lo veo un poco lioso. > From: [EMAIL PROTECTED]> To: > asnativos@5dms.com> Date: Sun, 25 Nov 2007 23:12:00 +0100> Subject: Re: > [ASNativos] efecto de carga de secciones> > Yo hace mucho lo hacia así. Pero un dia > descubrí que es mucho más facil> incluir todas las secciones en la biblioteca en clips. > Cada sección tiene> los contenidos principales, excepto cosas que pesen mucho, que > precargo al> entrar en la sección. > Luego tengo una clase "semáforo" que controla la > aparición y desaparición de> todas las secciones. Cada sección extiende de una clase > "Sección" que cumple> las funciones básicas. La función "mostrar()" anima la sección > y la> precarga. Cuando esta fase termina manda un evento que es recogido por la> > clase "semáforo" avisando de que ya está cargada y mostrandose. > La clase principal > de la aplicación instancia cada una de las secciones nada> más inicializar y las oculta, > dejándolas preparadas para mostrarse u> ocultarse más adelante.> Parece un lío > todo esto pero es la forma más sencilla que he encontrado a lo> largo de muchos > quebraderos de cabeza.> > > -----Mensaje original-----> > De: asnativos- > [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] En> > nombre de Fede > Rivas> > Enviado el: domingo, 25 de noviembre de 2007 19:54> > Para: Lista > dedicada a Actionscript> > Asunto: Re: [ASNativos] efecto de carga de secciones> > > > > Buenasss. Pues bien, depende un poco de como tengas montadas las> > cosas. > Yo es un efecto que suelo usar, y lo hago de la siguiente forma :> > > > Uso el tipico > swf como "base", en el cual tengo el clip vacío donde> > voy a ir cargando todas las > secciones. Esto lo controla el preloader> > de turno, que en mi caso son un par de > clases y un clip. Solo uso un> > preloader, el cual se encarga de todo, y es el que > controla la carga /> > descarga. Cuando cargo un swf nuevo, el propio preloader, > hace> > desaparecer el anterior. Aqui tienes dos opciones, una hacer una> > > "desaparicion rapida", en plan facil, le metes un tween al alpha> > mismamente, o > bien hacerte una "desaparcion ordenada" donde los> > elementos se marchan > ordenadamente, segun te interese.> > > > Si eliges la opcion dificil, la animacion es > "a mano" y yo tengo por> > norma que dure muy pocos frames ( unos 50 en una peli > de 30fps ),> > suelo colocar un frame etiquetado, para dar un gotoAndPlay directo> > > ahi. De esta forma ( durando pocos frames ), hay una ventaja> > indirecta. Cuando > llamas al loader para cargar la peli nueva, haces> > justamente la descarga, y por > poco que pese la nueva seccion, tardara> > unos segundos en aparecer para "pisar" > la antigua, tiempo mas que> > suficiente para que la animacion de salida terminara. > Por el> > contrario, si la salida es muy lenta, pasa que el loader pisa al swf> > > antiguo con el nuevo, sin haber terminado la desaparicion, pudiendo> > apreciar > claramente el "corte". Es viable, pero mucho mas follonero,> > tener que notificar al > loader del termino de la descarga, para iniciar> > la otra carga.> > > > Bueno, solo > es una idea de planteamiento, pero asi la suelo hacer.> > > > Si tienes un problema > ya mas concreto con algo, nos comentas. :)> > > > Salu2!> > > > Fede.> > > > El > 25/11/2007, a las 14:20, sergio arranz escribió:> > > > >> > > Buenos días lista, os > quería comentar si me podríais indicar un poco> > > como hacer un efecto al cargar > las secciones de una web. El efecto> > > es tipico pero no se como hacerlo: cuando > cargas una sección te> > > aparecen los elementos de esa sección, pero cuando > cargas o pinchas> > > en otro boton para que se abra otra sección los elementos de > la> > > sección anterior desaparecen con un efecto de movimiento u otro, y> > > > una vez desaparecidos los elementos de la sección anterior aparecen> > > los de la > nueva sección. Si me podríais indicar como se puede hacer,> > > o si hay algún > enlace para saber como hacerlo paso por paso os lo> > > agradecería.> > >> > >> > > > Saludos.> > > > _________________________________________________________________> > > > Tecnología, moda, motor, viajes, suscríbete a nuestros boletines> > > para estar > a la última> > >> > > http://newsletters.msn.com/hm/maintenanceeses.asp?L=ES&C=ES&P=WCMaintenan > > > ce&Brand=WL&RU=http%3a%2f%2fmail.live.com> > > --------------------------- > --------------------------> > > ASNativos> > > www.5dms.com> > > > subscripciones/desubscripciones> > > http://asnativos.5dms.com> > > -------------- > ---------------------------------------> > >> > > > > > ----------------------------------- > ------------------> > ASNativos> > www.5dms.com> > > subscripciones/desubscripciones> > http://asnativos.5dms.com> > -------------------- > ---------------------------------> > > > No virus found in this incoming message.> > > Checked by AVG Free Edition.> > Version: 7.5.503 / Virus Database: 269.16.6/1150 - > Release Date:> 24/11/2007 17:58> > > > No virus found in this outgoing message.> > Checked by AVG Free Edition. > Version: 7.5.503 / Virus Database: 269.16.6/1150 - > Release Date: 24/11/2007> 17:58> > > > > -------------------------------------------- > ---------> ASNativos> www.5dms.com> subscripciones/desubscripciones> > http://asnativos.5dms.com> ----------------------------------------------------- > _________________________________________________________________ > Tecnología, moda, motor, viajes, suscríbete a nuestros boletines para estar a la > última > http://newsletters.msn.com/hm/maintenanceeses.asp?L=ES&C=ES&P=WCMaintenan > ce&Brand=WL&RU=http%3a%2f%2fmail.live.com > ----------------------------------------------------- > ASNativos > www.5dms.com > subscripciones/desubscripciones > http://asnativos.5dms.com > ----------------------------------------------------- > > No virus found in this incoming message. > Checked by AVG Free Edition. > Version: 7.5.503 / Virus Database: 269.16.7/1151 - Release Date: 25/11/2007 16:24 > No virus found in this outgoing message. Checked by AVG Free Edition. Version: 7.5.503 / Virus Database: 269.16.7/1151 - Release Date: 25/11/2007 16:24 ----------------------------------------------------- ASNativos www.5dms.com subscripciones/desubscripciones http://asnativos.5dms.com -----------------------------------------------------