2017-03-01 32 views
0

我在Adobe Animate中創建了一個交互式紙娃娃,並且在拖放功能中工作時遇到了一些麻煩。我有多件衣服需要有可能被拖到相同的區域。例如,我可能有4種不同的襯衫選擇。我已經開始與兩件禮服(黃dress_mc & blue dress_mc)。黃色的連衣裙工作正常,但藍色的連衣裙不起作用,我可以拖動它,但不會掉落它。有什麼建議麼?如何使用ActionScript 3.0創建拖放操作?多個項目被拖動到多個目標

這是我現在所擁有的代碼:

var objectoriginalX:Number; 
var objectoriginalY:Number; 

flower_mc.buttonMode = true; 
flower_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickupObject); 
flower_mc.addEventListener(MouseEvent.MOUSE_UP, dropObject); 

yellowdress_mc.buttonMode = true; 
yellowdress_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickupObject); 
yellowdress_mc.addEventListener(MouseEvent.MOUSE_UP, dropObject); 

bluedress_mc.buttonMode = true; 
bluedress_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickupObject); 
bluedress_mc.addEventListener(MouseEvent.MOUSE_UP, dropObject); 

function pickupObject(event:MouseEvent):void { 
event.target.startDrag(true); 
event.target.parent.addChild(event.target); 
objectoriginalX = event.target.x; 
objectoriginalY = event.target.y; 
} 
function dropObject(event:MouseEvent):void { 
event.target.stopDrag(); 
var matchingTargetName:String = "target" + event.target.name; 
var matchingTarget:DisplayObject = getChildByName(matchingTargetName); 
if (event.target.dropTarget != null && event.target.dropTarget.parent == 
matchingTarget){ 
event.target.removeEventListener(MouseEvent.MOUSE_DOWN, pickupObject); 
event.target.removeEventListener(MouseEvent.MOUSE_UP, dropObject); 
event.target.buttonMode = false; 
event.target.x = matchingTarget.x; 
event.target.y = matchingTarget.y; 
} else { 
event.target.x = objectoriginalX; 
event.target.y = objectoriginalY; 
} 
} 

回答

1

我建議在拖對象不使用MOUSE_UP。在少數情況下可能會失敗。另外,將拖動的對象放在前面是個好主意。

var Drugs:Array = [flower_mc, yellowdress_mc, bluedress_mc]; 

for each (var aDrag:MovieClip in Drugs) 
{ 
    aDrag.buttonMode = true; 
    aDrag.useHandCursor = true; 
    aDrag.addEventListener(MouseEvent.MOUSE_DOWN, dragObject); 
} 

var orig:Point; 
var drag:MovieClip; 

function dragObject(e:MouseEvent):void 
{ 
    drag = e.currentTarget as MovieClip; 
    orig = new Point(drag.x, drag.y); 

    // Bring to front and start drag. 
    drag.parent.setChildIndex(drag, drag.parent.numChildren - 1); 
    drag.startDrag(); 

    // Handle drop cases. 
    stage.addEventListener(Event.MOUSE_LEAVE, dropObject); 
    stage.addEventListener(MouseEvent.MOUSE_UP, dropObject); 
} 

function dropObject(e:Event):void 
{ 
    // Stop handling drop cases. 
    stage.removeEventListener(Event.MOUSE_LEAVE, dropObject); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, dropObject); 

    // This event goes from stage so we will work 
    // with the "drag" reference saved earlier. 

    // Sanity check in case something went wrong 
    // and the reference is empty. 
    if (!drag) return; 

    drag.stopDrag(); 

    var aMatch:DisplayObject = getChildByName("target" + drag.name); 
    var aTarget:DisplayObject = drag['dropTarget']; 

    // This is your condition so I leave it as is. 
    if ((aTarget !== null) && (aTarget.parent == aMatch)) 
    { 
     drag.x = aMatch.x; 
     drag.y = aMatch.y; 
     drag.buttonMode = false; 
     drag.useHandCursor = false; 
     drag.removeEventListener(MouseEvent.MOUSE_DOWN, dragObject); 
    } 
    else 
    { 
     drag.x = orig.x; 
     drag.y = orig.y; 
    } 

    // Clean up. 
    drag = null; 
    orig = null; 
}