Как вести реестр функций переменных параметров

Я объясню, что я пытаюсь сделать:

Я работаю над игрой. Для работы с графикой у меня есть стек слоев, который я обновляю и рисую. ScreenLayer отвечает за предоставление визуализации для некоторого аспекта игры (инвентарь, обзор группы, карта мира, карта тайла и т. Д.)

Чтобы обрабатывать переходы между экранами, я хочу создать реестр функций для различных типов экранов, а затем экраны будут вызывать этот реестр, чтобы выдвигать и выталкивать слои экрана из стека рисования. (т. е. когда вы нажимаете на старт на карте тайлов, карта тайлов вызовет реестр и скажет ему создать экран корневого меню пуска. Начальное меню будет перенесено поверх карты тайлов и получит контроль над вводом до тех пор, пока начальное меню не будет закрыто, и в этот момент оно выпадет из стека и вернет управление вызывающему слою)

Проблема в том, что для каждого слоя экрана нужен свой набор параметров.

т.е.

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

т.е.

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>, Кроме того, у меня нет возможности предварительно зарегистрировать экраны, прежде чем я попытаюсь их создать.

Я подумал о переключении на какой-нибудь общий указатель на функцию void над boost::function, но если я могу избежать этого, я бы хотел. Я думаю, что возможно сделать регистрацию стека с помощью препроцессора, но у меня нет большого опыта с препроцессором, поэтому я понятия не имею, как это сделать.

Я рассматривал возможность использования фабрики для создания стека экрана, но мне придется постоянно обновлять фабричные функции, так как я добавляю все больше и больше типов слоев экрана и различных параметров, так что это не кажется хорошим решением.

Если бы кто-то мог помочь мне с этим, это было бы очень ценно. Если мне что-то неясно, дайте мне знать

0 ответов

Другие вопросы по тегам