Reputation: 1
I am creating an interactive paper doll in Adobe Animate and am having some trouble making the drag drop feature work. I have multiple clothing items that will need to have the possibility of being dragged to the same area. For example I may have 4 different shirt options. I have started with the two dresses (yellow dress_mc & blue dress_mc). The yellow dress is working properly, but the blue dress won't work, I can drag it, but not drop it. Any suggestions?
This is the code I have right now:
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;
}
}
Upvotes: 0
Views: 342
Reputation: 7316
I'd suggest not using MOUSE_UP on dragged objects. It may fail in few cases. Also, it's a good idea to bring the dragged object to front.
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;
}
Upvotes: 2