Search code examples
arraysactionscript-3drag-and-dropaddchildtargets

AS3: how to addChild from an array of MC's based on e.target?


I have an array of 8 movie clips which can be dragged and dropped onto an MC that is their common hitObject.

I would like whichever mc is being dragged to be added as the child of the hitObject MC when it is dropped, however I am having troubles setting up the code. Currently, only one specific instance will be added as a child of the hitObject because I don't know what to write inside the addChild() parameter aside from a specific instance name (none of the following are acceptable: e.target, the array name, the MovieClip name).

Here's my code --any and all help will be most appreciated:

import flash.events.MouseEvent;
import flash.display.MovieClip;

var redArray:Array = [red,red1,red2,red3,red4,red5,red6,red7];

redArray.forEach(setupDrag);
function setupDrag(dragger:MovieClip, index:int, array:Array):void {
    dragger.addEventListener(MouseEvent.MOUSE_DOWN, dragRed);
    dragger.buttonMode=true;}

redArray.forEach(setupDrop);
function setupDrop(dropper:MovieClip, index:int, array:Array):void {
    dropper.addEventListener(MouseEvent.MOUSE_UP, dropRed);
    dropper.buttonMode=true;}

var dirt:MovieClip

function dragRed(e:Event):void{
        dirt = e.currentTarget as MovieClip;
        e.target.startDrag();
}

function dropRed(e:Event):void{
        e.target.stopDrag();
        if (e.target.hitTestObject(drawer_mc))
        {
        drawer_mc.addChild(red1);
        red1.y=10;
        }
}

Thanks in advance!


Solution

  • You're almost there. You want to pass either target or currentTarget as the argument to addChild. I think the following should do it (I've just posted the bits I've updated).

    And there's a good explanation of the difference between target and currentTarget here.

    var dirt:MovieClip;
    
    function dragRed(e:Event):void {
            // sounds like currentTarget and target will both work in your
            // case, but stick to one or the other for consistency
            dirt = e.currentTarget as MovieClip;
            dirt.startDrag();
    }
    
    function dropRed(e:Event):void{
            // assigning the currentTarget to your dirt variable means you don't 
            // keep needing to refer to e.currentTarget throughout the function
            dirt = e.currentTarget as MovieClip;
            dirt.stopDrag();
            if (dirt.hitTestObject(drawer_mc)) {
                // now you're always adding the instance that triggered 
                // the mouse up event
                drawer_mc.addChild(dirt);
                dirt.y=10;
            }
    }