0

我有兩個類如何在另一個類中使用as3 addevent偵聽器調用方法?

一個主類 - 類遊戲

Public Class Game 
{ 

    private var m_navButtons:NavButtons; 

    public function Game() 
    { 
     setUpLevelSelect(); 


    } 

    public function setUpLevelSelect():void 
    { 
     addChild(levelsMovieClip); 
     // when i click a level it plays the game 

    } 
    public function playGame():void 
    { 
     // plays game and add navButtons 
     m_navButtons = new NavButtons(this.stage); 

    } 

} 

另一個類,增加了小的導航按鈕,遊戲關卡稱爲navButtons

public class NavButtons extends MovieClip 
{ 
    public function NavButtons(stage:Stage) 
    { 
     // addNavigation to stage 
     m_stage = stage; 

     m_stage.addChild(icon); 

     // addeventlisteners 
     icon.backButton.addEventListener(MouseEvent.CLICK, goBackToLevelSelect); 

    } 

    public function goBackToLevelSelect(event:MouseEvent):void 
    { 

// now i would like to call Game.setUpLevelSelect(); 


// but when i click the icon.backButton it says Cannot access a property or method of a null reference 
    } 

} 

在NavButtons我有頂部把public var game:Game;

我有一種感覺,因爲我想回到我的主要文檔類「G艾米「但我不知道如何繞過它。

回答

1

有幾種方法可以做到這一點。

第一種方法是發送一個事件。這是孩子與父母溝通的適當方式。

在遊戲:

navButtons.addEventListener("customEventTypeHere", this.setUpLevelSelect); 

在NavButtons:

public function goBackToLevelSelect(event:MouseEvent):void 
{ 
    this.dispatchEvent(new Event("customEventTypeHere")); 
} 

你也可以直接從遊戲,而不是在NavButtons附加的MouseEvent偵聽器的按鈕。顯然,你需要使backButton公開。這在技術上是正確的,但它消除了一個抽象層,因爲父母現在依靠的是後退按鈕對象的類

內是在遊戲介紹:

navButtons.backButton.addEventListener(MouseEvent.CLICK, this.setUpLevelSelect); 

你可以在setUpLevelSelect通過構造函數傳遞。這被稱爲回調,而不是監聽器。這是處理這個問題的好方法,因爲它意味着NavButtons類可以被其他類輕鬆使用。您只需傳遞適當的回調,並按照您期望的方式工作。它的缺點是引用了該函數,這意味着另一件事要清理垃圾收集,但是。

public var backButtonCallback:Function; 
public function NavButton(stage:Stage, backButtonCallback:Function) { 
    this.backButtonCallback = backButtonCallback; 
} 

public function goBackToLevelSelect(event:MouseEvent):void 
{ 
    this.backButtonCallback(); 
} 

最後的辦法是,不應該在所有的,老老實實在這裏還是在很多地方使用的方式。但它是一種選擇,即使它違背了基本的面向對象原則。基本上,你通過將它的實例存儲在一個靜態屬性中並通過那裏訪問你的公共函數,將遊戲變成一個部分單例。這是不是建議,除非你有這樣做的具體原因,並且只能在只有一個遊戲實例時才能工作。

在遊戲:

public static var instance:Game; 

public function Game() { 
    instance = this; 
} 

在NavButtons:

public function goBackToLevelSelect(event:MouseEvent):void 
{ 
    Game.instance.setUpLevelSelect(); 
} 

我能想到的一些其他方法可以做到這一點,但這些肯定是四個,你應該考慮的問題。我個人的建議是使用第一個建議

+0

謝謝你的快速反應和很好的解釋,我試了你說的第一個,但它出現了一個錯誤,計數不匹配在遊戲/ setUpLevelSelect()。預計0,得到1. :( –

+0

)您需要添加'e:Event = null'作爲您的'setUpLevelSelect'方法的參數。所有事件都要求處理函數的第一個參數是匹配的'Event' –

+0

Thankyou幫助,我會標記你的問題爲答案,它似乎很好,因爲它調用我已經放在那裏的跟蹤語句。但由於某種原因,我的addChild(levelsMovieclip)似乎並未被識別,因爲movieclip沒有添加請點擊跟蹤說明 –

相關問題