Es la segunda vez que escribo en el foro (espero tener más acogida q la primera q no tuve ninguna respuesta
Dentro de cada clase p.e hay una serie de componentes que actuan como botones (pero son Mc). Para eventos de mouse como "over" tengo unas funciones detectoras de evento dentro de la misma clase. Estas funciones sí que funcionan correctamente, pero la función que atiende al click del mouse no. Mejor dicho, no es que no funcione sino que cuando las instrucciones no son relativas a la linea de tiempo (p.e. abrir página externa, abrir archivo pdf...etc) no hay ningún problema pero cuando quiero acceder a la linea de tiempo desde la clase para cambiar de frame me es imposible. La idea es simple, al pulsar sobre un componente de la clase quiero pasar de un frame a otro....Ahora, a modo provisional lo estoy haciendo pasándole una Function (declarada en la linea de tiempo) y desplazandose desde fuera de la clase, pero sinceramente no es lo que busco.
Sé que es problable que el código se pueda optimizar y ahorrar variables (con otros métodos tenia problemas) ahora mismo no es lo q me preocupa sino lo que he comentado anteriormente. COn mirar lo que he indicado en rojo suficiente.
Gracias por adelantado!!
El código (de una de las clases...) en versión resumida sería el siguiente:
[i]
package myAs{
/*________________Import de las clases necesarias____________*/
[..]
import myAs.GlobalVars;
/*____________________________________________________________*/
public class NavigationBar extends Sprite{
/*Static Vars*/
public static const TEORIA:Number= 0;
public static const EJERCICIOS:Number= 1;
public static const ACTIVIDADES:Number= 2;
public static const USUARIO:Number= 3;
/*__________________Declaración de variables__________________*/
private var urlFile :String = "Data/ES/navigationBar.xml";//Asigno la url que se va a cargar
private var datos :XML; //Objeto contenedor del XML
private var sectionOn:Number; //Variable que nos indica cual es la sección activa ("over")
private var nodeElementArray:Array;//En este array guardamos los datos de los nodos <element>
private var navigationItemArray:Array; //En este array guardamos los objetos 'NavigationBarItem'
private var changeStateArray:Array; //Array de booleanos q nos indica si el botón [i] puede cambiar o no su estado
var action:Function;
/*_____Constructor de la clase____________________________*/
function NavigationBar(myAction:Function){
action=myAction;
[...]
LoadData();
}
/*FUNCIÓN: Se encarga de carga el XML externo que contiene los atributos
de los botones de la barra de navegación*/
private function LoadData():void{
//1. Creamos objeto cargador
var loader:URLLoader=new URLLoader();
//2. Añadimos Listeners
loader.addEventListener(Event.COMPLETE,Loaded);
loader.addEventListener(IOErrorEvent.IO_ERROR,Failed);
//3. Cargar petición (creamos obj. que contendrá la petición)
loader.load(new URLRequest(urlFile));
}
/*FUNCIÓN: Se encarga de lanzar mensage de error en caso de fallo en la
carga.
*/
private function Failed(e:IOErrorEvent):void {
trace("Error loading XML file: " + e);
}
/*FUNCIÓN: Función que se ejecuta cuando se completa la descarga.
*/
private function Loaded(e:Event):void {
//1.Almacenamos los datos del XML
datos = new XML(e.target.data);
//2. Almacenar/montar los datos.
Assemble();
//3. Crear obj/Mostrar datos.
Display();
}
/*FUNCIÓN: Función q almacena los atributos/propiedades de cada <element> del XML.
*/
private function Assemble():void{
//0.1. Contabilizar el número de nodos <element>
var nElement:Number= datos.elements.element.length();
//0.2. Variable auxiliar para almacenar los atributos/propiedades de cada nodo <element>
var nodeElement:Object;
//0.3. Crear 'nodeElementArray'
nodeElementArray=new Array();
//1. Recorremos los nodos <element>
for(var i:uint=0; i<nElement; i++)
{
//1.1. Creamos objeto auxiliar
nodeElement=new Object();
nodeElement.id=datos.elements.element[i].@id;
[...]
nodeElementArray.push({id:nodeElement.id,posX:nodeElement.posX,posY:nodeElement.posY,title:nodeElement.title,destination:nodeElement.destination});
}
}
/*FUNCIÓN: Creamos cada uno de los objetos (botones) q compondrán la barra de navegación.
*/
private function Display():void{
//0.1. Miramos la longitud del vector que almacena los datos
var nElements:Number=Number(nodeElementArray.length);
//0.2. Creamos el Array que almacena los 'NavigationBarItem'
navigationItemArray=new Array();
//1. Recorremos el vector de datos
for(var k:uint=0; k<nElements; k++)
{
//1.1. Añadimos un objeto 'NavigationBarItem' al vector
navigationItemArray.push(new NavigationBarItem);
//1.2. Posicionamos el objeto
navigationItemArray[k].x=nodeElementArray[k].posX;
navigationItemArray[k].y=nodeElementArray[k].posY;
//1.3. Añadimos texto al botón
navigationItemArray[k].label_txt.text=nodeElementArray[k].title;
//1.4. Configuramos el objeto
navigationItemArray[k].buttonMode=true; //Propiedad q permite q cambie el cursor (modoBotón-mano) sobre el MovieClip
navigationItemArray[k].mouseChildren=false;//Propiedad q permite que cambie el cursor (modoBotón-mano) también sobre el texto
//1.5. Almacenamos atributos/props en el propio objeto
navigationItemArray[k].id=Number(nodeElementArray[k].id);
[..]
//1.6. Asignamos registramos funciones detectoras de eventos
navigationItemArray[k].addEventListener(MouseEvent.CLICK, action);-------->AQUÍ es donde tengo el PROBLEMA!!
navigationItemArray[k].addEventListener(MouseEvent.MOUSE_OVER, Over);
navigationItemArray[k].addEventListener(MouseEvent.MOUSE_OUT, Out);
//1.7. Añadimos a la lista de visualización
addChild(navigationItemArray[k]);
}
//Mostrar activo (teoria por defecto)
SetSectionOn(GlobalVars.getInstance().section);
UpdateSectionOn();
}//end 'Display()'
/*FUNCIONES: Func. detectoras de eventos
*/
private function Over(e:MouseEvent):void{
if(changeStateArray[e.currentTarget.id]==true)
e.currentTarget.gotoAndPlay("over"); //contiene una referencia al objeto que está procesando en ese
//momento el objeto de evento.
}
private function Out(e:MouseEvent):void{
if((e.currentTarget.id != (GlobalVars.getInstance().section))&&((changeStateArray[e.currentTarget.id]==true)))
e.currentTarget.gotoAndPlay("out");
}
/*FUNCIÓN: Getters y Setters
*/
[..]
/*FUNCIÓN: Funciones q controlan los estados de los botones (ON/OFF)
*/
public function GetSectionOn():Number{
return(sectionOn);
}
public function SetSectionOn(mySection:Number):void{
sectionOn=mySection;
switch(sectionOn){
case TEORIA:
changeStateArray[TEORIA]=false;//No puede cambiar su estado -sección activa-
changeStateArray[EJERCICIOS]=true;
changeStateArray[ACTIVIDADES]=true;
changeStateArray[USUARIO]=true;
break;
case EJERCICIOS:
[..]
}//end 'switch'
}
[..]
}//End class
}//End package
//______________________En el Timeline_______________________________
Tengo la función Navigate que es la que le paso al crear el obj.
import myAs.NavigationBar;
var navigationBar:NavigationBar=new NavigationBar(Navigate);
addChild(navigationBar);
function Navigate(e:MouseEvent):void{
switch(e.currentTarget.id)//contiene una referencia al objeto que está procesando en ese momento el objeto de evento.
{
case 0://Pulsamos TEORIA
//Si estamos en TEORIA y pulsamos TEORIA debemos mantener los contenidos
if(GlobalVars.getInstance().section!=0)
{
GlobalVars.getInstance().section=0;
removeChild(indexContent);
gotoAndStop("pantallaN4_seccionTeoria");----->Esto es lo que quiero hacer desde una función detectora de evento en la misma Clase!!!
}
else
GlobalVars.getInstance().section=0;
break;
[...]
} //end function[/i]
