2009-11-03 38 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()函數中,使你的主要功能更好。