2012-09-09 71 views
2

在舞臺上,我有一個名爲「mc」的MovieClip,裏面繪製了一個簡單的矩形。 mc也有一個名爲「btn」的Button子元素,它是另一個簡單的矩形(明顯小於mc的矩形)。然後我在舞臺上有這個代碼。AS3 - MovieClip中的按鈕觸發MC的事件

function mcDown(_e:MouseEvent):void{ 
    trace("mc"); 
} 
function btnClick(_e:MouseEvent):void{ 
    trace("btn"); 
} 
mc.addEventListener(MouseEvent.MOUSE_DOWN, mcDown); 
mc.btn.addEventListener(MouseEvent.CLICK, btnClick); 

我遇到的問題是點擊該按鈕時,也觸發mcDown事件並跟蹤兩個「MC」和「BTN」。

我該如何做到這一點,當我點擊按鈕,它只會觸發btnClick而不是mcDown?我試過MOUSE_UP而不是CLICK,同樣的問題。而mcDown事件必須保持MOUSE_DOWN。

回答

1

除了在dispatchEvent中將bubbles參數設置爲false之外,沒有辦法阻止冒泡。

dispatchEvent(EVENT_TYPE, BUBBLES,....); 

但是,您可以通過檢查避免冒泡。只需將下面的行作爲偵聽器函數的第一行,就可以避免從目標以外的所有對象派發的事件。

if(e.eventPhase != EventPhase.AT_TARGET) return; 

因此,對於您的示例代碼,當你點擊該按鈕既事件調度,但在mcDown功能後,上面說行就不會執行。

+0

謝謝,這似乎是一個單一的檢查伎倆! – Murat

+0

歡迎您:) – Moorthy

0

如果您在MC中添加按鈕,並且您單擊該按鈕,還可以單擊MC,因爲該按鈕下方的MC部分仍然存在,並且它代表整個MC,你不能刪除它。

所以最好做一個函數來檢查按鈕是否被按下,否則它會運行整個MC的函數。

這一個應該這樣做。

//add this in you constructor 

mc.addEventListener(MouseEvent.MOUSE_DOWN, myReleaseFunc); 
function myReleaseFunc(e:MouseEvent):void { 
    if(e.currentTarget.name == Btn1) //Btn1 is instance name for a button 
    { 
     Btn_func1(); 
    } 
    else if(e.currentTarget.name == Btn2) //Btn2 is another button. 
    { 
     Btn_func2(); 
     //For every button you'll need to add another function and if statement to check if that button was clicked. 
    } 
    else 
    { 
     Mc_func(); 
    } 

} 

// this outside the main class 

function Mc_func():void{ 
    //you code here 
} 
function Btn_func1():void{ 
    //you code here 
} 
function Btn_func2():void{ 
    //you code here 
} 

我認爲這種方式更有效率,它會更好,更快地工作,並且您將有很小的重載系統的機會。

+0

感謝您的回答,至少現在我知道這是不可能的我希望的方式。不幸的是,我不能使用你的方法,因爲在實際的項目中「mc」將是無名的,它將會有更多的子按鈕和各種類型的交互式內容。猜猜我必須堅持我的第一個計劃。我在下面的「mc」中創建了一個不可見的1x1按鈕,並將mcDown事件添加到該按鈕中。然後我將其scaleX和scaleY屬性設置爲「mc」所具有的任何寬度和高度。我希望也許我可以做到這一點,沒有額外的按鈕,但似乎最簡單的方法是。 – Murat

+0

我看不出爲什麼它不起作用。如果'mc'有一個名字不會改變任何東西,所以最好給它一個實例名稱。此代碼也可以被無數的對象使用。您只需要爲每個對象添加幾行。查看更新。 – Stefan4024

+0

我試圖簡化手頭的問題。在實際項目中,「mc」剪輯實例首先作爲空剪輯創建並動態添加,可以不止一個。孩子們可以有很多不同的東西,只是不可能全部加入,會有太多額外的線條。也許如果「MC」剪輯是在庫中,並有一個鏈接類,而不是一個名稱,該類可以使用getQualifiedClassName()或類似的東西。如果類名不同於MC的使用,則返回中止。 – Murat