我在尋找關於如何處理這種情況的建議,因爲我迄今爲止所認爲的任何內容都不起作用。如何處理這種情況(需要註冊具有可變參數的函數)
我正在進行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無效...
所以基本上我想要做的是允許外部文件/屏幕能夠註冊自己的創建函數(它有可變參數)與屏幕管理員一起,並且理想地能夠在編譯時/開始後立即執行此操作。這對於預處理器來說應該是可能的,但我不確定如何去做。我很困難,我真的想要一個更好的解決方案,然後向屏幕管理器添加許多堆棧創建器函數並使其混亂。
任何建議/更好的解決方案將不勝感激,如果上面的還不夠清楚
感謝
你的問題非常清楚,但它很重要。如果你沒有得到你正在尋找的答案,我會建議使你的問題脫離文本化,以使它更短。也許增加一個設計模式和助推功能標籤, – Tom
建築師設計模式與工廠設計模式的組合是否足夠?所以所有的ScreenStack都是默認的可構造的,但是你有專門的構建器,你可以把它放在一個文件中進行查找,在返回它之前構建這個對象。一個工廠可以用來獲得你想要的名稱的ScreenStack對象(也可能是建設者使用的配置文件等) – Akanksh