1

私は C++ で 2D エンジンを作成しています。.dll と .lib を提供できるようにして、ゲームにそれらを含めることができ、すべてがうまく機能するようにしたいと考えています。

私はOgreがそれをどのように行うかを見てきましたが、それは次のような醜さをもたらします:

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char *argv[])
#endif
{
    // Create application object
    ShadowsApplication app;

    try {
        app.go();
    } catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
        std::cerr << "An exception has occured: " <<
        e.getFullDescription().c_str() << std::endl;
#endif
    }

    return 0;
}

#ifdef __cplusplus
}
#endif

私のエンジンは現在これを行っていますが:

MAIN
{
    Game* game = Game::Create();

    Engine::Init();
    game->Init();

    while (Engine::running)
    {
        if (Engine::PreRender())
        {
            game->Update();

            Engine::Render();
        }

        Engine::ShutDown();

        return 0;
    }
}

つまり、クリーンなゲームは次のようになります。

class BouncingBalls : public Game
{

public:

    BouncingBalls() { }
    void Init();
    void Update();

};

Game* Game::Create() { return (new BouncingBalls()); }

mainここで、大きな欠点が 1 つあります。ゲームではなくエンジンで定義しているため、必要なすべてのライブラリをエンジンに配置することはできません。すべてのゲームは特定のライブラリ セットをロードする必要があり、そのリストが変更されると大変なことになります。

ゲームの代わりにエンジンの .lib をロードしながら、このような構文を維持する方法はありますか?

前もって感謝します。

編集: 明確ではなかったようです。私の最終的な目標は、すべてのエンジン関数を含む単一の Visual Studio プロジェクトを作成し、.lib または .dll (.exe ではない) にコンパイルすることです。ゲームを作りたい人は、Engine.lib を自分のプロジェクトに、Engine.dll を自分のプロジェクト フォルダに含めるだけで作業を開始できます。

低レベルの C++ について心配することなく、新しいプロジェクトをできるだけ簡単に開始できるようにする必要があります。

4

2 に答える 2

4

MAIN の名前を Engine::MainLoop のような名前に変更して、クライアント アプリにメインからそれを呼び出させるだけではどうでしょうか。

于 2009-11-03T12:39:43.970 に答える
0

そのように OGRE を使用する必要はありません。この例は、彼らの ExampleFramework からのもので、ちょっと醜いです。

基本的には、これらの行に沿って何かを行うだけの問題です。

#include ogre.h

int main()
{
    SetupGame();
    SetupOGRE();

    while(true)
    {
        UpdateGame();
        GetOgreSingleton().RenderOneFrame();
    }

}   

もちろん、Ogre を他の「ゲーム システム」と同じように機能するレベルまで抽象化することは難しくありません。つまり、それを UpdateGame() 関数内に配置して、メイン関数をさらに優れたものにすることができます。

于 2009-11-23T17:45:40.907 に答える