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

tnecniv

Treue Seele

  • »tnecniv« ist der Autor dieses Themas

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

1

11.06.2008, 23:27

Kommunikation zw. Gamestates

Ich hab eine design-frage:

Da ich mein Programm mir gamestates laufen lassen will, interessierte mich mal, wie denn die Kommunikation zwischen diesen am besten stattfindet? also wenn ich mein Spiel starte, möchte ich ja das die im Hauptmenü eingestellte Spielerzahl auch wieder im Spiel auftaucht.

Wie wird das üblicherweise gelöst?

Danke und Gruß
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

2

12.06.2008, 02:17

Du könntest die Daten an den Konstruktor des neuen GameStates übergeben.
Mein Projekt: Rise of the Sylvan

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

12.06.2008, 09:19

Ich mache sowas mit einer Parameter-Map.
Das sieht dann im Hauptmenü so aus:

C-/C++-Quelltext

1
2
3
4
5
6
ParameterMap pm;
pm["level"] = "Great Showdown at Grand Canyon";
pm["numPlayers"] = 4;
pm["botDifficulty"] = 8.2f;

app.pushGameState("Game", pm);


... und der Gamestate "Game" holt sich seine Parameter dann so wieder raus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void GS_Game::onEnter(const ParameterMap& pm)
{
    const char* p_level = pm.get<const char*>("level");
    int numPlayers = pm.get<int>("numPlayers");
    float botDifficulty = pm.get<float>("botDifficulty");

    // ...

}

4

12.06.2008, 09:20

Du könntest es auch so lösen, dass du einen GameStateManager verwendest der diese Daten aufnimmt, verwaltet und bei Bedarf einfach an andere GameState weitergibt.

tnecniv

Treue Seele

  • »tnecniv« ist der Autor dieses Themas

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

5

12.06.2008, 12:23

Hm..ok. ich glaub ich werd es einfach so ähnlich wie David machen... ich hoffe ich muss dann nicht zuviel basteln, damit alles so klappt wie ich möchte.. Danke!
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

Anonymous

unregistriert

6

12.06.2008, 14:49

tnecniv
Die Methode von David ist anfürsich eine der Besten und wird auch oft in vielen "Profi-Applikationen" genutzt, jedoch in einer etwas besseren Form ;)

Es ist nicht viel zu bastel, hier ein einfaches Beispiel das ich bei mir rumfliegen hatte.

Voller Unicode-Support und portabel ;)

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
// I N C L U D E S ###########################################################

    // standard includes

#include <string>
#include <map>

    // System specific includes

#if defined (_WIN32)
    #include <windows.h>
    #include <tchar.h>
#endif

// D E F I N I T I O N S #####################################################

    // non-win32-platforms

#if !defined (_WIN32)
    typedef char TCHAR;
    #define _T(value) ##value
#endif

    // string-class

typedef std::basic_string<::TCHAR> string_type;

// T E S T S ##################################################################

    // define registry

std::map<::string_type, ::string_type> registry;

// [...]


    // set values

registry[_T ("wert1")] = _T ("hallo");
registry[_T ("wert2")] = _T ("welt!");
registry[_T ("value")] = _T ("12345");

    // get values

string_type hallo = registry[_T ("wert1")];
string_type welt  = registry[_T ("wert2")];
int         value = lexical_cast<int>(registry[_T ("value")]);  


lexical_cast findest du hier noch im Forum :)

7

12.06.2008, 16:08

Zitat von »"David Scherfgen"«

Ich mache sowas mit einer Parameter-Map

xD genau so hab ichs auch gemacht :)
Mein Projekt: Rise of the Sylvan

tnecniv

Treue Seele

  • »tnecniv« ist der Autor dieses Themas

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

8

12.06.2008, 17:12

was haltet ihr davon ein richtiges objekt zu übergeben? das könnte dann ein struct mit entsrechenden elementen sein..

C-/C++-Quelltext

1
2
3
4
5
6
struct settings
{
int spielerzahl;
string map;
...
}


ist vielleicht unfexibler, aber schöner zum auslesen, vor allem bei großen informationsmengen

EDIT: bzw. Ein Parameter Interface wovon sich gamestates was ableiten können..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class IPara
{
}

class GamePara : public IPara
{
}

setGameState(GAMESTATE GS, IPara para);


verständlich?
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

Anonymous

unregistriert

9

12.06.2008, 21:16

Halte ich persönlich gar nichts von. Es ist absolut unflexibel und auch nicht schöner auszulesen und bei ca. 10 Gamestates wird es schon was viel mit extra-Klassen.

In der Fachsprache nennt man das was du vor hast einen Overkill. ;)

Erst die Effektivität und Flexibilität, dann die Schönheit. Machs mit einer Map und du hast auch später kein Problem die einzelnen Werte aus einer Datei zu lesen/schreiben - was bei deinem Vorhaben nur mit viel Overhead und Zusatzarbeit verbunden ist.

tnecniv

Treue Seele

  • »tnecniv« ist der Autor dieses Themas

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

10

15.06.2008, 20:49

"overkill", das is das stichwort, das ich erwartet hatte... ja, sitmmt schon und in meinem fall wahrscheinlich erst recht..
Also Danke für die antworten
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

Werbeanzeige