私は 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++ について心配することなく、新しいプロジェクトをできるだけ簡単に開始できるようにする必要があります。