Comunidad de diseño web y desarrollo en internet online

Problema con StartDrag y StageLeave

Citar            
MensajeEscrito el 21 May 2011 10:37 am
Buenas, a ver si alguien podría orientarme, tengo este problemilla y no sé como orientarlo.

Resulta que tengo una serie de clips los cuales puedo hacerles un Drag de un punto A a un punto B. En el punto B incrementarían su tamaño para una mejor visualización.

Si soltamos en cualquier punto del stage cualquiera de esos clips, calcula mediante enterFrame donde se encuentra y los devuelve bien o al punto A o al punto B, según la proximidad.

El caso es, que si hago un MOUSE_UP para cualquier clip, en cualquier punto, ejecuta el stopDrag y calcula lo que tiene que hacer, pero si saco el cursor fuera de la pelicula, no ejecuta el MOUSE_UP, y por lo tanto el stopDrag y el calculo donde tiene que ir.

Se supone que si yo hago un STAGE LEAVE podría disparar cualquier funcion, pero no funciona si lo hago con el startDrag activo. Directamente el clip que está siendo arrastrado se queda parado en el punto por donde he sacado el cursor y vuelve a funcionar si lo meto dentro.

Una solución que he encontrado es, resizear la pelicula automáticamente, así el usuario nunca podría sacar el cursor fuera, pero tendría que añadirle un botón para cerrar, adaptándose el stage denuevo a su tamaño original, por ejemplo 800x600 y seguiría teniendo el mismo problema, porque le usuario podría interacturar otra vez con el tamaño original del stage.

No sé como podría resolverlo, a ver si alguien podría orientarme o darme alguna idea nueva.

Os pego el código. Muchas gracias.

Código ActionScript :

/////cargamos xml////
var xmlLoader:URLLoader = new URLLoader(); 
var xmlData:XML = new XML(); 
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);   
xmlLoader.load(new URLRequest("menu2.xml")); 
  
function LoadXML(e:Event):void { 
xmlData = new XML(e.target.data); 
carga();  // <<--lanza funcion;
} 

function carga():void {
   
   var max:Number = 1;
   var min:Number = -1;

   var recoge:uint  = xmlData.BOTON.length();
   for(var i:uint = 0 ; i < recoge ; i++)
   {
      objArray.push(xmlData.BOTON[i].attribute("titulo")); 
      objArray_rutas.push(xmlData.BOTON[i].attribute("ruta"));
      objArray_img_w.push(xmlData.BOTON[i].attribute("w"));
      objArray_img_h.push(xmlData.BOTON[i].attribute("h"));
      
      var c:Cuadrado = new Cuadrado();
      cont.addChild(c);
      
      var R:Number = Math.floor(Math.random() * (1+max-min)) + min;
      
      c.x =  250 +  (separacion * i) ;
      c.y =  600;
      c.rotation =  R * 20 ;
      c.buttonMode = true;
      c.name="ld"+i ;
      objArray_names.push(c.name);
   
      var holder:Loader = new Loader() 
      holder.load(new URLRequest(objArray_rutas[i]))
      objArray_mcs.push(holder);
      c.clip1.addChild(holder);
      
      queX_ini.push(c.x);
      queY_ini.push(c.y);
      
      c.addEventListener(MouseEvent.MOUSE_DOWN, arrastra); 
      c.addEventListener(MouseEvent.MOUSE_UP, suelta);
      c.addEventListener(Event.ENTER_FRAME, mueve);
      
      
      objArray_apila.push(cont.numChildren);

      /////////arrastra ////
      
         function arrastra ( e:Event ){
            
                  num = Number(e.currentTarget.name.substr(2))  
                  activa_suelta = true;
                  cambiat = true;
                  e.currentTarget.startDrag(true);
                  
                  if( e.currentTarget.y <=  cont.marco.y + 315 && metenum.length >= 1){
                        var recoge:int = metenum.indexOf(e.currentTarget.name);
                        metenum.splice(recoge,1);
                  }
            }
            
      //////////suelta ///////

         
            function suelta ( e:Event ){
                     
                     cambiat = false;
                     var max:Number = 1;
                     var min:Number = -1;
                     
                     var N:Number = Math.floor(Math.random() * (1+max-min)) + min;
                     var N2:Number = Math.floor(Math.random() * (1+max-min)) + min;
                     Variablenum_x = N;
                     Variablenum_y = N2;
                     
                     var R:Number = Math.floor(Math.random() * 500);
                     var R2:Number = Math.floor(Math.random() * -50);
                     
                     Calcula = R * N;
                     Calcula2 = R2 * N2;
                     
                     activa_suelta = false
                     
                     if( e.currentTarget.y <=  tapa.height ){
                        cont.setChildIndex(DisplayObject(e.currentTarget), objArray_apila.length);  
                     }
                     
                     if( e.currentTarget.y <=  cont.marco.y + 315 ){
                        metenum.push(String(e.currentTarget.name));
                     }else{
                        trace("elimina 1");
                     }
                        //trace(metenum);
                        e.currentTarget.stopDrag();
                     
                     for(var i:uint = 0 ; i < metenum.length ; i++) {
                        mete = String(metenum[i]);
                        
                     }
                     trace(metenum);
                     if(metenum.length == 0){
                        trace("no hagas nada");
                     }else{
                        objArray_metes.unshift(mete);
                     }
                     
                  
            }
                  /////////////// CALCULA ///////////////
                  
                     function mueve(e:Event){   
                     
                     cont.getChildByName(objArray_names[0]).visible = false;

                     for(var i:uint = 0 ; i < objArray.length ; i++) {
                        
                        if(cont.getChildByName(objArray_names[i]).y >=  cont.marco.y ){
                           cont.getChildByName(objArray_names[i]).alpha = 100;
                        }
                        if(cont.getChildByName(objArray_names[i]).y <=  cont.marco.y + 315 && cont.getChildByName(objArray_names[i]).y <= 315 ){
                           cont.getChildByName(objArray_names[i]).alpha = .5;
                        }
                        if( e.currentTarget.y >=  tapa.height ){
                           cont.setChildIndex(DisplayObject(e.currentTarget), objArray_apila.length);
                           }
                        if( e.currentTarget.y <= tapa.height ){
                           cont.getChildByName(objArray_names[num]).alpha = 100;
                           e.currentTarget.gotoAndPlay(3);
                        }
                        if( e.currentTarget.y >= tapa.height ){
                           e.currentTarget.prevFrame();      
                        }
                        
                        if((((cont.getChildByName(objArray_names[num]).x >= cont.marco.x - (cont.getChildByName(objArray_names[num]).width)) && cont.getChildByName(objArray_names[num]).x <= cont.marco.width + ( cont.getChildByName(objArray_names[num]).width )) && (cont.getChildByName(objArray_names[num]).y >= cont.marco.y - ( cont.getChildByName(objArray_names[num]).width ) && cont.getChildByName(objArray_names[num]).y <= cont.marco.height + ( cont.getChildByName(objArray_names[num]).width ))) && activa_suelta == false) { /// si esta dentro
                              
                              queX = queX_marc;
                              queY = queY_marc;
                              cont.getChildByName(objArray_names[num]).x -= (cont.getChildByName(objArray_names[num]).x -  (100+ cont.marco.x + cont.marco.width/2 + Calcula/2)) * suavizado /velocite;
                              cont.getChildByName(objArray_names[num]).y -= (cont.getChildByName(objArray_names[num]).y -  ( cont.marco.y + cont.marco.height/2 + Calcula2/2))* suavizado /velocite;
                              cont.marco.x = marcoX ;
                              cont.marco.y = marcoY ;
                              
                              if(objArray_mcs[num].content.currentFrame <=15){
                                 objArray_mcs[num].content.nextFrame();
                              }else{
                                 objArray_mcs[num].content.gotoAndStop(15);
                              }
                              break;
                              
                           }
                        }
                        
                        if((((cont.getChildByName(objArray_names[num]).x <= cont.marco.x - ( cont.getChildByName(objArray_names[num]).width)) || cont.getChildByName(objArray_names[num]).x >= cont.marco.width + ( cont.getChildByName(objArray_names[num]).width )) || (cont.getChildByName(objArray_names[num]).y <= cont.marco.y - ( cont.getChildByName(objArray_names[num]).width ) || cont.getChildByName(objArray_names[num]).y >= cont.marco.height + ( cont.getChildByName(objArray_names[num]).width ))) && activa_suelta == false) { /// si esta fuera
                              
                              //trace("fuera");

                              if( cont.getChildByName(objArray_names[num]).y <= cont.marco.y + cont.getChildByName(objArray_names[num]).height){
                                 barra.visible = true;
                                 tapa.visible = true;
                                 cont.marco.x = cont.marco.x + 500;
                                 cont.marco.y = cont.marco.y + 500;
                              }
                              if(cont.getChildByName(objArray_names[num]).x <= cont.marco.x + cont.getChildByName(objArray_names[num]).height){
                                 barra.visible = true;
                                 tapa.visible = true;
                                 cont.marco.x = cont.marco.x + 500;
                                 cont.marco.y = cont.marco.y + 500;
                              }
                              if(cont.getChildByName(objArray_names[num]).x >= cont.marco.x + cont.getChildByName(objArray_names[num]).height){
                                 barra.visible = true;
                                 tapa.visible = true;
                                 cont.marco.x = cont.marco.x + 500;
                                 cont.marco.y = cont.marco.y + 500;
                              }
                              if((cont.getChildByName(objArray_names[num]).y <= queY_ini[num] + 5 && cont.getChildByName(objArray_names[num]).y >= queY_ini[num] - 5 ) && (cont.getChildByName(objArray_names[num]).x <= queX_ini[num] + 5 && cont.getChildByName(objArray_names[num]).x >= queX_ini[num] - 5 )){
                                 barra.visible = false;
                                 tapa.visible = false;
                                 cont.marco.x = marcoX;
                                 cont.marco.y = marcoY;
                              }
                                 queX = queX_ini[num];
                                 queY = queY_ini[num];
                              
                                 cont.getChildByName(objArray_names[num]).x -= (cont.getChildByName(objArray_names[num]).x - queX)/50;
                                 cont.getChildByName(objArray_names[num]).y -= (cont.getChildByName(objArray_names[num]).y - queY)/50; 
                                 
                                 // convierte el penultimo en blanco, aleluya, señor aleluya!!
                                 for(var j:uint = 0 ; j < objArray_metes.length ; j++) {
                                    cont.getChildByName(objArray_metes[0]).alpha = 100;
                                 }
                           }
                        
                        //calculate angle of current position to target position
                     
                           var delta_x:Number = cont.getChildByName(objArray_names[num]).x - marcoX - cont.marco.width/2 ;
                           var delta_y:Number = cont.getChildByName(objArray_names[num]).y - marcoY - cont.marco.height + 2000 ;
                           var targetRotation:Number = -Math.atan2(delta_x, delta_y)/(Math.PI/180);
                           
                           //calculate the two methods of rotation
                           
                        if(activa_suelta == true){
                        
                           if(objArray_mcs[num].content.currentFrame <= 3){
                                 stop();
                              }else{
                                 objArray_mcs[num].content.prevFrame();
                              }
                           if (cont.getChildByName(objArray_names[num]).rotation<targetRotation) {
                                 cont.getChildByName(objArray_names[num]).rotation += 1;
                              }
                           if (cont.getChildByName(objArray_names[num]).rotation>targetRotation) {
                                 cont.getChildByName(objArray_names[num]).rotation -= 1;
                              }
                              } else {
                              cont.getChildByName(objArray_names[num]).rotation = targetRotation;
                              }
                           }
                        
                        
                        
      ///////// CIERRA ///////////
   }
}

Por messayiah

20 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 May 2011 01:07 pm
Puedes poner algún mc invisible en los bordes y chequear la colisión, o verificar que la pocición no sea igual a 0 o mayor al ancho o largo, en cuyo caso vuelve

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 May 2011 02:44 pm
Gracias Jorge, va a la perfección :).

Por messayiah

20 de clabLevel



 

chrome

 

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