justnajm
justnajm

Reputation: 4534

ActionScript 3 Mouse Move event not dispatching

Script problem is that every movieclip dispatch down and up mouse event but mouse move event is not dispatching by some movieclips, which is an unexpected behaviour while I have traced the down event and it trace successfully on every object

also recommend your feedback on my code, thanks.

    private function loadPurchasedClip(){
            var decorationItem:String;
            var lastItemIndex:uint = this.getChildIndex(tree1);
            var item:Sprite;

            for(var a in purchasedItems){

                for(var b in purchasedItems[a]){

                if(purchasedItems[a][b].item=='shed'){
                    item = new shed();
                } else {

                    var ClassDefinition:Class = loadedDecorationItem.purchaseItem(purchasedItems[a][b].item) as Class;


                    item = new ClassDefinition();

                }
                item.x = purchasedItems[a][b].posX;
                item.y = purchasedItems[a][b].posY;


                item.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent){
                        Mouse.cursor = "hand";
                        e.target.startDrag(false);

                        dusbin.visible = true;
                    item.addEventListener(MouseEvent.MOUSE_MOVE,trashMe);
                });

                item.addEventListener(MouseEvent.MOUSE_UP,function(e:MouseEvent){

                    Mouse.cursor = "auto";
                    e.target.stopDrag();
                    externalPhpCall(e);
                    dusbin.visible = false;
                    if(trashClip){
                        removeChild(trashClip);
                        trashClip = null;
                    }
                });
                item.mouseChildren = false;


                // if item is fence or flowers then move them behind the tree
                if(
                    String(purchasedItems[a][b].item).indexOf('fence')!=-1
                    ||
                    String(purchasedItems[a][b].item).indexOf('flower')!=-1
                ){
                    addChildAt(item,lastItemIndex);

                    lastItemIndex++;
                } else {
                    addChildAt(item,this.numChildren-2);
                }

                purchasedNameAr[getChildIndex(item)] = purchasedItems[a][b].item;

            }

        }

Upvotes: 1

Views: 3096

Answers (2)

MickMalone1983
MickMalone1983

Reputation: 1054

Can't be sure, but I think it's probably that you're expecting a clip to continue to dispatch MouseEvent.MOUSE_MOVE events even once the mouse has left the clip - this won't happen, it's only whilst the local mouse pointer co-ordinates (ie yourClip.mouseX/mouseY) intersect the graphics of the clip itself that it will fire - even when dragging a clip, it can't be guaranteed that it will dispatch a MOVE event.

Let's suppose your clips are all on the root, which means you have access to 'stage' - you could do this:

replace:

item.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);

with:

stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);

...but you should remember to remove that event when necessary (use stage again, in case mouse is not released over the clip):

 stage.addEventListener(MouseEvent.MOUSE_UP,endMove);


//Don't use anon function as won't have stage reference:

function endMove(e:MouseEvent):void {
        //The rest of your code, then:
        stage.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
    }

Upvotes: 1

joshua
joshua

Reputation: 684

        private  function loadPurchasedClip(){
        var decorationItem:String;
        var lastItemIndex:uint = this.getChildIndex(tree1);
        var item:Sprite;
        var Move:Boolean

        for(var a in purchasedItems){

            for(var b in purchasedItems[a]){

            if(purchasedItems[a][b].item=='shed'){
                item = new shed();
            } else {

                var ClassDefinition:Class = loadedDecorationItem.purchaseItem(purchasedItems[a][b].item) as Class;

                item = new ClassDefinition();

            }
            item.x = purchasedItems[a][b].posX;
            item.y = purchasedItems[a][b].posY;
            item.addEventListener(e:Event.ENTER_FRAME, onEnterFrame);
            item.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent){
                    Mouse.cursor = "hand";
                    e.target.startDrag(false);
                    Move = true
                    dusbin.visible = true;

            });

            item.addEventListener(MouseEvent.MOUSE_UP,function(e:MouseEvent){

                Mouse.cursor = "auto";
                e.target.stopDrag();
                externalPhpCall(e);
                dusbin.visible = false;
                if(trashClip){
                    removeChild(trashClip);
                    trashClip = null;
                }
            });
            item.mouseChildren = false;

            // if item is fence or flowers then move them behind the tree
            if(
                String(purchasedItems[a][b].item).indexOf('fence')!=-1
                ||
                String(purchasedItems[a][b].item).indexOf('flower')!=-1
            ){
                addChildAt(item,lastItemIndex);

                lastItemIndex++;
            } else {
                addChildAt(item,this.numChildren-2);
            }

            purchasedNameAr[getChildIndex(item)] = purchasedItems[a][b].item;

        }
        function onEnterFrame(e:Event):void{
         if(Move){
        // what ever here

        {

    }

Upvotes: 0

Related Questions