Fazendo um motor 2D: compilar bibliotecas necessárias com o motor em vez do jogo
Pergunta
Eu estou fazendo um motor 2D em C ++, e eu quero ser capaz de fornecer uma DLL e um lib para que os jogos podem incluir apenas aqueles e tudo é fino e elegante.
Eu olhei como Ogre faz isso, e isso resulta em feiúra como esta:
#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
Enquanto o meu motor atualmente faz isso:
MAIN
{
Game* game = Game::Create();
Engine::Init();
game->Init();
while (Engine::running)
{
if (Engine::PreRender())
{
game->Update();
Engine::Render();
}
Engine::ShutDown();
return 0;
}
}
O que significa uma limpeza olhares jogo como este:
class BouncingBalls : public Game
{
public:
BouncingBalls() { }
void Init();
void Update();
};
Game* Game::Create() { return (new BouncingBalls()); }
Agora, um grande problema: porque eu estou definindo main
no motor ao invés do jogo, eu não posso colocar todas as bibliotecas necessárias no motor. Cada jogo tem a carga em um conjunto específico de bibliotecas, que vai ser um inferno em que essa lista alterações.
Existe uma maneira de manter a sintaxe como esta ao mesmo tempo, carregar no lib está no motor, em vez do jogo?
Agradecemos antecipadamente.
EDIT: Parece que as coisas não estavam claras. Meu objetivo final é ter um único projeto Visual Studio que contém todas as funções do motor, que compila a um .lib ou um arquivo .dll (não um .exe). Se alguém quiser fazer um jogo, ele pode simplesmente incluir Engine.lib em seu projeto e Engine.dll em sua pasta de projeto e ir em frente.
Deve ser tão fácil quanto possível para iniciar um novo projeto, sem ter que se preocupar com baixo nível C ++.
Solução
Porque não basta mudar o nome de seu principal para algo como Motor :: MainLoop e têm a chamada aplicativo cliente que a partir de seu principal.
Outras dicas
Você não tem que usar OGRE assim -. O exemplo é a partir de sua ExampleFramework e é tipo de feio
Basicamente, é apenas uma questão de fazer algo ao longo destas linhas:
#include ogre.h
int main()
{
SetupGame();
SetupOGRE();
while(true)
{
UpdateGame();
GetOgreSingleton().RenderOneFrame();
}
}
É claro, não é difícil abstrair Ogre para um nível que ele funciona como qualquer outro "sistema de jogo", ou seja, você pode colocá-lo dentro do UpdateGame () função, tornando a sua principal função ainda melhor.