Spielklasse und Hauptfunktion

8

Ich habe eine Spielklasse mit meinen wichtigsten Spielfunktionen und Instanzen von Spielobjekten wie Bildschirm usw. Mein Spiel wird mit C ++ und SDL erstellt.

Ich fragte mich jedoch, ob Main hauptsächlich eine Funktion meiner Klasse sein sollte. Oder sollte ich "Game Game" machen? von "int main ();" und haben die Schleife in main?

Mein Zweifel ist - wenn ich es von einem externen Main mache, dann müssen die meisten meiner Sachen öffentlich sein, und das ist irgendwie schlecht, nicht wahr?

Irgendwelche Ideen? Vielen Dank!

David Gomes
quelle
Das ist nicht wirklich wichtig. Schreiben Sie, was Sie für einfacher halten. Dies kann auf eine oder viele andere Arten geschehen, und die Auswahl wirkt sich in keiner Weise sinnvoll auf Ihr tatsächliches Spiel aus.
Sean Middleditch

Antworten:

9

Sie können eine einzelne öffentliche Methode in Ihrer GameKlasse haben, die als Einstiegspunkt dient (z. B. eine aufgerufene Methode Run()). Dann main()müssten Sie nur noch diese Methode aufrufen, um alles zum Laufen zu bringen - nichts weiter.

Die Run()Methode könnte beginnen, indem alle Subsysteme initialisiert werden und dann in die Hauptspielschleife eintreten. Es sollte auch dafür sorgen, dass alles ordnungsgemäß heruntergefahren wird, sobald die Schleife endet.

Alles andere in der Klasse kann privat bleiben (oder geschützt sein, wenn Sie ein konkretes Spiel erstellen möchten, indem Sie davon erben), da es nur von Ihrer Spielimplementierung benötigt wird.

Beispiel

Hinweis: Völlig nackte Knochen, keine Timing-Berechnungen, extrem vereinfachte Spielschleife, nur ein Beispiel für den Einstieg. Für ein tatsächliches Spiel sollte es wahrscheinlich viel komplexer sein als dieses:

class Game
{
public:
    void Run()
    {
        Initialize();
        while(_running)
            Frame();
        Shutdown();
    }

private:
    void Initialize() { /* Initialize subsystems */ }
    void Shutdown() { /* Shutdown subsystems */ }
    void Frame() { /* Update and draw game */ }
    bool _running = true;
}

Und zu Ihrer main()Methode:

int main()
{
    Game game;
    game.Run();
    return 0;
}
David Gouveia
quelle
1
So wird es normalerweise gemacht. Es macht es einfacher, einen guten Platz für einen Ausnahmefang der letzten Chance bereitzustellen, und Sie können jetzt Ihr Spiel zerstören und es einfach neu erstellen.
Patrick Hughes
1
Ich bin mit einer Ausnahme einverstanden (abgefangen in der Funktion main ()). Aber warum willst du das ganze Spiel zerstören und neu erschaffen? (also auch SDL-Hauptfenster?). Ich bin mir nicht sicher zu verstehen.
Tigrou
5
@ user1083855 Nicht alle Spiele sind riesige Monstrositäten, viele sind klein und das Löschen und Wiederherstellen des gesamten Spielobjekts ist weitaus einfacher als das Schreiben einer Reset () -Methode und die Hoffnung, dass Sie daran gedacht haben, alle Zustände zurückzusetzen und zu löschen. Es ist also sowohl schneller zu schreiben als auch kein Debugging erforderlich. Sogar einige große Spiele tun dies mit Engine-Systemen wie Maps bei jedem Übergang oder Verlassen des Hauptmenüs. Es kommt also nur darauf an, wie viel abgerissen und neu aufgebaut wird und nicht darauf, ob es eine schlechte Idee ist oder nicht.
Patrick Hughes
2
Wenn Sie ein größeres Spiel erstellen, ist es schön, eine Soft-Reset-Funktion zu haben, die die Benutzererfahrung erheblich verbessert, und bei einigen Spielen können Sie die Spielklasse nicht einfach dekonstruieren und rekonstruieren. Angenommen, Sie führen alle Einstellungen und Initialisierungen in der Spielklasse durch. Dann ist es ein Zeitproblem. Wenn Ihre Spielklasse Ihr Menüsystem steuert, möchten Sie wirklich, dass das Spiel neu gestartet wird, nur weil Sie den aktuellen Spieltyp beenden möchten ? Dies hängt vollständig vom Design Ihres Spiels ab, aber das Hinzufügen von Kernfunktionen ist jetzt besser als später.
Matt Jensen