2017-03-01 58 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; 
}