1

私がやろうとしていることを説明します:

私はゲームに取り組んでいます。グラフィックを処理するために、更新して描画する ScreenLayers のスタックがあります。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>。さらに、画面をインスタンス化しようとする前に、画面を事前登録する方法がありません。

boost::function を介して一般的な void 関数ポインターに切り替えることを検討しましたが、これを回避できる場合はそうしたいと思います。プリプロセッサを使用してスタック登録を行うことは可能だと思いますが、プリプロセッサの経験があまりないため、これを行う方法がわかりません。

ファクトリを使用してスクリーン スタックを作成することを検討していましたが、スクリーン レイヤ タイプとさまざまなパラメータを追加するたびにファクトリ関数を更新し続ける必要があるため、これはあまり良い解決策とは思えません。

誰かがこれで私を助けることができれば、それは大歓迎です。不明な点がある場合はお知らせください

4

0 に答える 0