1

我将解释我正在尝试做的事情:

我正在开发一款游戏。为了处理图形,我有一堆我更新和绘制的 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 函数指针,但如果我可以避免这样做,我想这样做。我认为可以使用预处理器进行堆栈注册,但我对预处理器没有很多经验,所以我不知道如何做到这一点。

我正在考虑使用工厂来创建屏幕堆栈,但是随着我添加越来越多的屏幕图层类型和各种参数,我必须不断更新工厂函数,所以这似乎不是一个很好的解决方案。

如果有人可以帮助我,将不胜感激。如果我不清楚某事,请告诉我

4

0 回答 0