Comunidad de diseño web y desarrollo en internet online

Mismo codigo - en .fla y en .as

Citar            
MensajeEscrito el 06 Dic 2007 11:57 pm
Hola gente, tengo un problema que es el siguiente. Quiero hacer una carga dinamica de un archivo en este caso un .jpg.

El mismo codigo si funciona en el .fla pero no funciona en la clase .as El codigo es...

Código :

var cargador:Loader = new Loader();
cargador.load(new URLRequest("foto.jpg"));

var thisMC:MovieClip = new MovieClip();
addChild(thisMC);
thisMC.addChild(cargador);
thisMC.x = 600;
thisMC.y = 300;
thisMC.name = "nuevo";


porque puede ser?
Es necesario que pueda realizar la carga externa desde la clase porque los listener los tengo en la clase y demas motivos.
Bueno gracias a todos los que puedan colaborar, slds

Por Creattive

120 de clabLevel

1 tutorial

Genero:Masculino  

Adobe AIR/Flex developer

msie7
Citar            
MensajeEscrito el 07 Dic 2007 12:23 am
Las clases tienen un formato específico, no son trozos de código sin estructurar. En tu caso, sería algo así:

Código :

package{
import flash.display.Sprite;
import flash.display.MovieClip;
public class TuCargador{
private var cargador  : Loader;
private var thisMC : MovieClip;
public functionTuCargador (url:String , mainClip: Sprite) {
 cargador = new Loader ()
 thisMC=new MovieClip()
 cargador.load(new URLRequest(url));
mainClip.addChild(thisMC);
thisMC.addChild(cargador);
thisMC.x = 600;
thisMC.y = 300;
thisMC.name = "nuevo";
}
}}


Y en tu fla:

Código :

import TuCargador
var tuCargador:TuCargador= new TuCargador("foto.jpg",this);


Lo he escrito sobre la marcha y puede que no funcione, pero espero que hayas pillado la idea.

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 07 Dic 2007 12:32 am
Perdon que no aclarè antes, la clase la tengo bien creada con la definicion del package el constructor y todos los chiches, no puse el codigo completo para no ocupar tanto espacio, pero mi problema es que el mimso codigo si funciona dentro del .fla pero no en el .as

Dentro del .as ese codigo esta dentro de una funcion que es llamda por un listener.

Gracias igual por la rapida respuesta Zah!!

Por Creattive

120 de clabLevel

1 tutorial

Genero:Masculino  

Adobe AIR/Flex developer

msie7
Citar            
MensajeEscrito el 07 Dic 2007 12:40 am
Voy a tratar de ser un poco mas explicito con el error, en el fla todo perfecto me carga la imagen y todos felices, pero con el codigo desde la clase no me muestra ningun error, pero no lo carga porque hice un debbug de los objetos en el escenario y este movieclip no esta en la lista de visualizacion. Hay algo que mes esta faltando porque el addChild(); no lo esta haciendo creo ya que la imagen no aparece.

Por Creattive

120 de clabLevel

1 tutorial

Genero:Masculino  

Adobe AIR/Flex developer

msie7
Citar            
MensajeEscrito el 07 Dic 2007 12:54 am
Pon un poco de tu clase porfas ;).

Por Rafeo

650 de clabLevel

3 tutoriales
1 articulo

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 07 Dic 2007 12:59 am
si el addChild no funciona es porque no estas apuntando a un contenedor correcto, pon tu code completo y asi podemos ver el problem, lo q puso Zah esta (Y)

Por eldervaz

BOFH

10964 de clabLevel

39 tutoriales
56 articulos

Genero:Masculino  

en algún lugar del mundo

firefox
Citar            
MensajeEscrito el 07 Dic 2007 01:01 am
oky toda la clase

Código :

//-------------------------------------------CLASE PARA CREAR MENUES Y BOTONERAS----------------
package proyecto
{
   
   import flash.display.*;                  //--importamos librerias necesarias
   import flash.events.*;   
   import flash.net.*;
   
   //-------------------------------------------comienza la classe CrearMenu
   public class CreaMenu extends MovieClip
   {
      
      //----------------------------definicion de variables y propiedades de eventos
      var escenario:MovieClip;            
      var vinculo:Array = new Array();
      var cargador:Loader = new Loader();
      var child:DisplayObject;
         
      //------------------------------------DESARROLLO DE METODOS DE OBJETO-------------------
            
      public function crear (lugar:MovieClip, cant:Array, links:Array, xx:Number, yy:Number)     {//---method CREAR---------
         escenario = lugar;
         for (var i:uint=0; i<cant.length; i++){            
            var clip1:botonMatriz = new botonMatriz();
            clip1.x = (i * clip1.width) - i;
            clip1.caja_txt.text = new String(cant[i]);
            escenario.addChild(clip1);
            escenario.x = xx;
            escenario.y = yy;
            clip1.vinculo = links[i];
            clip1.addEventListener(MouseEvent.MOUSE_OVER, mouseOn);
            clip1.addEventListener(MouseEvent.MOUSE_OUT, mouseOu);
            clip1.addEventListener(MouseEvent.CLICK, linkea);
         }//cierra for         
      }//cierra function                                                            
      
      //---------------------------------METODOS DE LA CLASE-------------------------------
      
      private function mouseOn(event:MouseEvent):void{
         event.currentTarget.gotoAndPlay(2);
      }
      
      private function mouseOu(event:MouseEvent):void{
         event.currentTarget.gotoAndPlay(11);
      }
      
      private function linkea(event:MouseEvent):void{
         
         var archivo:String = event.currentTarget.vinculo;
         cargador.load(new URLRequest(archivo));

         var thisMC:MovieClip = new MovieClip();
         addChild(thisMC);
         thisMC.addChild(cargador);
         thisMC.x = 600;
         thisMC.y = 300;
         thisMC.name = "nuevo";
      }
      
      
   }//cierra class              

}//cierra package


y aca el .fla

Código :

import proyecto.CreaMenu; // importar CLASE CreaMenu
import proyecto.CargaExt;

var descBotones:Array = new Array('Home','Nosotros','Cursos','Proyecto','Contacto');
var masBotones:Array = new Array('Año 2007','Año 2008');
var links:Array = new Array('asd','asdd','fggdfg','gdsfg','mail.swf');
var links2:Array = new Array('asd','asdd');

var botonera:CreaMenu = new CreaMenu();   
var botonera2:CreaMenu = new CreaMenu();
var objetoInst:CargaExt = new CargaExt();
var objetoInst2:CargaExt = new CargaExt();

botonera.crear(uno_mc, descBotones, links, 0, 70);  //llamo al metodos del objeto CreaMenu
botonera2.crear(dos_mc, masBotones, links2, 700,70);
objetoInst.loadData(tres_mc, "secciones.txt"); //metodo de loadData y paso dos parametros
                                               // contenedor de la carga y archivo a cargar


uno_mc, dos_mc, tres_mc estan en el stage, y botonMatriz esta en la library con linkage

Espero no marearlos, va eso es lo que me pasa a mi cuando veo un codigo desarrollado por otro, gracias!! :)

Por Creattive

120 de clabLevel

1 tutorial

Genero:Masculino  

Adobe AIR/Flex developer

msie7
Citar            
MensajeEscrito el 07 Dic 2007 01:11 am
eldervaz, zah, rafeo: cuando hago un addChild() desde una clase tiene que tener un contenedor? no lo puedo hacer directamente como lo tengo yo.. addChild(thisMC); ?

En varios casos utilice enviar this por parametro al metodo de la clase, pero no es este el caso. Se puede hacer addChild sin contenedor desde una clase?

Por Creattive

120 de clabLevel

1 tutorial

Genero:Masculino  

Adobe AIR/Flex developer

msie7
Citar            
MensajeEscrito el 07 Dic 2007 02:02 pm
Siempre tiene que tener un contenedor. Cuando lo haces sin contenedor, está implícito que lo haces dentro del ámbito de un diplayObject que admite addChild, pero no tiene sentido en una clase que extiende a Object.

Otra forma de hacerlo es esta:

Código :

class TuClase extends Sprite {
  //código de la clase
  //...
  //...
}


Y en el fla:

Código :

var tuClase:TuClase = new TuClase (/*...*/);
this.addChild (tuClase);

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 07 Dic 2007 02:43 pm
OK Zah gracias por la info, voy a dejar de forzar a flash para que haga un addChild sin contenedor porque evidentemente no lo va a hacer desde una clase. :lol:

Otra pregunta, cuando se ejecuta el constructor de la clase, estoy haciendo un contenedor.addChild();...... de un objeto dentro de contenedor
Si luego desde un evento, realizo un segundo contenedor.addChild(); de otro objeto externo, o carga dinamica, el contenido anterior debería descargarse automaticamente como era en AS 2?? o conviven ambos dentro del mismo contenedor??

Gracias! :wink:

Por Creattive

120 de clabLevel

1 tutorial

Genero:Masculino  

Adobe AIR/Flex developer

msie
Citar            
MensajeEscrito el 07 Dic 2007 03:14 pm
veamos, cuando tienes una clase importada es un objeto independiente, eso quiere decir que si deseas que sea parte del escenario le debes mandar la referencia al mismo, como por decir:

en tu as

Código :

package{
   import flash.display.*;
   public class miClase {
      public function miClase (aqui:MovieClip){
            var t1:Sprite = crearCaja();
            aqui.addChild(t1);
      }
     private function crearCaja():Sprite{
            var caja:Sprite = new Sprite();
            caja.graphics.beginFill(0xff0000,1);
            caja.graphics.drawRect(0,0,50,50);
            caja.graphics.endFill();
            return caja;  
     }
   }
}

en tu fla

Código :

var t:miClase = new miClase(this);


entonces, desde el fla le pasas a la clase donde quieres trabajar, en este caso el escenario, pero pudo ser un MC cualquiera.

Ahora, si quieres usar el DocumentClass, ya no necesitas referenciar el escenario, porque la clase forma parte del mismo, solo cambias la clase asi:

Código :

package {

   import flash.display.*;

   public class miClase extends MovieClip {
      public function miClase () {
         var t1:Sprite = crearCaja();
         this.addChild(t1);
      }
      private function crearCaja():Sprite {
         var caja:Sprite = new Sprite();
         caja.graphics.beginFill(0xff0000,1);
         caja.graphics.drawRect(0,0,50,50);
         caja.graphics.endFill();
         return caja;
      }
   }
}
y ya NO LE HACES el import.

Espero te sirva ;)

Por eldervaz

BOFH

10964 de clabLevel

39 tutoriales
56 articulos

Genero:Masculino  

en algún lugar del mundo

firefox
Citar            
MensajeEscrito el 07 Dic 2007 03:47 pm
Buenisimo! teoricamente esto seria perfecto!!, espero llegar a casa y probarlo que seguramente funcionará, pero te pido si rapidamente podés mirar mi codigo el que esta arriba (no lo copio para no hacerlo tan grande)

En mi caso la clase era extends MovieClip pero cuando hacia this.addChild(objeto); me daba un error de referencia y sin el this no hacia nada. Pero bueno, ahora lo solucione haciendo el addChild dentro de un mc que ya estoy utilizando en esa clase. Pero es bueno saber que con el extends MovieClip la clase ya forma parte del escenario? si no entendi mal

Gracias!! totales

Por Creattive

120 de clabLevel

1 tutorial

Genero:Masculino  

Adobe AIR/Flex developer

msie
Citar            
MensajeEscrito el 07 Dic 2007 03:48 pm
no, no forma parte del escenario, solo hereda los metodos, propiedades y eventos de un MovieClip para que se COMPORTE como un MovieClip

Por eldervaz

BOFH

10964 de clabLevel

39 tutoriales
56 articulos

Genero:Masculino  

en algún lugar del mundo

firefox

 

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