2016-01-20 83 views
0


我前段時間開始使用as3,並且主要使用starling而不是本機flash對象。今天,我決定給一個嘗試原始閃存,並創建了一個簡單的按鈕:
點擊事件沒有達到根Flash對象

private var _button: SimpleButton; 

public function Main() 
{ 
    if (stage) init(); 
    else addEventListener(Event.ADDED_TO_STAGE, init); 
} 

private function init(e:Event = null):void 
{ 
    removeEventListener(Event.ADDED_TO_STAGE, init); 
    // entry point 
    _button = new SimpleButton(new BUTTON); //BUTTON is an embedded bitmap 
    addChild(_button); 
    _button.useHandCursor = true; 
    _button.addEventListener(MouseEvent.CLICK, OnClick); 
} 

private function OnClick(e:MouseEvent):void 
{ 
    trace("clicked"); 
} 

這definely在八哥的工作,但我發現,點擊事件不會派遣出於某種原因按鈕。鼠標上方不顯示手形光標。我嘗試了鼠標懸停,鼠標懸停和其他鼠標事件,但沒有一個能夠正常工作。我檢查了按鈕是否正確添加到舞臺。另外,當我向舞臺本身添加一個鼠標點擊事件監聽器時,通常會點擊註冊。當我向Main添加監聽器時,沒有事件再次被註冊。 我可能誤解了一些明顯的東西。也許我需要手動派遣事件給孩子們?但是,這將是很大的。或者它可能是FlashDevelop中的一個錯誤?請幫忙。

+0

SimpleButton是如何定義的? – Brian

+0

Main擴展MovieClip或Sprite嗎? SimpleButton上的mouseEnabled是否爲true? MainChild上的mouseChildren是否爲true? –

+0

@Amy Blankenship是的,它擴展了flash.display.Sprite。我沒有明確地設置mouseEnabled,但我只是試圖將Main和SimpleButton設置爲true,並將mouseChildren顯式設置爲true。但結果是一樣的。 – Aikei

回答

3

SimpleButton構造函數4個可選參數:

public function SimpleButton(upState:DisplayObject = null, 
          overState:DisplayObject = null, 
          downState:DisplayObject = null,  
          hitTestState:DisplayObject = null)` 

其中的你提供的第一個(upState):

_button = new SimpleButton(new BUTTON); //BUTTON is an embedded bitmap 

其餘默認null。這包括hitTestState,其是相同的類hitTestState的屬性:

指定被用作點擊測試對象的按鈕的顯示對象。 [...] 如果您未設置hitTestState屬性,則SimpleButton處於非活動狀態 - 它不響應用戶輸入事件。

它還包括一個解決問題的方法:

對於基本按鈕時,hitTestState屬性設置爲相同的顯示對象作爲誇大屬性。

然而,如果你想要的是按功能添加到Bitmap,它不會對自己的,因爲它不是一個InteractiveObject只需使用Sprite

// entry point 
_button = new Sprite(); 
_button.addChild(new BUTTON); //BUTTON is an embedded bitmap 
addChild(_button); 
_button.useHandCursor = true; 
_button.addEventListener(MouseEvent.CLICK, OnClick); 

僅當您需要其4個狀態的功能時才使用SimpleButton


請小心使用重載的術語「階段」:

我檢查了按鈕正確添加到舞臺。

如果你指的是「繪圖區」,你可以在的Adobe Flash IDE或「舞臺」爲主線的時間看,那麼,你是正確的,你的按鈕添加到這一點。

stageDisplayObject的財產然而是有所不同。它是顯示列表的最頂層元素,也是您的Main類實例添加到的容器,這發生在FlashPlayer的.swf執行開始時。

當你的Main類通過調用自身的addChild()增加了_button本身,按鈕被添加到Mainstage實例,這是兩個不同的對象。

+0

嘿,null。我完全忘記了我的問題。我錯過了hitTestState,這非常愚蠢。感謝您的詳細解釋。現在一切都按預期工作。 通過添加到階段I意味着它被添加到階段,通過它的父項,即在添加的對象和階段之間存在鏈接,這對於該對象被看到和相互作用是必需的,我相信。而這個事件也叫做ADDED_TO_STAGE,不是嗎? – Aikei

+0

@愛可是。我只是想提一下「舞臺」的這兩種不同含義,因爲它們經常彼此混淆。 – null