2013-10-02 52 views
0

傍晚,並提前感謝您的智慧。AS3:避免同一類別的多個實例

熊與我,如果我表現出的無知,但這裏是我的項目是如何建成目前:

-TitleScreen:這似乎是一流的。擴展Sprite。 -Startup:我用來調用其他類的類。擴展Sprite。遊戲畫面:「遊戲引擎」類。擴展AssetsHandler。 -AssetsHandler:其中大多數操作資產的方法都是。擴展GrfAssetsStore。 -GrfAssetsStore:其中存儲所有圖形資產。擴展Sprite。 -Level01:一級課程。擴展GameScreen。

現在:當我開始一切時,一切都是h d。所以,假設我完成了第一級,並且我想重新啓動,或者轉到標題屏幕:再次沒有問題,但是我重新實例化了GameScreen類,接着是AssetsHandler,接着是GrfAssetsStore。請注意,我沒有設置任何將其稱爲回覆的EventListener,我試圖確保一旦啓動,它們將不受干擾 - 但在我的無知中,我現在已經意識到重新啓動Level01會再次延長其他類。

可以理解,這是非常不可取的,但到目前爲止我無法克服它。我嘗試在Level01中實例化超類,它同樣存在問題。

目標很大程度上是在引擎蓋下運行GameScreen,AssetsHandler和GrfAssetsStore,可以這麼說,新層次開始和結束時,但又沒有重新啓動超類,只是從中獲取方法/變量等。

所以:我該如何克服這個問題?不,我在AS3方面經驗不足,所以我很感謝這對於實際的專家是顯而易見的,因此我爲什麼在這裏。

如果我需要更好地說一些話,請不要猶豫,說這樣的話。

編輯:現在的問題我相信不是擴展,但我沒有正確地引用變量等,謝謝喬希幫助我實現這樣的。正如你所提到的,否認OOP的一個主要方面是沒有意義的:因此我應該考慮不應用那種不正確的邏輯。

我會嘗試更好地GC(並強制GC,如果有必要),直到我已正確刪除所有引用。如果這不起作用,但我會發布另一個更詳細的問題。

+0

爲什麼要重新實現level01一個問題?爲什麼這是不可取的? –

+0

重新啓動Level01不是問題,因爲在重新啓動之前我已經從它刪除所有的孩子:prob是擴展類被重新調用,複製所有這些類變量,兒童,監聽器等,並導致不一致和內存負擔 – ReaperOscuro

回答

1

您可以將它設置爲Singleton。

基本結構:

public class ClassName { 

    private static var _instance:ClassName; 
    public function ClassName() { 
     // run normal constructor code here 
    } 

    public static function get instance():ClassName { 
     if (!_instance) { 
      _instance = new ClassName(); 
     } 
     return _instance; 
    } 
} 

所以不是你曾經在你的代碼中調用new ClassName(),你只需要調用ClassName.instance訪問這個類的一個實例。這將每一次返回相同的單個實例,並在尚未創建時創建它。這將確保在任何給定時間永遠不會有多於一次的代碼實例(假設您從不稱呼new ClassName()當然)

請注意,這不是一個應該經常使用的設計模式,如果有的話。它違背了基本的面向對象原則,因此也是一個備受爭議的設計模式。我認爲在這種情況下這是有效的,因爲您不希望在任何給定時間運行多個遊戲實例,但在大多數情況下,您應該編寫代碼以避免此模式。

http://en.wikipedia.org/wiki/Singleton_pattern

+1

http://gskinner.com/blog/archives/2006/07/as3_singletons.html – Pier

+0

@Pier很好找。格蘭特斯金納的AS3文檔是其中最好的。 –

+0

非常感謝喬希 - 儘管如此,使用一個功能來解決面向對象的最佳方面似乎很愚蠢,無論如何,我會給它一個甘德,看看我該怎麼去。 – ReaperOscuro

相關問題