Comunidad de diseño web y desarrollo en internet online

Menú creado dinamicamente, problema en instancias

Citar            
MensajeEscrito el 01 Jun 2010 12:09 pm
Hola a todos, bueno, despues de mucho tiempo he decidido intentar pasar de as2 a as3, y bueno, nada mas comenzar a hacer todo desde 0, sin pasar codigos ni nada, me encuentro con problemas. Primero decir que he comprado el libro ActionScript 3 de Anaya y OReilly y ya me lo he leido, básicamente ya he cogido las ideas y los cambios esenciales, pero hay cosas que se me escapan y bueno, os hago un par de preguntas de las muchas que tendré que ir haciendo.

La primera es sobre un menu que voy creando dinamicamente desde un xml, bueno, despues de un rato ya he conseguio que carguen los textos, pero mi problema surge cuando quiero que cada seccion tenga un nombre de instancia diferente.
el menu lo cargo tal que así:

Código ActionScript :

//declaramos el objeto de la ruta del xml
var xmlRuta:URLRequest=new URLRequest("menu.xml");
//declaramos el objeto para cargar el xml
var xmlLoader:URLLoader = new URLLoader();
//ejecutamos la carga de nuestro xml
xmlLoader.load(xmlRuta);
//funcion que se ejecutará cuando acabe de cargar
xmlLoader.addEventListener(Event.COMPLETE, cargaCompleta);
//declaramos el objeto que almacenará el xml
var xmlData:XML;

//funcion que se ejecuta al acabar de cargar
function cargaCompleta(evt:Event):void {
   //almacenamos los datos del xml en nuestro objeto xmlData
   xmlData=new XML(xmlLoader.data);
   trace(xmlData.secciones.seccion[0].@nombre);
   var longMenu:Number=xmlData.secciones.*.length();
   trace(longMenu);
   for (var i= 0; i<longMenu; i++) {
      var seccion:MovieClip = new MovieClip();
      var secTexto:TextField = new TextField ();
      secTexto.text=xmlData.secciones.seccion[i].@nombre;
      /*var seccion:mcSeccion = new mcSeccion();
      seccion.texto_txt.text=xmlData.secciones.seccion[i].@nombre;*/
      seccion.x = (seccion.width*i) + 10;
      seccion.y=100;
      addChild(seccion);
      seccion.addChild(secTexto);
      trace(seccion.name)
   }

}


Yo en AS2, hacia para poner nombres de instancia en elementos externos esto:

Código ActionScript :

var sec = attachMovie("secVinc", "mc"+acuProf, acuProf);

o creando el mc directamente, asi luego podia referirme a ellos de esa manera, para darles eventos de boton, o lo que fuera.

Como lo debo de hacer en AS3?

La otra pregunta es sobre la anidación, en el codigo de antes ya he conseguido meter el campo de texto dentro del movieclip, pero mi duda surge si tengo que tener por ejemplo otro texto en esa misma situacion, como se anidan?

Saludos

Por douglashall

14 de clabLevel



 

safari
Citar            
MensajeEscrito el 01 Jun 2010 02:12 pm
Douglas. Una de las cosas que más cambia de AS2 a AS3 es, precisamente, lo del "nombre de instancia". En AS3 ya no vamos a tener nunca un "nombre de instancia", sino "variables que hacen referencia a". De hecho, si tenemos en el stage un MovieClip con nombre de instancia "mimc", AS3 lo va a "traducir" a una "variable llamada 'mimc' que hace referencia a".

Tiene importancia porque las variables las podemos definir a nivel de frame (o de clase) o variables temporales -que sólo usaremos dentro de una función, o dentro de un bucle-

Cuando en AS.2 hacíamos un attach teníamos el nombre de instancia siempre disponible. Ahora NO. Olvidaté de ello. Entonces... ¿cómo nos podemos referir a los MCs que tenemos?
Existen dos opciones
1.-Tenerlas en unas variables que hagan referencia
2.-Usando los métodos getChildByName y getChildAt que nos devuelven un "DisplayObject". Esto es. si sabemos el valor de la "propiedad" "name" de un Mc que está en el stage, podremos escribir en un frame

Código ActionScript :

var mc:MovieClip=getChildByName("nombre_mc") as MovieClip
mc.x=200  //p.e.
mc.gotoAndPlay(100)  

Observa que, de nuevo, declaramos una "variable que hace referencia a". El "as MovieClip" es una "conversión de cast" que nos sirve para que el compilador no dé ningún error si usamos un "método" o una "propiedad" que no pertenezca a los DisplayObject.

Sí, he dicho un "propiedad" llamada "name" y, como tal, le damos valor con un "=" de toda la vida. Vamos, tu bucle quedaría

Código ActionScript :

for (var i= 0; i<longMenu; i++) { 
      var seccion:MovieClip = new MovieClip(); 
      var secTexto:TextField = new TextField (); 
      ....
      seccion.x = (seccion.width*i) + 10; 
      seccion.y=100; 
      seccion.name="seccion"+i //<---por ejemplo
      addChild(seccion); 
      seccion.addChild(secTexto); 
      trace(seccion.name) 
   } 

¿cómo le doy eventos del botón?
Pues con un addEventListener

Código ActionScript :

for (var i= 0; i<longMenu; i++) { 
      var seccion:MovieClip = new MovieClip(); 
      var secTexto:TextField = new TextField (); 
      ....
      seccion.x = (seccion.width*i) + 10; 
      seccion.y=100; 
      seccion.name="seccion"+i //<---por ejemplo
      addChild(seccion); 
      seccion.addChild(secTexto); 
      seccion.addEventListener(MouseEvent.CLICK,seccionPulsada)  //<---esta
      trace(seccion.name) 
   } 
//definimos una función seccionPulsada
function seccionPulsada(e:MouseEvent){
          trace(e.target)
          trace(e.target.name)
}

Sí, todas las funciones que usamos cuando añadimos un listener tienen un único argumento del tipo el tipo que hemos puesto en el addEventListener (en este caso de tipo MouseEvent, en un ENTER_FRAME será de tipo Event)
Y en la función podemos recuperar "a quién" le ocurrió el evento mediante la propiedad "target" (o currentTarget) del argumento. De nuevo nos encontramos con variables que hacen referencia a MCs

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Jun 2010 02:35 pm
Gracias Eliseo, el tema era ese, poder recurrir a esa variable que hace referencia al objeto que creo ya que serguramente luego tendré que recurrir a el, es decir, me creará un menu tal que por ejemplo: inicio, galeria, novedades, etc , y probablemente luego tenga que recurrir a cualquiera de la secciones.

Lo que no entiendo es como ahora diferencia a la variable seccion cada vez que hace el for, segun el trace:

Inicio
5
instance2
instance4
instance6
instance8
instance10

Esos instance son los nombres internos que tienen de aqui en adelante en toda la película?

Saludos

Por douglashall

14 de clabLevel



 

safari
Citar            
MensajeEscrito el 01 Jun 2010 03:31 pm
Eliseo, no se o no puedo detectar la variable de la misma forma que antes ahora en as3? es decir, añado los eventos del raton a la funcion para que cada variable de seccion los tome, pero claro, volvemos al problema de antes, no puedo identificar a cada uno.

Código ActionScript :

//funcion que se ejecuta al acabar de cargar
function cargaCompleta(evt:Event):void {
   //almacenamos los datos del xml en nuestro objeto xmlData
   xmlData=new XML(xmlLoader.data);
   trace(xmlData.secciones.seccion[0].@nombre);
   var longMenu:Number=xmlData.secciones.*.length();
   trace(longMenu);
   for (var i= 0; i<longMenu; i++) {
      var seccion:mcSeccion = new mcSeccion();
      seccion.texto_txt.text=xmlData.secciones.seccion[i].@nombre;
      seccion.name="seccion"+i;
      seccion.x = (seccion.width*i) + 10;
      seccion.y=100;
      seccion.buttonMode=true;
      seccion.useHandCursor=true;
      seccion.addEventListener(MouseEvent.MOUSE_OVER,seccionOver);
      seccion.addEventListener(MouseEvent.MOUSE_OUT,seccionOut);
      seccion.addEventListener(MouseEvent.CLICK,seccionPulsada);
      addChild(seccion);
   }

}
function seccionPulsada(evt:Event):void {
//aqui en as2 habría identificado al mc clickado a traves del nombre de instasncia, pero ahora no se puede por lo que no podría darle ordenes a cada uno de ellos, del estilo 
if (_name.slide(7) == 5 ){ vete a tal sitio, o cargame tal cosa }


   trace(this.name);
}
function seccionOver(evt:Event):void {
   trace("over");
}
function seccionOut(evt:Event):void {
   trace("Out");
}


Como lo podría identificar ? perdona tantas molestias, ando perdido y no quiero calentarme y volver a hacerlo todo en as2 jejeje. Ahora ya tengo que seguir en as3 :)

Por douglashall

14 de clabLevel



 

safari
Citar            
MensajeEscrito el 01 Jun 2010 03:33 pm
Por cierto que tampoco aparece el cursor de boton al pasar los eventos del raton

PD - Escribo mas post pq no se como editar los mensajes anteriores, no veo donde está.

Por douglashall

14 de clabLevel



 

safari
Citar            
MensajeEscrito el 01 Jun 2010 04:03 pm

Lo que no entiendo es como ahora diferencia a la variable seccion cada vez que hace el for, segun el trace:
Inicio
5
instance2
instance4
instance6
instance8
instance10

Al igual que en AS2, cuando teníamos un Mc y no le dábamos un "nombre de instancia" Flash te daba uno por defecto, ahora, por defecto, lo que hace es dar valor a la "propiedad" name. Pero si tienes escrito

Código ActionScript :

seccion.name="seccion"+i; 

Te debería salir "seccion0","seccion1"...

volvemos al problema de antes, no puedo identificar a cada uno.

Sí, si los puedes identificar, puesto que, dentro de la función los tienes en el "evt.target".(*)

Código ActionScript :

function seccionPulsada(evt:Event):void { 
  trace(evt.target)
  //Creo una auxiliar, aunque no hace falta
  var seccion:MovieClip=evt.target as MovieClip
  if (seccion.name.slide(7) == "5" ){ //el "5" es entre comillas
         vete a tal sitio, o cargame tal cosa 
  } 
}

Antes usáríamos una suerte de "this._name". Ahora NO. La función es independiente y "this", dentro de la función sería la propia película principal -o el objeto de la clase si estuviéramos hablando de clases-

Por cierto que tampoco aparece el cursor de boton al pasar los eventos del raton

Es el TEXTO de DENTRO de la sección el que está dando problemas. DEBERÍAS hacer que el texto no tuviera la propiedad mouseEnabled

Código ActionScript :

for (var i= 0; i<longMenu; i++) { 
      var seccion:mcSeccion = new mcSeccion(); 
      seccion.texto_txt.text=xmlData.secciones.seccion[i].@nombre; 
      seccion.texto_txt.mouseEnabled=false //<---esta línea
      ....
}

O bien, lo pones en la clase si has creado una clase mcSeccion

PD - Escribo mas post pq no se como editar los mensajes anteriores, no veo donde está.

Yo tampoco :). Lo que suelo hacer es darle a quote, copiar el texto, borrar el mensaje y pegar el texto.

(*)Hay una pequeña "confusión" y es la propiedad target y la propiedad currentTarget. A groso modo:
target es "a quién le ocurre el evento"
currentTarget es "a quién le hemos añadido el listener del evento"

Como tienes un "MC dentro de otro MC" al que le ocurre el evento es al texto (si le ponemos la propiedad MouseEnabled a false no ocurrirá). Si te sientes más cómodo al principio puedes escribir currentTarget en lugar de target

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Jun 2010 05:27 pm
Al hacer click en el trace responde object mcSeccion, entiendo que me dice que hago click a un objeto de la clase mcSeccion, que es la que importo, osea, a algun "seccion", pero me sigue sin identificar cual es :s , de la segunda manera que me has puesto si lo identifica, con "as MovieClip".

Código ActionScript :

Inicio
5
over
[object mcSeccion]
[object mcSeccion]
Out
over
[object mcSeccion]
Out


Bueno, una primera toma superada jejeje, voy a ver que tal los movimientos tween y las cargas y precargas de imagenes, no te vayas muy lejos :D.

Un saludo y gracias.

Por douglashall

14 de clabLevel



 

safari
Citar            
MensajeEscrito el 01 Jun 2010 07:24 pm
Hola de nuevo, ahora tengo problemillas con los tween, en as2 me habia creado unas funciones que me iban muy bien, una para trasladar, otra estirar, otra para el alfa y otra para cambiar de color, son estas:

Código ActionScript :

//------------------------------------PROTOTIPOS--------------------------------
MovieClip.prototype.trasladaMc = function(clip, tipo, Xpos, Ypos, velocidad) {
   //Tenemos estas 6 catgorias:
   //Strong//Back//Elastic//Regular//Bounce//None
   //y 4 tipos de easing:
   //easeIn//easeOut//easeInOut//easeNone
   clip.tween("_x", Xpos, velocidad, tipo, 0.005);
   clip.tween("_y", Ypos, velocidad, tipo, 0.005);
};
MovieClip.prototype.estiraMc = function(clip, tipo, ancho, alto, velocidad) {
   //Tenemos estas 6 catgorias:
   //Strong//Back//Elastic//Regular//Bounce//None
   //y 4 tipos de easing:
   //easeIn//easeOut//easeInOut//easeNone
   clip.tween("_width", ancho, velocidad, tipo, 0.005);
   clip.tween("_height", alto, velocidad, tipo, 0.005);
};
MovieClip.prototype.coloreaMc = function(clip, color) {
   objetoColor = new Color(clip);
   objetoColor.setRGB(color);
};
MovieClip.prototype.alfaIn = function(clip, cantidad, velocidad) {
   clip.onEnterFrame = function() {
      if (Math.ceil(this._alpha)<cantidad) {
         this._alpha += velocidad;
         //trace(Math.ceil(this._alpha));
         if (Math.ceil(this._alpha)>=cantidad) {
            this._alpha = cantidad;
            delete this.onEnterFrame;
         }
      }
   };
};
//funcion que nos pone un mc al 0% de alfa ( no es visible )
MovieClip.prototype.alfaOut = function(clip, cantidad, velocidad) {
   clip.onEnterFrame = function() {
      if (Math.ceil(this._alpha)>cantidad) {
         this._alpha -= velocidad;
         if (Math.ceil(this._alpha)<=1) {
            this._alpha = cantidad;
            delete this.onEnterFrame;
         }
      }
   };
};

Cuando estoy intentado pasarlas a as3 llegan los problemas, las quiero convertir pq me han sido muy utiles y supongo que podrán seguir siendolo. Al pasar las funciones, me dan errores, no es posible pasar parametros dentro de las funciones en as3?
En las de alfa, ya he visto que es mas sencillo usar directamente la clase tween

Código ActionScript :

var ajustarAlfa:Tween=new Tween(seccion,"alpha",Regular.easeInOut,1,0,2,true);

pero el efecto es visualmente peor que el que obtenia con mis funciones.

Bueno, mi pregunta es si aun puedo usar prototipos y rehacerlos con los enterframe nuevos ( los tendre que remirar en el libro ) caso de los alfas, y las clases tween rehacerlas tambien de igual manera con la clase tween de CS4, teniendo en cuenta que no se si puedo hacer asi las funciones.

Saludos

Por douglashall

14 de clabLevel



 

safari
Citar            
MensajeEscrito el 01 Jun 2010 10:33 pm
En AS3 ya no se usan prototipos. En el caso de tus funciones lo mejor es que crees una clase (que es lo que hace Tween y las demás librerías de animación) para colocar allí tus funciones. Dependiendo del alcance que quieras darle, puede ser una clase que extienda la clase MovieClip o simplemente una clase estática que contenga las animaciones que deseas como métodos.

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

chrome
Citar            
MensajeEscrito el 02 Jun 2010 10:57 am
Pero aun se pueden usar funciones con parametros de la misma manera que en AS2?

He encontrado unas clases en http://www.greensock.com/ , y parece que funcionan bastante bien

Saludos

Por douglashall

14 de clabLevel



 

safari

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.