2011-02-28 45 views
0

當我點擊並按住它們並停止釋放它們時,我想要移動的Sprites。我有一個事件偵聽器添加到精靈方法:Sprite不停地拖動MOUSE_UP

public function layOutEventListeners():void 
    { 

     var addSpriteEventListener:Function = 
     function(spr:Dictionary, index:int, vector:Vector.<Dictionary>) 
     { 
      spr["sprite"].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
      spr["sprite"].addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
     } 

     gridVec.forEach(addSpriteEventListener); 
    }` 

和方法來處理事件:

public function mouseDownHandler(me:MouseEvent):void 
    { 
     trace(me.target.toString()); 
     trace(me.currentTarget.toString()); 

     this.drawSprite(me.target); 
     this.growByTwo(me.target); 
     me.stopImmediatePropagation(); 

     me.currentTarget.startDrag(me); 
    } 

    public function mouseUpHandler(me:MouseEvent):void 
    { 
     trace(me.target.toString()); 
     trace(me.currentTarget.toString()); 

     me.stopImmediatePropagation(); 
     this.originalSize(me.target); 
     me.currentTarget.stopDrag(); 
    }` 

我的問題是:當我點擊精靈,只要我移動光標,Sprite的註冊點捕捉到光標,當我釋放鼠標時,Sprite不停止跟隨光標。我最初認爲這是像素碰撞的問題。我認爲光標沒有觸及MOUSE_UP上的任何東西,但在我進行實驗後證明是錯誤的。我甚至通過啓動另一個項目來複制完全相同的事件添加和處理方法,並發現我沒有這個問題。測試Sprite只是簡單地像往常一樣拖動和放下,而不是捕捉到註冊點,並被點擊的點拖動。

唯一的區別我可以看到,也是我唯一的懷疑,是精靈在我的原代碼被添加到雪碧,然後將其添加到舞臺,而雪碧在測試項目正在添加到根DisplayObject。我在想,這個事件以某種方式傳播到容器Sprite並拖放它,而不會丟棄另一個Sprite。我看到的怪異捕捉可能是光標捕捉到另一個精靈後面的對象。另一個重要的事情是:當我將一個Sprite放在另一個Sprite的頂部時,該Sprite停止像我想要的那樣移動,但仍然跟蹤註冊點。

無論如何,我真的很難過,我真的不知道我跑完了。有任何想法嗎?

回答

1

這通常是因爲有時鼠標是不是在剪輯時MOUSE_UP發生,或者是因爲其它剪輯的方式獲得或可能的播放器沒有刷新階段速度不夠快,等...

我我不確定這是你的情況,但是無論哪種方式,經常建議將MOUSE_UP事件分配給舞臺,這樣你就可以安全地確保它始終被觸發。確保雖然卸下mouseUp處理監聽;)

spr["sprite"].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
public function mouseDownHandler(me:MouseEvent):void { 
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 
public function mouseUpHandler(me:MouseEvent):void { 
    stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 

不利的一面是,你失去mouseUp事件的剪輯引用,但你可以手動創建對鼠標按下的引用,或做內部整件事(在精靈的代碼中)。