2013-03-27 96 views
1

脚本问题是,每个movieclip调度向下和向上鼠标事件,但鼠标移动事件不是由某些影片剪辑调度,这是一个意外的行为,而我跟踪了down事件,并且它成功跟踪每个对象ActionScript 3鼠标移动事件不发送

也建议您对我的代码的反馈,谢谢。

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; 

      } 

     } 
+0

你有你的鼠标MouseMove函数内的事件? – joshua 2013-03-27 13:07:13

+1

尝试在注册鼠标移动事件时使用e.target not item。 – 2013-03-27 13:09:28

+0

感谢Lukasz'Severiaan'Grela – justnajm 2013-03-28 11:37:08

回答

0
 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 

     { 

    } 
+0

感谢朋友,但e:事件没有任何属性,比如e.stageX – justnajm 2013-03-27 17:04:27

+0

显然你可能需要写这个更好,但它确实工作,因为我使用3d应用程序的这种方法 – joshua 2013-03-28 02:39:55

1

不能肯定,但我认为它可能是你期待的剪辑继续派遣MouseEvent.MOUSE_MOVE事件甚至一度鼠标已经离开夹 - 这不会发生,只有当本地鼠标指针坐标(即yourClip.mouseX/mouseY)与剪辑本身的图形相交时,它才会触发 - 即使在拖动剪辑时,也不能保证它将分派MOVE事件。

我们假设你的剪辑都在根目录,这意味着你有机会获得 '舞台' - 你可以这样做:

取代:

item.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove); 

有:

stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove); 

...但您应该记得在必要时删除该事件(如果鼠标未在剪辑上释放,请再次使用舞台):

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); 
    } 
+0

Thanks @ MickMalone1983但在我的情况下,我正在移动剪辑,而鼠标停下来,并停止使用鼠标移动。移动时我需要剪辑的x和y值。但没有运气:( – justnajm 2013-03-27 17:01:27

+0

您可以使用mouseMove函数来获取这些,它会发送一个MouseEvent,您可以从中获取e.target.x/y – MickMalone1983 2013-03-27 17:42:47