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在引擎而不是游戏中定义的,所以我不能将所有必要的库都放在引擎中。每个游戏都必须加载一组特定的库,当该列表发生变化时,这将是地狱。

有没有办法保持这样的语法,同时在引擎而不是游戏中加载.lib?

提前致谢。

编辑:似乎事情还不清楚。我的最终目标是拥有一个包含所有引擎函数的 Visual Studio 项目,该项目编译为 .lib 或 .dll(不是 .exe)。如果有人想制作游戏,他可以简单地将Engine.lib 包含在他的项目中,并将Engine.dll 包含在他的项目文件夹中,然后开始。

启动一个新项目应该尽可能简单,而不必担心低级 C++。

4

2 回答 2

4

为什么不将您的 MAIN 重命名为 Engine::MainLoop 之类的名称,然后让客户端应用程序从其 main 中调用它。

于 2009-11-03T12:39:43.970 回答
0

你不必像那样使用 OGRE——这个例子来自他们的 ExampleFramework,有点难看。

基本上,只需按照以下方式做一些事情:

#include ogre.h

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

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

}   

当然,将 Ogre 抽象到与其他任何“游戏系统”一样工作的水平并不难,这意味着您可以将其放在 UpdateGame() 函数中,从而使您的 main 函数更好。

于 2009-11-23T17:45:40.907 回答