Comunidad de diseño web y desarrollo en internet online

error addEventListener de drag en loader

Citar            
MensajeEscrito el 12 Feb 2010 04:43 am
buen dia,
tengo el siguiente codigo en la clase document de mi programa y no me quiere andar el evento drag, me dice

Código ActionScript :

ReferenceError: Error #1069: No se encontró la propiedad stopDrag en flash.display.Loader y no hay ningún valor predeterminado.
   at Principal/suelto()


mi codigo es este

Código ActionScript :

package
{
   import flash.display.MovieClip;
   import flash.events.MouseEvent;
   import flash.display.*;
   import fl.transitions.Tween;
   import fl.transitions.*;
   import fl.transitions.easing.*;
   import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.Event;
   import flash.filters.*;
   import flash.net.*;
   import flash.text.*;

   
   public class Principal extends MovieClip
   {
var ruta:URLRequest;
      var carga:Loader;
      var xml:XML;
      var lista:XMLList;
      var rutaXML:URLRequest = new URLRequest("fotos.xml");
      var cargaXML:URLLoader = new URLLoader();
      var cargador:MovieClip = new MovieClip();
      var arrayPalabras:Array = new Array();
      
      
      var aleatorios:generarNumerosAleatorios;
      
      public function Principal()
      {         
         addChild(cargador);
         cargaXML.load(rutaXML);         
         cargaXML.addEventListener(Event.COMPLETE, mostrar);

      }
         
         
      function mostrar(evento:Event):void
      {
         xml = XML(evento.target.data);
         lista = xml.children();
         for (var i:Number = 0; i < lista.length(); i++)
            {
               ruta = new URLRequest(lista[i].attribute("mini")); //ruta = new URLRequest(lista[i].@mini);
               carga = new Loader();
               carga.load(ruta);
               carga.addEventListener(MouseEvent.MOUSE_DOWN, oprimido);
               carga.addEventListener(MouseEvent.MOUSE_UP, suelto);

               //carga.scaleX = carga.scaleY = .18;
               carga.x = i * 100 + 25;
               carga.y = 100;
               if(i >= 6) 
               {   
                  carga.y +=100;
                  carga.x = (i-6) * 100 + 25;
               }               
               
               cargador.addChild(carga);
               carga.name = lista[i].@source;
               arrayPalabras.push(lista[i].@source);
               //trace(arrayPalabras[i]);
               //var mc:MovieClip = carga.content as MovieClip;
//               cargador.addChild(mc);
//               mc.name = lista[i].@source;
               // var disObj:MovieClip = carga.content as MovieClip; 
//    disObj.addEventListener(MouseEvent.MOUSE_DOWN, oprimido); 
//    disObj.addEventListener(MouseEvent.MOUSE_UP, suelto);  
               //carga.addEventListener(MouseEvent.CLICK, grande);

               
            }                  
      }
      
      function oprimido(e:MouseEvent)
      {         
         e.target.startDrag();
      }
      
      function suelto(e:MouseEvent)
      {
         e.target.stopDrag();
      }
}

lo que se encuentra en comentario es lo que he intentado, pero nada :s

si alguien me puede ayudar estaria muy agradecido
las imagenes ya cargan perfecto, falta solo el arrastre!!

gracias

Por wcordero8

8 de clabLevel



 

chrome
Citar            
MensajeEscrito el 12 Feb 2010 03:57 pm
Usa solamente "stopDrag();" sin el "e.target" stopDrag detiene cualquier objeto que se este arrastrando sin necesidad de especificar cual (ya que solo uno se puede arrastrar).

Saludos!!

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 04:44 pm
gracias por tu respuesta...
pero, si lo hago como me dices, se me mueven todos los objetos, no solo al que le hago el click.
intente quitar ek mc vacio "cargador", pero el resultado es el mismo.

gracias de todas formas y espero cualquier ayuda!!

Por wcordero8

8 de clabLevel



 

chrome
Citar            
MensajeEscrito el 12 Feb 2010 04:51 pm
Jeje el "e.target" solo lo quitas en el caso del stopDrag par el startDrag si dejalo como lo tenias o si no pasa lo que te paso :P



Asi

Código ActionScript :

function oprimido(e:MouseEvent) 
      {          
         e.target.startDrag(); 
      } 
       
      function suelto(e:MouseEvent) 
      { 
       stopDrag(); 
      } 


Saludos!!

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 06:21 pm
sí lo colocó de la manera que me dices, me arroja el problema que mencionaba al principio y no funciona

Por wcordero8

8 de clabLevel



 

safari
Citar            
MensajeEscrito el 12 Feb 2010 06:33 pm
a ver postea algo de codigo para verlo

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 06:35 pm
Hola,
prueba a cambiar:

Código ActionScript :

carga.addEventListener(MouseEvent...

por:

Código ActionScript :

carga.contentLoaderInfo.addEventListener(MouseEvent...

Si no estarías asignando los eventos al loader, no al MovieClip cargado en el loader.
Si aun así sigues teniendo problemas, haz un casting a los target (de hecho deberías hacerlo aunque no te de problemas):

Código ActionScript :

MovieClip(e.target).startDrag();

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 Feb 2010 04:50 am
eyy isidoro y angel roberto, gracias por su ayuda, pero la verdad ninguna opcion de las dadas me ha servido.

angel roberto mi codigo es el que se encuentra en la parte superior.

isidoro, cuando le coloco el contenLoaderInfo no me funcionan los eventos y al tratar de hacer la convercion a movieClip como dices me arroja:

Código ActionScript :

TypeError: Error #1034: Error de conversión forzada: no se puede convertir flash.display::Loader@e7d0641 en flash.display.MovieClip.
   at Principal/oprimido()


gracias por su ayuda, si saben alguna otra posible solución, esta sera bien recibida!!!

Por wcordero8

8 de clabLevel



 

chrome
Citar            
MensajeEscrito el 13 Feb 2010 04:08 pm
intenta agregar el listener COMPLETE al contentLoaderInfo , cuando este cargado el swf entonces si has el cast como dice Isidoro y agregas los listeners correspondientes a la variable que hace referencia al swf cargado :

Código ActionScript :

carga.contentLoaderInfo.addEventListener(Event.COMPLETE, complteHandler);

private function completeHandler(e:Event):void
{
   var swfLoaded:MovieClip = e.target.content as MovieClip;
   swfLoaded.addEventListener(MouseEvent.MOUSE_DOWN, oprimido);
   swfLoaded.addEventListener(MouseEvent.MOUSE_UP,suelto);
}


y ya en los handler del down y up , creo que bastaria con el e.target.stopDrag()..etc

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 13 Feb 2010 04:51 pm
gracias por tu respuesta jn_flash
ya la probe y no me funciono, me arrojo

Código ActionScript :

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
   at MethodInfo-8()


alguna otra opcion?

muchas gracias por su ayuda

Por wcordero8

8 de clabLevel



 

chrome
Citar            
MensajeEscrito el 13 Feb 2010 07:00 pm
ok, me gano la curiosidad y realize lo de hacer un drag and drop de swf cargado , en el proceso me encontre con algo curioso, que espero alguien me pueda explicar , hice lo que te indique segun yo deberia funcionar , pero la duda fue que a un cuando le indicas al compilador que el swf cargado es un MovieClip y por consiguiente agregas los MouseEvent los acepta no marca error mas sin encambio no pasa nada , segun Flex al content del Loader solo acepta evento del Tipo Event , probe agregando un ENTER_FRAME a la variable que hacia la referencia al content con su respectivo "Cast" y ese si funciono pero los de MouseEvent no, asi que la soulucion mas rapida es agregar el swf cargado a un contenedor y el drag and drop aplicarlo sobre el contenedor, esta es la clase del ejemplo igual te puede servir :

Código ActionScript :

package 
{
   import flash.display.Loader;
   import flash.display.MovieClip;
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.events.MouseEvent;
   import flash.net.URLRequest;

   public class TestDragDrop extends Sprite
   {
      private var _loader:Loader;
      private var _container:Sprite;
      
      public function TestDragDrop()
      {
         _container = new Sprite();
         addChild(_container);
         
         _loader = new Loader();
         _loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
         _loader.load(new URLRequest("swfA.swf"));
      }
      
      private function completeHandler(e:Event):void
      {
         var swfLoaded:MovieClip = e.target.content as MovieClip;
         _container.addEventListener(MouseEvent.MOUSE_DOWN,startDragHandler);
         _container.addEventListener(MouseEvent.MOUSE_UP,stopDragHandler);
         _container.addChild(swfLoaded);
      }
      
      private function startDragHandler(e:MouseEvent):void
      {
         Sprite(e.target).startDrag();   
      }
      
      private function stopDragHandler(e:MouseEvent):void
      {
         Sprite(e.target).stopDrag();   
      }
   }
}


Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 13 Feb 2010 07:23 pm
mmm osea la idea, si no la entiendo mal, es agregar un contenedor a cada imagen que desee cargar?

gracias

Por wcordero8

8 de clabLevel



 

chrome
Citar            
MensajeEscrito el 13 Feb 2010 07:32 pm
como tu cargas imagenes "Bitmap" el content de tu Loader sera Bitmap y si recuerdo Bitmap no acepta Listeners asi que tendras que meter la foto cargada en contenedor.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 13 Feb 2010 07:39 pm
pd. no lei bien lo que estabas haciendo , pense que cargabas swfs , pero son Imagenes XD , pero la idea tambien es aplicable.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 11 Mar 2011 11:45 am
Tengo el mismo problema planteado y no lo consigo hacer, no acabo con el error.
ME podríais explicar mejor como hacer lo del container que explicabas Jonathan, tengo el mismo problema, solo que cargo las imagenes desde un txt en vez de un xml. No consigo hacerlo funcionar.
Un saludo.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Mar 2011 02:04 pm
BuenAS:

Sí, es que startDrag() y stopDrag() son métodos de la clase Sprite. Por tanto, sólo puedes utilizarlos con Sprites y MovieClip.

Crea un Sprite, añade el loader (o su contenido, la imagen que cargas) al Sprite, instancialo, y añade los listeners a dicho Sprite Y NO al loader.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 14 Mar 2011 12:22 pm
Hola, gracias por responder, he estado probando lo que me has dicho. Pero no consigo adaptarlo a lo que quiero. No se como hacer cargar la imagen en el movieClip, una vez que la tengo en el loader que he cargado a traves de mi txt. Pongo el código para que veas lo que quiero hacer. Creo que me lio al pasar del evento que carga la imagen del txt y luego del evento que le quiero pasar a las funciones pickUp y dropIt.

Código ActionScript :

 import flash.events.*;
   import flash.display.Loader; 
   import flash.display.MovieClip; 
   import flash.display.Sprite; 
   import flash.net.URLRequest; 

   var TxtList:Array = ["1.txt","2.txt","3.txt"];
   var totalTxts:Number = 3;
   // Crea un random entre 0 y el numero total de ficheros que tengamos. 
   var randNum:Number = Math.round(Math.random()* (totalTxts - 1));      
   //Create the URLLOader instance
   var myLoader:URLLoader = new URLLoader();
   //the data will come as URL-encoded variables
   myLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
   myLoader.load(new URLRequest(TxtList[randNum]));
   myLoader.addEventListener(Event.COMPLETE, onDataLoad);
      
   var startX:Number;
   var startY:Number;
   var counter:Number = 0;

   bt_repetir.visible=false;
   
   holder_mc0.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
   holder_mc0.addEventListener(MouseEvent.MOUSE_UP, dropIt);
   holder_mc1.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
   holder_mc1.addEventListener(MouseEvent.MOUSE_UP, dropIt);
   holder_mc2.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
   holder_mc2.addEventListener(MouseEvent.MOUSE_UP, dropIt);
   holder_mc3.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
   holder_mc3.addEventListener(MouseEvent.MOUSE_UP, dropIt);
   
   holder_mc0.buttonMode = true;
   holder_mc1.buttonMode = true;
   holder_mc2.buttonMode = true;
   holder_mc3.buttonMode = true;
   
   bt_iniciofin.addEventListener(MouseEvent.CLICK, ir_inicio);
   stop();

   // FUNCIONES   
function onDataLoad(event:Event){
    for(var i:uint=0; i<event.target.data.cont; i++){
       var loader:Loader = new Loader();
   this["holder_mc"+i].addChild(loader); 
   var url:URLRequest = new URLRequest(event.target.data["Image"+i]); 
   loader.load(url);
    }
}

function pickUp(event:MouseEvent):void {
   event.target.startDrag(true);
   reply_txt.text = "";
   event.target.parent.addChild(event.target);
   startX = event.target.x;
   startY = event.target.y;
}

function dropIt(event:MouseEvent):void {
   event.target.stopDrag();
   var myTargetName:String = "target" + event.target.name;
   var myTarget:DisplayObject = getChildByName(myTargetName);
   if (event.target.dropTarget != null && event.target.dropTarget.parent == myTarget){
      reply_txt.text = "Bieeen!";
      event.target.removeEventListener(MouseEvent.MOUSE_DOWN, pickUp);
      event.target.removeEventListener(MouseEvent.MOUSE_UP, dropIt);
      event.target.buttonMode = false;
      event.target.x = myTarget.x;
      event.target.y = myTarget.y;
      counter++;
   } else {
      reply_txt.text = "Prueba de nuevo!";
      event.target.x = startX;
      event.target.y = startY;
   }
   if(counter == 4){
        reply_txt.text = "Felicidades, has terminado!";
      bt_repetir.visible=true;      
      bt_repetir.addEventListener(MouseEvent.CLICK, ir_repetir);
      }
}

function ir_repetir(event:MouseEvent):void {
   gotoAndPlay(1);
   holder_mc0.visible = false;
   holder_mc1.visible = false;
   holder_mc2.visible = false;
   holder_mc3.visible = false;
   } 
function ir_inicio(event:MouseEvent):void {
   gotoAndPlay("uno","Inicio");
}

El error que obtengo es: ReferenceError: Error #1069: No se encontró la propiedad stopDrag en flash.display.Loader y no hay ningún valor predeterminado.
at piramide_fla::MainTimeline/pickUp()
Tengo definidos en el .fla los 4 movieClip que es donde quiero que se situen mis imagenes en sus correspondientes coordenadas (cada holder_mc0, holder_mc1,..)
Gracias si podeis decirme como lo puedo solucionar.
Un saludo.

Por madeline

28 de clabLevel



 

firefox

 

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