2013-10-31 42 views
0

我有一個類和一個GameScreen類。在GameScreen類中,我有一個按鈕將用戶返回到主菜單。但是,我的gotoMainMenu功能是在類。我試圖讓gotoMainMenu函數爲靜態函數,但在函數內部調用非靜態函數。從另一個類訪問函數和變量

目前我有這個代碼,經過gotoMainMenu功能到我gameScreen對象:

gameScreen = new GameScreen(gotoMainMenu); 

GameScreen構造我給你這個實例變量,然後我添加一個事件聽衆使用該實例變量作爲第二個參數,如下所示:

backArrowButton.addEventListener(MouseEvent.CLICK, gotoMainMenuMainFunction); 

這是一個公司方法來做到這一點?如果不是,你能否提供另一種不被認爲是錯誤編碼的解決方案?

我有另一個非常相似的問題。我有一個英雄類,它需要訪問我的GameScreen類中的許多變量。我知道靜態變量是一個修復,但我被教導說這是不好的編碼,而且靜態變量只能用於常量。

目前,我在實例變量作爲傳遞這樣的參數:

hero = new Hero(levelData, map, gameCont); 

然後在英雄 I類分配這些參數的實例變量,非常相似,我如何傳遞的功能。這些變量引用同一個對象。我需要在原始數據類型通入的onEnterFrame函數是這樣的:

hero.onEnterFrame(up, left, right, mouse); 

這樣做的問題是,我不喜歡存儲實例變量,即是指相同的對象,在2個單獨的類。我覺得有更好的方法來做到這一點。請爲這兩個問題提供解決方案,並確保它不被認爲是錯誤的編碼。

回答

0

首先,你的第一個問題的解決方案確實被認爲是一種不好的編碼習慣。

現在讓我們繼續解決您的問題。正如我看到你正在Main類中創建一個GameScreen實例。這意味着您有該對象的引用,因此您可以添加一個自定義事件的事件偵聽器,以告知您的類返回到主菜單。您的代碼將是這樣的:

// you just create your instance, without the Function parameter 
gameScreen = new GameScreen(); 

// then you add an event listener for your custom event 
gameScreen.addEventListener(MyGameEvent.GOTO_MAIN_MENU, gotoMainMenu); 

現在注意,這將通過您的自定義事件的實例作爲參數傳遞給gotoMainMenu方法,讓你的gotoMainMenu方法的定義應該是這樣的:

private function gotoMainMenu(e:MyGameEvent):void {...} 
// or if you'd like to call this method on a click, use the parent of all events Event class: 
private function gotoMainMenu(e:Event):void {...} 

請注意,我們更改了MyGameEvent類與更一般Event類。

現在您必須創建MyGameEvent才能在需要時添加自定義類型甚至自定義數據。 對於這一點,你必須擴展Event類是這樣的:

package 
{ 
    import flash.events.Event; 

    public class MyGameEvent extends Event 
    { 
     public static const GOTO_MAIN_MENU:String = "MyGameEvent.GOTO_MAIN_MENU"; 

     public function MyGameEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) 
     { 
      super(type, bubbles, cancelable); 
     } 
    } 
} 

當你需要從GameScreen返回主菜單隻需調用從EventDispatcher類繼承的dispatchEvent方法(SpritesMovieClips也有這種方法,因爲它們繼承EventDispatcher):

dispatchEvent(new MyGameEvent(MyGameEvent.GOTO_MAIN_MENU)); 

如果編譯器讓你在此調用錯誤,請確保您的GameScreen類擴展的其中之一:EventDispatcherSpriteMovieClip。正如Pier建議的那樣,通過對Hero類的引用並沒有那麼糟糕,它可能在大型項目中變得麻煩,因爲它會耦合你的代碼,但是你可以使用一些設計模式作爲解決方案。

0

傳遞引用本身並不錯。另外每個引用只佔用幾個字節的內存。

以這種方式使用引用的問題是您的代碼變得耦合了,並且從長遠來看,您不希望這樣。當然,如果你有一個有3個類的項目,它並不重要,但是在更大的項目中,保持你的心理健康和能夠重用你的代碼變得至關重要。

爲了解決這些耦合問題,很久以前一些人發明了許多不同的design patterns。要解決您的溝通問題,您可以使用例如Observer patternSingleton pattern

另一種選擇,而不是傳遞引用將使用事件。如果你這樣做,我強烈建議使用Robert Penner's Signals