2011-10-26 15 views
1

我在尋找關於如何處理這種情況的建議,因爲我迄今爲止所認爲的任何內容都不起作用。如何處理這種情況(需要註冊具有可變參數的函數)

我正在進行RPG遊戲,目前正在開發圖形系統。我的圖形系統由一系列按特定順序排列然後繪製的ScreenStack組成。

ScreenStack基本上只是一個相關屏幕的集合,以及唯一的id和繪製順序。

class ScreenStack 
{ 
//Constructors, getters/setters etc. 
private: 
    std::string StackName; 
    int DrawPriority; 
    int UID; 

    bool Valid; 
    bool DrawStack; 
    bool UpdateStack; 
    bool SendInputs; 
    bool DeleteStack; 
    std::vector<screen_ptr> OwnedScreens; //screen_ptr is a shared_ptr around a Screen object 
}; 

的屏幕是負責可視化遊戲的某些部分一個簡單的圖形層,例如有用於顯示在戰鬥中玩家的庫存,黨的概述,黨地位屏幕,敵黨,等等。

我有一個屏幕管理器,負責存儲創建屏幕堆棧的各種功能(即創建戰鬥堆棧的功能將爲玩家聚會,敵方聚會,攻擊動畫屏幕,背景和用戶界面)。各種屏幕堆棧創建功能中的每一個都需要一組不同的參數來構建它。我現在正在做的是根據需要手動向屏幕管理器添加堆棧創建功能。例如,現在屏幕管理器有一個用於創建標題屏幕堆棧,開始菜單堆棧,戰鬥堆棧,上層世界堆棧,地圖堆棧等的功能。

這可以工作,但是很麻煩和混亂。我希望能夠做到的是從屏幕管理器的外部文件能夠使用屏幕管理器註冊堆棧創建功能,然後我可以查看屏幕創建功能,而不必爲該功能添加新功能我需要創建每個堆棧的屏幕管理器。

我開始嘗試添加與StackCreationFunction的unordered_map<std::string, StackCreationFunction>被typedef爲

boost::function<ScreenStack (Engine& engine, ScreenManager& manager, const std::string screenName, const int StackID, const std::vector<std::string>& TryToCopyScreens, ...)> 

...來自cstdargs。這個想法是每個ScreenStack都會將它自己的StackCreationFunction添加到這張地圖上。這是行不通的,因爲boost :: function無效...

所以基本上我想要做的是允許外部文件/屏幕能夠註冊自己的創建函數(它有可變參數)與屏幕管理員一起,並且理想地能夠在編譯時/開始後立即執行此操作。這對於預處理器來說應該是可能的,但我不確定如何去做。我很困難,我真的想要一個更好的解決方案,然後向屏幕管理器添加許多堆棧創建器函數並使其混亂。

任何建議/更好的解決方案將不勝感激,如果上面的還不夠清楚

感謝

+1

你的問題非常清楚,但它很重要。如果你沒有得到你正在尋找的答案,我會建議使你的問題脫離文本化,以使它更短。也許增加一個設計模式和助推功能標籤, – Tom

+0

建築師設計模式與工廠設計模式的組合是否足夠?所以所有的ScreenStack都是默認的可構造的,但是你有專門的構建器,你可以把它放在一個文件中進行查找,在返回它之前構建這個對象。一個工廠可以用來獲得你想要的名稱的ScreenStack對象(也可能是建設者使用的配置文件等) – Akanksh

回答

0

我不知道是否回答你的問題,但如果我可以提供更多的細節您的擔心是從類似解釋器的代碼中調用不同簽名的各種功能,您可以(至少在GNU/Linux下)使用LibFFI(用於外部函數接口的庫)。

1

我會建議,而不是有一些外部註冊到您的系統的東西考慮讓你的系統調用外部實體。在這種情況下,您的系統將定位並加載一系列具有特定入口點的插件。您將需要使用一些傳統容器創建可變長度參數列表;無論是數組還是數據結構。

2

每個不同的屏幕堆棧創建函數都需要一組不同的參數來構造它。

我認爲這是問題在這裏,你需要想一想這裏的抽象,使你的地圖工作。畢竟,這些額外的參數如何由調用代碼實際提供?當調用代碼知道哪個類被實例化並且可以提供參數時,您不需要該地圖。如果沒有,映射是沒有用的,因爲你不能告訴哪些參數提供給堆棧創建函數。

最有可能的解決方案是提升::綁定了你的StackCreatorFunction的所有參數通常會進入...參數和無序的地圖,它可以釋放的...的註冊功能,這一上限的版本。

相關問題