我会解释我正在尝试做什么:
我正在开发一款游戏。为了处理图形,我有一堆ScreenLayers,我更新和绘制。 ScreenLayer负责为游戏的某些方面提供可视化(库存,聚会概述,wolrd地图,瓷砖地图等)。
为了处理屏幕转换,我想为各种屏幕类型创建一个函数注册表,然后屏幕将调用此注册表来从绘图堆栈中推送和弹出屏幕图层。 (即,在瓷砖地图上,如果你按下开始,瓷砖地图将调用注册表并告诉它创建根开始菜单屏幕。开始菜单将被推到瓷砖地图的上方并将控制输入直到开始菜单关闭,此时它会自动弹出堆栈并将控制权交还给调用它的层。
问题是每个屏幕层都需要一组不同的参数来构建它
即
CharacterOverviewScreen(boost::shared_ptr<Engine>& engine, const std::string& rmlDoc, Game::Character::Party* party);
VS
MapViewLayer(boost::shared_ptr<Engine>& engine, const std::string &mapFile, const sf::Vector2f &startPos, const std::string &name, int layerID, bool draw, Game::Character::Party* party);
理想情况下,我希望每个屏幕能够注册一个包含我的屏幕保护程序的小功能,并使其成为一个合适的ScreenStack
即
ScreenStack CharacterOverviewStackCreator(boost::shared_ptr<Engine>& engine, const std::string& stackName const std::string& rmlDoc, Game::Character::Party* party)
{
return ScreenStack(stackName, engine->GetUID(), boost:shared_ptr<ScreenLayer>(new CharacterOverviewScreen(engine, rmlDoc, party)));
}
我需要一种方法来注册接受可变参数的ScreenStack创建函数,并且如果可能的话,允许每个ScreenLayer派生类自己注册这个堆栈创建函数。
我最初的想法是尝试这样的事情:
typedef boost::function<ScreenStack (boost::shared_ptr<Engine>& engine, const std::string stackName, ...)> ScreenCreationFunction;
class ScreenManager : public AnimatedDraw
{
public:
ScreenManager(boost::shared_ptr<Engine>& engine);
bool RegisterScreenMakerFunction(const ScreenCreationFunction& creatorFunction, bool overwriteExisting = false);
ScreenCreationFunction& GetScreenMakerFunction(const std::string& makerName);
ScreenStack MakeStack(const std::string& makerFunction, const std::string, const std::vector<std::string>& TryToCopyStacks, ...);
protected:
private:
boost::shared_ptr<Engine> engine;
boost::unordered_map<std::string, ScreenCreationFunction> ScreenMakerFunctions;
};
但是,boost :: function不能与<cstdarg>
中的“...”一起使用。另外,在我尝试实例化之前,我无法看到预先注册屏幕。
我考虑在boost :: function上切换到一些通用的void函数指针,但如果我可以避免这样做,我想。我认为使用预处理器进行堆栈注册是可能的,但我没有很多预处理器的经验,所以我不知道如何做到这一点。
我正在考虑使用工厂来创建屏幕堆栈,但我必须不断更新工厂功能,因为我添加了越来越多的屏幕层类型和各种参数,所以这似乎不是一个非常好的解决方案。
如果有人可以帮助我,我们将不胜感激。如果我不清楚某事,请告诉我