Search code examples
actionscript-3flashresetrecycle-bin

AS3 Object Bin and Reset Button


I am trying to create a game for kids where they can drag letters on to a stage to make words.

I want to add a 'trash can' where users can drag letters they no longer need to dispose of them. I have created the movie clip but am totally unsure how to make it function using AS3.

I would also like to add a reset button so that the stage reverts to it's original state. Again, I have drawn it up and added the little as3 that I am aware of (to make it a button) but if anyone could assist with how to actually make this happen, I would be grateful.

The files are here: SWF | FLA and the code for the game is as follows:

import flash.display.MovieClip;

for (var i=1; i<27; i++)
{
    this["object" + i].addEventListener(MouseEvent.MOUSE_DOWN, onStart);
    this["object" + i].addEventListener(MouseEvent.MOUSE_UP, onStop);
}    

var sx = 0,sy = 0;

function onStart(e)
{
    sx = e.currentTarget.x;
    sy = e.currentTarget.y;
    e.currentTarget.startDrag();
}

function onStop(e)
{
    if ( e.target.dropTarget != null && 
         e.target.dropTarget.parent == dest && 
         e.currentTarget.name != "copy" )
    {
        var objectClass:Class = 
        getDefinitionByName(getQualifiedClassName(e.currentTarget)) as Class;

        var copy:MovieClip = new objectClass();
        copy.name = "copy"; 
        this.addChild(copy);
        copy.x = e.currentTarget.x;
        copy.y = e.currentTarget.y;

        e.currentTarget.x = sx;
        e.currentTarget.y = sy;

        copy.addEventListener(MouseEvent.MOUSE_DOWN, onStart);
        copy.addEventListener(MouseEvent.MOUSE_UP, onStop);
    }       
    e.currentTarget.stopDrag();
}


resetButton.addEventListener(MouseEvent.CLICK, reset);
resetButton.buttonMode = true;

function reset(event:MouseEvent):void
{

//Not sure what AS3 to add here to reset to original state

}

Solution

  • I have already gave you the solution here Flash AS3 Clone, Drag and Drop

    Here, I am providing a detail solution on how to drag objects inside a bin and remove them.

    For dropping copied objects inside a bin, after dragging is stopped, check collision with bin object. for more info see,

    copiedObject.hitTestObject(binObject)

    For e.g.

    First create trash-can MovieClip on the stage and give it an instance name 'trashCan' and add following lines to your onStop()(below e.currentTarget.stopDrag();)function like so:

    UPDATE:

    var copiedObjsArr:Array = [];    
    
    function onStop(e)
    {
        if ( e.target.dropTarget != null && 
         e.target.dropTarget.parent == dest && 
         e.currentTarget.name != "copy" )
        {
           //Code here remains same
           //.......
    
           //Keep collecting copied letters for further access in `reset()` function 
           copiedObjsArr.push(copy);
        }
        else if(e.currentTarget.name == "copy") //this is 'else if' (newly added)
        {
           var tarObject:MovieClip = e.currentTarget;
    
           // These detects collision of dragged object with the trashCan
           if(tarObject.hitTestObject(trashCan)) {
    
              //These removes dragged object from the display list (not from the memory)
              removeChild(tarObject); 
    
              tarObject = null; //to garbage
           }
        }
    
        e.currentTarget.stopDrag();
    }
    

    And your reset() becomes like so:

     function reset(event:MouseEvent):void
     {
    
         if(copiedObjsArr.length > 0)
         {
             //Traverse through all copied letters
             for(var i:int = 0; i<copiedObjsArr.length; i++)
             {
                 var objToRemove:MovieClip = copiedObjsArr[i];
    
                 removeChild(objToRemove);
    
                 objToRemove = null;
             }
    
             //Finally empty the array
             copiedObjsArr = [];
         }
     }