Fazendo um motor 2D: compilar bibliotecas necessárias com o motor em vez do jogo

StackOverflow https://stackoverflow.com/questions/1665989

  •  13-09-2019
  •  | 
  •  

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 ++.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top