2011-09-15 138 views
0

我正在爲我的Flash應用程序(AS3和Flash CS5)開發drag'n'clone功能。克隆創建完美,但是當我嘗試拖動最近創建的克隆時,應用程序會創建一個新克隆(並允許我拖動它)。事件不會從AS3中的偵聽器中刪除

我想刪除此行爲:克隆只應拖放,不克隆。我的代碼是:

public class Car extends MovieClip 
    { 

     // imports... 

     public function Car() 
     { 
      addListeners(); 
     } 

     private function addListeners():void 
     { 
      this.addEventListener(MouseEvent.MOUSE_DOWN,clone); 
     } 

     private function clone(e:MouseEvent):void 
     { 
      // Clone the object 
      var newcar = new e.target.constructor; 
      newcar.graphics.copyFrom(this.graphics); 
      newcar.x = this.x; 
      newcar.y = this.y; 

      this.parent.addChild(newcar); 

      newcar.addEventListener(MouseEvent.MOUSE_MOVE,dragCar); 
      newcar.addEventListener(MouseEvent.MOUSE_UP,dropCar); 
     } 

     private function dragCar(e:MouseEvent):void 
     { 
      e.target.startDrag(); 
     } 

     private function dropCar(e:MouseEvent):void 
     { 
      e.target.stopDrag(); 

        // This line doesn't remove the event, and I don't know why 
      e.currentTarget.removeEventListener(MouseEvent.MOUSE_DOWN,clone); 

      e.target.removeEventListener(MouseEvent.MOUSE_MOVE, dragCar); 
      e.target.removeEventListener(MouseEvent.MOUSE_UP,dropCar); 

     } 

    } 

我希望有人能幫助我。謝謝!

回答

1

這裏因爲你是在克隆功能創造汽車的新實例,新車對象的構造函數被調用這反過來調用addListeners()和克隆具有MOUSE_DOWN事件偵聽器再次克隆的克隆。這就是爲什麼你有你描述的問題。

爲了避免這種情況,你需要在你克隆功能,添加以下行(這不起作用見下面編輯

newcar.removeEventListener(MouseEvent.MOUSE_DOWN,clone); 

這個來自克隆(新)汽車實例移除克隆事件監聽器並避免再次克隆。

此外,要開始拖動你應該在MOUSE_DOWN而不是MOUSE_MOVE。

更新
好,我看,MOUSE_DOWN不會再次呼籲克隆,所以你需要使用MOUSE_MOVE。因此,在這種情況下,我將刪除偵聽器正文中的MOUSE_MOVE偵聽器,以便僅調用一次。

更新
這似乎刪除事件偵聽器。

newcar.removeEventListener(MouseEvent.MOUSE_DOWN, newcar.clone); 

你必須參考newcar實例的clone方法newcar.clone刪除事件偵聽器。

工作守則
下面的代碼工作得很好

package{ 
    import flash.display.MovieClip; 
    import flash.events.*; 
    public class Car extends MovieClip 
    { 
     public function Car() 
     { 
      addListeners(); 
     } 

     private function addListeners():void 
     { 
      this.addEventListener(MouseEvent.MOUSE_DOWN,clone); 
     } 

     private function clone(e:MouseEvent):void 
     { 
      // Clone the object 
      var newcar = new e.target.constructor; 
      newcar.graphics.copyFrom(this.graphics); 
      newcar.x = this.x; 
      newcar.y = this.y; 

      this.parent.addChild(newcar); 

      // remove the clone listener 
      newcar.removeEventListener(MouseEvent.MOUSE_DOWN, newcar.clone); 

      // add dragging listeners 
      newcar.addEventListener(MouseEvent.MOUSE_MOVE, dragCar); 
      newcar.addEventListener(MouseEvent.MOUSE_UP, dropCar); 

      // this is used for dragging the clone 
      newcar.addEventListener(MouseEvent.MOUSE_DOWN, dragCar); 
     } 

     private function dragCar(e:MouseEvent):void 
     { 
      // if a MOUSE_MOVE event listener is registered remove it 
     if(e.target.hasEventListener(MouseEvent.MOUSE_MOVE)) 
      e.target.removeEventListener(MouseEvent.MOUSE_MOVE, dragCar); 
      e.target.startDrag(); 
     } 

     private function dropCar(e:MouseEvent):void 
     { 
      e.target.stopDrag(); 

      // do not remove the listener if you want the clone to be dragable 
      // e.target.removeEventListener(MouseEvent.MOUSE_UP,dropCar); 
     } 
    } 
} 

保持克隆dragable
對於這個在上面的代碼中,我添加了一個MOUSE_DOWN事件偵聽器拖動克隆

newcar.addEventListener(MouseEvent.MOUSE_DOWN, dragCar); 

並註釋掉了e.target.removeEventListener(MouseEvent.MOUSE_UP,dropCar); in dropCar

此外,在刪除MOUSE_MOVE偵聽器之前,檢查是否存在或不存在,因爲此函數稍後也將由MOUSE_DOWN調用。

+0

因此,我正在消除事件,但它仍然存在。我該如何解決它?謝謝! –

+0

看看我的答案的更新,我們需要參考'newcar'實例的'clone'函數作爲'newcar.clone' – danishgoel

+0

感謝隊友,但現在我不能拖放克隆,我想做到這一點。我該怎麼做?非常感謝。 –