我将解释我正在尝试做的事情:
我正在开发一款游戏。为了处理图形,我有一堆我更新和绘制的 ScreenLayers。ScreenLayer 负责为游戏的某些方面(库存、派对概览、世界地图、瓷砖地图等)提供可视化。
为了处理屏幕转换,我想为各种屏幕类型创建一个函数注册表,然后屏幕将调用此注册表以从绘图堆栈中推送和弹出屏幕图层。(即,当在瓦片地图上时,如果您按下开始,瓦片地图将调用注册表并告诉它创建一个根开始菜单屏幕。开始菜单将被推到瓦片地图的顶部并控制输入直到开始菜单关闭,此时它会从堆栈中弹出并将控制权交还给调用它的层)
问题是每个屏幕层都需要一组不同的参数来构造它
IE
CharacterOverviewScreen(boost::shared_ptr<Engine>& engine, const std::string& rmlDoc, Game::Character::Party* party);
对比
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
IE
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 函数指针,但如果我可以避免这样做,我想这样做。我认为可以使用预处理器进行堆栈注册,但我对预处理器没有很多经验,所以我不知道如何做到这一点。
我正在考虑使用工厂来创建屏幕堆栈,但是随着我添加越来越多的屏幕图层类型和各种参数,我必须不断更新工厂函数,所以这似乎不是一个很好的解决方案。
如果有人可以帮助我,将不胜感激。如果我不清楚某事,请告诉我