2009-11-03 34 views
1

我正在用C++制作一个2D引擎,我希望能够提供一个.dll和一个.lib,这样游戏就可以包含这些一切都很好,很棒。制作一个2D引擎:用引擎而不是游戏编译必要的库

我已经看了食人魔是怎么做的,并且它导致丑陋这样的:

#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++。

+0

我认为我们没有足够的有关您正在做的事情的信息。你最终的目标是什么?你的意思是图书馆等等? – GManNickG 2009-11-03 09:34:09

+0

我已经添加了更多信息。 :) – knight666 2009-11-03 10:03:39

+0

我不知道完全了解问题,但为什么不创建该Visual Studio项目指出它将是一个库(动态或静态)?有什么问题?如果你想在Dll中导出类,你应该在类定义中添加__declspec(dllexport)。 – HyLian 2009-11-03 10:50:06

回答

4

为什么不只是将您的MAIN重命名为Engine :: MainLoop之类的东西,并让客户端应用程序从它们的主要应用程序中调用它。

+0

哈!最好的解决方案是最简单的。 – knight666 2009-11-03 14:07:59

+1

是的,这个完全相同的问题多年来一直是GLUT图书馆的典型缺陷。执行main的库很糟糕! – 2009-11-04 00:14:34

0

你不必像这样使用OGRE--这个例子来自他们的ExampleFramework,有点丑。

基本上它只是一个做沿着这些路线的东西的事:

#include ogre.h 

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

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

} 

当然,也不是很难抽象食人魔的水平,它的工作原理就像任何其他的“游戏系统”,意思是你可以把它放在UpdateGame()函数中,使你的主要功能更好。