no sé bien donde ubicar este problema porque creo que es más problema de rendimiento de Flash que de programación...
Me explico,
tengo un código que clickando un botón abre un popup. A parte de cerrarlo con el botón de cerrar, he incluido la típica shape con alfa debajo para bloquear lo que hay detrás del popup mientras esté abierto.
El pseudo-código es el siguiente
Código ActionScript :
var panel: Shape; var btn_open:SimpleButton; //Botón que al clickar abre el popup var popup:MovieClip; //Popup genérico btn_open.addEventListener(mouseEvent.CLICK, showPopup); function showPopup(e:MouseEvent):void { setPanel(); //mostrar popup //.. } //.... popup.btn_close.addEventListener(mouseEvent.CLICK,close);//Botón dentro del popup para cerrarlo function close(e:MouseEvent):void{ //Cerrar popup closePanel(); } public static function setPanel():void { var myShape:Shape; if(panel==null){ myShape= new Shape(); myShape.name='panel'; myShape.graphics.beginFill(0x000000,0.3); myShape.graphics.drawRect(0, 0, stage.width, stage.height); myShape.graphics.endFill(); panel=myShape; } if(!this.contains(panel)){ this.addChildAt(panel,popup_index-1); //popup_index es el índice del popup, el panel ha de quedar siempre por debajo } } function closePanel():void{ this.removeChild(panel); }
El código anterior funciona perfectamente pero he decidido incluir un pequeño cambio, quiero que si se clicka fuera del popup éste también se cierre. Para éllo he cambiado el tipo de componente panel de Shape a MovieClip para asignarle un listener que atienda al CLICK del mouse y entonces cierre el popup...
Cambios:
Código ActionScript :
var panel: MovieClip; var btn_open:SimpleButton; //Botón que al clickar abre el popup var popup:MovieClip; //Popup genérico btn_open.addEventListener(mouseEvent.CLICK, showPopup); function showPopup(e:MouseEvent):void { setPanel(); //mostrar popup //.. } //.... popup.btn_close.addEventListener(mouseEvent.CLICK,close);//Botón dentro del popup para cerrarlo function close(e:MouseEvent=null):void{ //Cerrar popup closePanel(); } public static function setPanel():void { var myShape:Shape; if(panel==null){ myShape= new Shape(); myShape.graphics.beginFill(0x000000,0.3); myShape.graphics.drawRect(0, 0, stage.width, stage.height); myShape.graphics.endFill(); panel=new MovieClip(); panel.name='panel'; if(!panel.contains(myShape)) panel.addChild(myShape); if(!panel.hasEventListener(mouseEvent.CLICK)) panel.addEventListener(mouseEvent.CLICK, onReleasePanel); } if(!this.contains(panel)){ this.addChildAt(panel,popup_index-1); //popup_index es el índice del popup, el panel ha de quedar siempre por debajo } } function closePanel():void{ this.removeChild(panel); } function onReleasePanel(e:MouseEvent):void{ close(); //Cerrar popup+panel }
El segundo código también es funcional, pero mi duda viene ahora. Si abro y cierro sucesivamente un popup, con el segundo método el rendimiento baja bastante del orden de 12 frames por segundo.... Lo sé porque tengo un indicador que me lo marca y haciendo lo mismo con el primer método no me sucede, oscila pero se recupera rápido.
Simplemente he cambiado el tipo de displayObject porque con una Shape no puedo detectar los eventos de CLICK. No entiendo por qué penaliza tanto...Y no me lo puedo permitir porque la pérdida se incrementa, realentizando el funcionamiento global.
Por favor, ayuda

Gracias de antemano.