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 /////////// } }