Herstellung eine 2D-Engine: notwendige Bibliotheken mit dem Motor Kompilieren anstelle des Spiels

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

  •  13-09-2019
  •  | 
  •  

Frage

Ich mache eine 2D-Engine in C ++, und ich möchte in der Lage sein eine DLL und LIB zu liefern, so dass Spiele können, sind nur diejenigen, und alles ist schön und gut.

Ich habe untersucht, wie Ogre tut es, und es ergibt sich Hässlichkeit wie folgt aus:

#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

Während mein Motor derzeit tut dies:

MAIN
{
    Game* game = Game::Create();

    Engine::Init();
    game->Init();

    while (Engine::running)
    {
        if (Engine::PreRender())
        {
            game->Update();

            Engine::Render();
        }

        Engine::ShutDown();

        return 0;
    }
}

Welche ein sauberes Spiel bedeutet, sieht wie folgt aus:

class BouncingBalls : public Game
{

public:

    BouncingBalls() { }
    void Init();
    void Update();

};

Game* Game::Create() { return (new BouncingBalls()); }

Nun, ein großer Nachteil: weil ich main im Motor anstelle des Spiels definieren bin, kann ich nicht alle für die notwendigen Bibliotheken im Motor. Jedes Spiel muss in einem bestimmten Satz von Bibliotheken laden, die Hölle sein wird, wenn diese Liste ändert.

Gibt es eine Möglichkeit, die Syntax wie folgt, während auch in der LIB der im Motor statt Belastung des Spiels zu halten?

Vielen Dank im Voraus.

EDIT: Es scheint, die Dinge nicht klar waren. Mein Fernziel ist es, ein einzelnes Visual Studio-Projekt zu haben, die alle Motorfunktionen enthält, die zu einer LIB oder eine DLL kompiliert (kein .exe). Wenn jemand will, um ein Spiel machen, kann er einfach Engine.lib in seinem Projekt und Engine.dll in seinem Projektordner enthalten und los geht.

Es sollte so einfach wie möglich sein, um ein neues Projekt zu starten, ohne sich um Low-Level-C kümmern ++.

War es hilfreich?

Lösung

Warum nicht einfach umbenennen Ihren MAIN so etwas wie Motor :: MainLoop und die Client-Anwendung Ruf hat, dass von ihrem Haupt.

Andere Tipps

Sie müssen OGRE nicht so verwenden - das Beispiel von ihrem ExampleFramework ist und ist eine Art hässlich

.

Im Grunde ist es nur eine Frage des etwas in diese Richtung zu tun:

#include ogre.h

int main()
{
    SetupGame();
    SetupOGRE();

    while(true)
    {
        UpdateGame();
        GetOgreSingleton().RenderOneFrame();
    }

}   

Natürlich ist es nicht schwer zu abstrakt Ogre auf einem Niveau, das es wie jedes andere „Spielsystem“ funktioniert, so dass Sie es in der UpdateGame setzen können () Funktion, Ihre Hauptfunktion macht noch schöner.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top