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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

30.04.2013, 12:28

Dein Gamestate System sieht mir noch recht merkwürdig aus. Ich weiß nicht wie es intern aussieht, aber von außen wirkt es noch recht aufwendig und komplex. Vor allem überleg mal weiter, und du möchtest gerne am Anfang ein Introvideo/screen abspielen, dann vielleicht noch Untermenüs haben und und und. Im Namen Gamestate steckt das Wort state, also Zustand. Wenn man es mit Zuständen zutun hat, verwendet man recht oft sogenannte Zustandsautomaten. Die endlichen Automaten sind im Prinzip die grundlegende Theorie dahinter. Keine Sorge, dass musst du alles nicht unbedingt lesen und verstehen, vorteilhaft ist es sicherlich, und an sich auch interessant. Um das ganze jetzt durch Code darzustellen gibt es zum Beispiel den Ansatz des Zustandsentwurfsmusters. Im englischen nennt sich das Ding State-Pattern falls du dazu noch mehr suchen möchtest. Im groben baust du dir ein Interface(Schnittstelle) für eine Zustandsklasse und jeder Zustand leitet sich dann von diesem Interface ab. Ein Gamestate bräuchte jetzt zum Beispiel die beiden Methoden "Update" und "Render". Also würde man ein Interface mit diesen beiden Methoden schreiben und die eigentlichen Zustände davon ableiten. Bei dir wären dass das Game und Menu. Jetzt hast du eine Variable vom Typ deines Interfaces, welche den aktuellen Gamestate beinhaltet. Wenn sich der Zustand ändert, wird diese Variable verändert. In deiner Hauptschleife rufst du dann die Methoden Update und Render auf der Variable auf (ich benutze hier bewusst das Wort Variable, da sich die Instanzen die dort gespeichert werden ja ändern). So läuft es im groben ab. Dazu findest du sicherlich genug Zeug im Internet. Ansonsten gibt es noch einen Wikiartikel in unserem Wiki. Dort wird eine Variante erklärt, welche einen Stack benutzt um Zustände stapeln zu können. Ist sicher ein interessanter Ansatz, aber wenn dir das noch zu komplex ist, reicht eigentlich auch erst mal eine Version in welcher immer nur ein Zustand vorhanden ist und du ohne Stack und dafür mit einer einfachen Variable(bzw Pointer auf einen State) arbeitest.
Das sind alles nur Hinweise. Natürlich kannst du dein System so weiter benutzen. Aber du wolltest ja wissen wie andere Leute andere Probleme lösen und da dachte ich weise ich dich da einfach mal drauf hin.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TigerClaw25

unregistriert

12

30.04.2013, 13:37

hmm, bekomme das in meinem Fall irgendwie nicht hin ... ist doch komplizierter, als ich dachte ... Hab das Gefühl, ich muesste meine gesamte CGame Klasse umschreiben ...

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

13

30.04.2013, 14:28

Das gehört oft mit dazu. Hinterher nennt man sowas dann refactoring;) Dir fällt auf dass es doch alles nicht mehr so läuft wie du dir das mal gedacht hattest und gehst dann deinen Code durch, räumst auf und machst alles wieder schick. Das ist ganz normal, aber kann sehr Zeitaufwendig sein. Gehts bei dir jetzt grad um die Gamestates oder noch um die Tastatur Geschichte? Weil auch wenn Zustandsautomaten super sind, so kannst du bei deinem aktuellen Projekt ja auch deinen jetzigen Weg weiter gehen und machst das mit dem Automaten beim nächsten mal. Oder testest es einfach nebenher in einem Testprojekt um es mal gesehen zu haben. Wie du meinst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

14

30.04.2013, 14:33

Manchmal denke ich, Code sagt viel mehr aus, als ein Text.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class GameState
{
  public:
  virtual void update(double time){}
  virtual void render(){}
}

class Game : public GameState
{
  // Variablendeklarationen
  // Funktionsprototypen
}

void Game::update(double time)
{
  // hier den Game-Update-Code einfügen
}

void Game::render()
{
  // hier den Game-Render-Code einfügen
}

class Menu : public GameState
{
  // wie bei Game
}

void Menu::update(double time)
{
  // wie bei Game::update
}

//...

int main()
{
  //...
  GameState* active_state;
  active_state = new Menu;
  while(active_state)
  {
    active_state->update( /* verstrichene Zeit */ );
    active_state->render();
  }
  delete active_state;
  //...
}


Dazu würde sich lohnen einen StateManager zu schreiben, mit dem man zwischen zwei States wechseln kann.
In GameState::update (oder in überschriebenen Methoden davon) kannst du dann prüfen, ob eine Taste gedrückt ist (polling) oder du arbeitest eher mit Events (GameState hat dann eine überschreibbare onKeyDown-Methode) wenn du Tastendrücke eh schon als Events bekommst.

TigerClaw25

unregistriert

15

30.04.2013, 16:51

Ich nehme an, dass ich dann de Code von Update Game und Render Game dort kopiere, wo du geschriebnhst und dann aus der Game Klasse den Originalcode entferne. Dadurch wird das Updaten und Rendern nur von Gamestate gesteuert, richtig?

Also im Prinzip die Teile, die mein Spiel updaten und rendern, in die Klasse Gamestate packen bzw. Durch die Vererbungsgeschichte direkt ueber die Klasse CGame definieren?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

30.04.2013, 17:09

Nein. Die Update- und Game-Programmteile in Gamestate zu kopieren ist verkehrt. Sein Vorschlag war, dass Du das Design vereinheitlichst, indem Du eigene State-Klassen einführst, die Render und Update beherrschen und diese dann delegieren, damit der Statemanager schlanker wird. Es soll nicht das Gegenteil erzeugt werden.
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]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

30.04.2013, 18:06

Um 12:28 Uhr hab ich doch einen recht langen Beitrag gepostet. Vielleicht liesst du dir den einfach mal durch und guckst dir die Links an. Dann sollte das meiste eigentlich klar sein. Der Artikel bei Wikipedia hat auch Codebeispiele und ein paar Bilder. Wenn du dir das ordentlich anguckst sollte das helfen. Ansonsten kannst du ja auch hier noch konkreter nachfragen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TigerClaw25

unregistriert

18

30.04.2013, 18:07

Verstehe ich irgendwie nicht. Hab doch schon Update und Render zu CGame und CMenu. Soll ich beiide allgemein Scheiben und in eine Klasse buendeln?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

30.04.2013, 18:38

Nein. Du sollst Deine States entkoppeln und die das Render und Update aufrufen lassen, sowie es selbst implementieren lassen. Ich persönlich bin ja der Meinung Dein 10-Zeilen-Switch muss nicht weiter abstrahiert werden, aber gut.
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]

20

30.04.2013, 19:48

Wenn du immer noch nicht genau weißt, wie das ganze umzusetzen ist, kannst du ja mal hier vorbeischauen: http://lazyfoo.net/articles/article06/index.php
Der Artikel hat mir geholfen, meinen ersten Gamestate-Automaten zu implementieren.

Werbeanzeige