Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.11.2013, 21:54

Wie verwalte ich allgemeine Spielvariablen in C++

Hallo Community,

ich arbeite derzeit an einem 2D-Spiel mit direkter Sicht von oben.
Ich benutze Sdl mit Opengl und die Programmstruktur folgt dem Vorbild des Spieles aus dem Buch "C++ für Spieleprogrammierer"

Mittlerweile kommt mir aber die Frage auf, wie ich die Daten, die an vielen Stellen gebraucht werden, verwalte. Damit sind zum Beispiel: Bildschirmauflösung, Getötete Zombies, Tageszeit und so weiter gemeint.
Da globale Variablen als "unsauber" gelten, fällt mir nuch noch ein, Namespace oder Singletons, zu benutzen. Welche Methoden würdet ihr empfehlen.

Ausserdem habe ich die Spriteverwaltung, aus dem Spiel in dem Buch, über Bord geworfen (z.B. nur die Player klasse hatte einen Zeiger auf das Sprite) und das ständige herumgeben von Zeigern hatte den Code sehr unübersichtlich gemacht. Stattdessen verwende ich nun eine Singleton Klasse die alle Sprites initiallisiert, und über die man jedes Sprite direkt benutzen kann. War das eine gute Idee oder macht man so etwas anders?

Oder sollte ich stattdessen alles in die Framework klasse packen, welche im moment nur sdl/opengl initialisiert?

Es würde mich freuen wenn ihr mir weiterhelfen könnt.
Pascal

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

01.11.2013, 22:07

Globale Variablen sind sauberer als Singletons.

Die Idee mit dem Manager für die Sprites war schlecht. Dependency Injection ist genau dafür da und wem das zu viel Arbeit ist, der ist zu faul oder hat sich eine schlechte Struktur ausgedacht. Ein Singleton ist hier mal wieder absolut fehl am Platz. Das ist nicht der Zweck eines Singletons und sicher auch keine tolle Idee lauter Sprites zentral von irgendwem verwalten zu lassen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

02.11.2013, 00:02

Danke für die Schnelle Antwort.

Als ich den Beitrag gelesen habe, ist mir klar gewurden, dass ich zu wenig Ahnung im Bereich Objektorientierung habe.

Ich werde mir demnächst ein Buch dazu anschaffen.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

4

02.11.2013, 16:21

Und noch etwas: globale Variablen in namespaces bleiben globale Variablen.
Ich löse das immer so, dass ich eine Klasse namens GameApp habe, diese wird von der main() initialisiert. In ihr werden dann eben solche Sachen gespeichert. Die Klasse wird an jeden, der diese Informationen gebraucht per Referenz übergeben. Allerdings benutze ich auch SFML, das zum Beispiel die Fenstergröße in einer eigenen Fenster-Klasse speichert, diese Klassen müsstest du selber schreiben.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

02.11.2013, 16:38

GameApp? Ich würde das eigentliche Spiel von der Anwendung trennen. Könnte dir einige Vorteile bieten ;)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

6

02.11.2013, 16:47

GameApp? Ich würde das eigentliche Spiel von der Anwendung trennen. Könnte dir einige Vorteile bieten ;)


Naja, wenn die "App" nur für das Spiel benutzt wird, ist das doch ok. Ich programmiere ja auch kein Betriebssystem, um darauf das Spiel zu programmieren, weils mir mehr Freiheiten gibt. :D
WIP Website: kevinheese.de

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

02.11.2013, 17:29

Was spricht dagegen mehrere Instanzen des Spiels erstellen zu können? Spiel- und Anwendungsklassen sind in der Regel recht groß, sie zusammenzulegen macht den Code häufig recht unübersichtlich.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

8

02.11.2013, 17:39

Was spricht dagegen mehrere Instanzen des Spiels erstellen zu können? Spiel- und Anwendungsklassen sind in der Regel recht groß, sie zusammenzulegen macht den Code häufig recht unübersichtlich.


Naja ich kann mir jetzt nur recht wenig Anwendungsbeispiele vorstellen, in denen man tatsächlich mehrere Instanzen des selben Spiels braucht.

Ich wollte damit auch nur sagen: Wenn man es nicht explizit braucht, ist es ok "Game" und "App" zu trennen. :)
WIP Website: kevinheese.de

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

9

02.11.2013, 19:20

Okay, eigentlich könnte man die Klasse auch Game nennen, ist eigentlich nur eine Frage der Benennung.
Mehrere Instanzen sind doch kein Problem?

C-/C++-Quelltext

1
2
GameApp app1;
GameApp app2;

Es macht zwar keinen Sinn, aber es funktioniert.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

02.11.2013, 19:34

Dann werden zwei Fenster erstellt, zweimal die Optionen und alle Texturen geladen usw. Das will man ja nicht.
Die Anwendung verwaltet nämlich genau das. Das Spiel verwaltet ganz andere Dinge, die nicht viel mit dem der Anwendung zutun hat.
Wofür das ganze Sinnvoll sein könnte? Man könnte z.B. einen Spielstand starten, testen, einen weiteren Starten, damit testen und wieder zum alten zurückkommen, ohne dass Daten geladen oder gelöscht werden müssen.
Man kann auch andere Spielstände simulieren, was evtl. für eine KI von Vorteil sein könnte.

Das hängt natürlich stark vom Spiel ab was man damit macht. Mit ein bisschen Fantasie findet man sicher noch weitere Möglichkeiten. Ich halte es in jedem Fall für sinnvoll, denn wenn man an dieser Stelle eine weitere Abstraktionsebene hinzufügt bedeutet das einen kaum Messbaren performanceunterschied.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige