2011-02-26 27 views
1

我現在正在做一個遊戲,幾乎所有的東西都有它自己的類。我覺得我有一個問題的主要課程是我的'級別'和'對象'類。這個關卡類包含了關卡中每個圖像的圖像,而Object類包含了屏幕上每個物體的圖像(一個物體幾乎是任何東西:玩家,敵人,物品等)。在程序中的任何位置都可以訪問變量的最佳方式是什麼?

我現在的方式是,Object類有一個圖像,當你創建一個新的對象,你加載一個新的圖像。因此可以說,你有兩個敵人使用相同的圖像,這兩個對象的實例將單獨加載圖像,我會在內存中有兩個相同的圖像。這似乎是一個非常糟糕的主意,後來當我的遊戲變得更加複雜時,它會減慢很多。

所以我在想的是做一個類似資源管理器類的東西,它可以容納所有的圖片,而且每個對象只會向資源管理器詢問它需要的圖片。這樣它只會存儲一次圖像並節省一些空間。

我可能很容易用Object類中的靜態變量來做到這一點,但由於Level類也需要使用圖像,因此它也需要訪問資源管理器。將一個指向資源管理器的指針發送給每個對象/級別的實例(或其他任何後來需要它的類)並且以這種方式訪問​​它會是最好的嗎?或者有沒有更好的方法來做到這一點?

+1

最好的方法(一般)沒有這樣的變量。 – delnan 2011-02-26 20:58:40

回答

3

通常應避免「使變量從任何地方訪問」 - 見here爲什麼。

就你而言,這意味着讓ResourceManager可以從任何地方訪問是一個壞主意。我建議你按照你在帖子中所說的做 - 讓每個遊戲對象都有一個指向資源管理器的指針。

未來它可能會變成你的遊戲對象也需要知道其他核心對象。例如,您的遊戲對象可能需要調用中央遊戲狀態的方法。然後是有意義的創建核心類是這樣的:

class Core { 
    public: 
    ... 
    ResourceManager& resourceManager(); 
    GameState& currentGame(); 
    // and so on 
}; 

而且你的基地遊戲物體類保持一個指針只是核心。然後,你可以創建一個這樣的遊戲對象:

Core core; // performs some initialization 
core.startGame(); 
Enemy enemy(&core); // it's easy to pass the core to the game object 

有基本遊戲對象類要求在其構造核心&,並提供保護Core& GameObject::core()功能。

+0

我會建議不要在各地傳遞一種全球範圍的參考。如果這使得訪問任何服務變得容易,這會導致很多依賴和意大利麪代碼。 – david 2011-02-26 22:11:07

1

我想我會做這種方式:

1)有一個資源管理器類負責加載你需要的一切。

2)中的每個對象(圖像或任何其他)具有相關聯的字符串,爲了能夠這樣做:

管理器 - > setResource( 「levelImage」);

registerResource可以被使用,一個freeResource,或任何你喜歡的東西。

這樣,您就可以輕鬆地訪問你需要的一切,我認爲:)

+0

我也推薦這種方法。我每天都在個人項目中使用它。 – 2011-02-26 21:06:52

3

這類問題通常與Singleton模式解決。確保在應用它的任何特定版本之前查看該模式的各種問題。

+0

用於查看單例反模式的問題 – 2011-02-26 21:31:16

0

我會這樣做使用單例模式。我通常會創建一個通用的單例類,我稍後再進行子類化。事情是這樣的:

template<class Derived> 
    class Singleton 
    { 

     public: 

      static Derived& instance(); 

     protected: 

      Singleton() {}; 


     private: 

      Singleton(const Singleton&) {}; 

      Singleton& operator=(const Singleton&) { return *this; }; 

     private: 

      static std::auto_ptr<Derived> _instance; 
    }; 

那麼資源類可以這樣做:

class ResourceManager : public Singleton<ResourceManager> 
{ 

    public: 

     friend class Singleton<ResourceManager>; 

    protected: 

     ResourceManager() {}; 
}; 
+0

確保在多線程應用程序中有合適的鎖。 – 2011-02-26 21:10:59

相關問題