我正在用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++。
我認爲我們沒有足夠的有關您正在做的事情的信息。你最終的目標是什麼?你的意思是圖書館等等? – GManNickG 2009-11-03 09:34:09
我已經添加了更多信息。 :) – knight666 2009-11-03 10:03:39
我不知道完全瞭解問題,但爲什麼不創建該Visual Studio項目指出它將是一個庫(動態或靜態)?有什麼問題?如果你想在Dll中導出類,你應該在類定義中添加__declspec(dllexport)。 – HyLian 2009-11-03 10:50:06