2013-07-12 121 views
0

我正在學習ActionScript 3,此刻,在此處教程http://www.senocular.com/flash/tutorials/as3withmxmlc/。它描述了一個簡單的應用程序,它將球放在舞臺上並讓用戶拖動它。但它有缺陷,尤其是因爲它不處理用戶將指針拖離舞臺的情況。這讓我想到了一個更好的辦法來處理案件。對於初學者,我正在考慮如何處理MOUSE_UP事件。我想寫的東西是這樣的:ActionScript 3,處理鼠標事件案例

public class Test extends Sprite 
{ 
    public function Test(stage:Stage) 
    { 
     mySprite = SomeSpriteClass() 
     stage.addEventListener(MouseEvent.MOUSE_UP, handleStageMouseUp); 
     mySprite.addEventListener(MouseEvent.MOUSE_UP, handleSpriteMouseUp); 
    } 

    private function handleStageMouseUp(event:MouseEvent):void { 
     // how do I determine here if there was also a MOUSE_UP on the Sprite? 
     // Perhaps I could check the click coordinates of 'event' to see if 
     // they are superimposed on the Sprite.   

    } 

    private function handleSpriteMouseUp(event:MouseEvent):void { 
     // I don't need this method if I can handle all cases in the 
     // method above. 
    } 
} 

這一議題的出現是與事件模型ActionScript3的使用,我不知道如何尋找涉及事件的組合情況。另外,正如我在handleStageMouseUp()上面的註釋中所寫的,我可以檢查是否在'mySprite'上發生了鼠標事件(我會怎麼做?)

我真的很想做的是能夠結合我所有的情況邏輯在這樣的事情:

private function handleAllCases(...):void { 
    if (..mouse up on stage but not sprite..) { 
     .. handle case ..; 
    } else if (.. mouse up on both stage and sprite ..) { 
     .. handle case .. ;    
    } 
} 

有沒有辦法做到這一點,或者更好的方式來思考呢?

回答

1

您檢查Event.targetEvent.currentTargettarget是最初派發事件的對象,而currentTarget是派發它的最新對象(通常是您的偵聽器所連接的對象)。

快速概覽。假設obj2被舞臺上的obj1包裹。快速層次:

-Stage 
--obj1 
---obj2 

如果要觸發一個事件(即氣泡,這一點很重要,因爲它允許一個事件要經過其父母,直到它到達一個事件處理程序,我相信所有MouseEvent就做這個。)在obj2並且有一個監聽器連接到Stage,obj2將成爲目標,Stage將成爲currentTarget。

那麼這對你如何工作呢?那麼,你只需要檢查什麼目標和currentTarget來確定事件的起始位置和目前位置。在對象上

插入閃存此點擊並在不同地點釋放,並看看你的控制檯(我沒有測試這個):

import flash.display.*; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x000000); 
mySprite.graphics.drawRect(0,0,100,100); 
mySprite.graphics.endFill(); 
addChild(mySprite); 
stage.addEventListener(MouseEvent.MOUSE_UP, handleStageMouseUp); 

function handleStageMouseUp(e:MouseEvent):void {  
    trace("handleStageMouseUp - target == stage: " + (e.target == this.stage)); 
    trace("handleStageMouseUp - target == mySprite: " + (e.target == mySprite)); 
    trace("handleStageMouseUp - currentTarget == stage: " + (e.currentTarget == this.stage)); 
    trace("handleStageMouseUp - currentTarget == mySprite: " + (e.currentTarget == mySprite)); 
    trace("--------"); 
} 

在大多數情況下,在你stageUp處理程序,可以檢查e.target == mySprite是否也發生在mySprite上。

雖然這裏有一個警告。如果你的Sprite有孩子,那麼其中一個孩子將成爲目標。但是,如果您設置了mySprite.mouseChildren = false,則它不會在小孩身上註冊鼠標事件,這意味着其行爲與上例中的行爲相同。

希望可以幫到

+0

看起來不錯。我喜歡你的回答,但我還沒有足夠的聲望。 – composerMike

+0

如果這樣可以正確回答問題,則應將其標記爲正確(單擊答案旁邊的檢查大綱)。這將有效地解決問題並幫助您獲得聲譽,因此您可以在未來做諸如upvote之類的事情。 –