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

27.10.2014, 22:03

SFML Framework Klassenstruktur

Hi Leute,

und zwar bin ich gerade dabei die Struktur meiner SFML Framework Klasse (also die nur das Fenster erstellt usw.) zu planen.
Jedoch stoße ich dabei an ein Problem: Die Framework Klasse soll sozusagen gar nichts mit meinem Game zu tun haben, also so sein, dass sie nichts Game spezifisches in sich drinnen hat.
Bisher hatte ich es immer so gemacht, dass die Gameloop im Framework implementiert wurde, jedoch wird dabei ja genau das Ziel von mir verfehlt, da ich darin ja dann auch die Sprites rendern muss.
Was ist jetzt also die optimale Möglichkeit, die Gameloop zu implementieren ? Einfach in einer anderen Klasse, z.B. Game (die dann logischerweise Game spezifisch ist), oder denk ich da gerade falsch ?

LG

2

27.10.2014, 22:06

Ich hab den in besagter Klasse drin, aktualisiert den Statestack.

MfG
Check

3

27.10.2014, 22:10

Wie bitte ?
Ich kann dir gerade nicht ganz folgen.

4

28.10.2014, 00:37

Ich habe eine Klasse, die kümmert sich um das Fenster und sogar um die Kommandozeilenparameter, die den Gameloop implementiert hat, der daraus besteht, die Events einzulesen, den Statestack zu aktualisieren und, wenn es angebracht ist, zu rendern.

MfG
Check

Lares

1x Contest-Sieger

  • Private Nachricht senden

5

28.10.2014, 01:04

Du kannst so genannte State Stacks verwenden, um die nötige Trennung zu erreichen. Deine Applikationsklasse für das Framework zeichnet und aktualisiert Spielzustände (Hauptmenü, Spielszene, Optionsmenü, etc.). Die genaue Implementierung kennt deine Applikationsklasse nicht, es weiß nur, dass dein Spielzustand sowohl eine Zeichnen-, als auch eine Aktualisieren-Methode hat. Dadurch kannst du dann die Applikationsklasse immer benutzen und musst für jedes neue Spiel lediglich die Spielzustandsklassen neu implementieren (bzw. anpassen). Als erste Anlaufstelle könnte dir vllt. die Wikiseite helfen (auch wenn sie noch unvollständig ist):

Desweiteren: Das Buch SFML Game Development hat eine mögliche Implementierung für solche Spielzustände, neben ein paar anderen hilfreichen Themen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

28.10.2014, 06:47

Ich weiß nicht warum jeder seine Statemachine als Stack implementiert. Ich finde das sogar äußerst unpassend.
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]

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

7

28.10.2014, 07:41

Ich weiß nicht warum jeder seine Statemachine als Stack implementiert. Ich finde das sogar äußerst unpassend.


Interessant, dass du das ansprichst. Ich habe jetzt öfters gehört, dass ein State Set sinnvoller wäre, allerdings frage ich mich inwiefern sich das genau unterscheiden würde. Es wirkt für mich erstmal wie ein versteckter Stack - oder ich habe noch keine richtige Implementierung davon gesehen.


@OP:
Ich benutze eine Framework Klasse und eine Game Klasse. Du denkst da meiner Meinung nach also durchaus richtig.
WIP Website: kevinheese.de

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

28.10.2014, 08:47

Ein Stack ist ein LIFO. Eine Statemachine ist das für gewöhnlich eigentlich nicht. Denn man geht in einem Spiel selten eine Leiter rauf und runter, was den Dialog/Zustandsfluss angeht. Man kann mit einem Stack natürlich auch immer nach vorn gehen und oben was neues drauf packen statt zurück zu wandern, aber wozu dann ein Stack?
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (28.10.2014, 08:54)


KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

9

28.10.2014, 11:52

In dem Fall wird das ja aber wie ein pushdown automat verwendet. Ich feuere den Spiel-State abl und lade den Pause-State drauf beim Escape drücken, beim erneuten Escape kill ich den Pause-State und lande wieder im Spiel-State.

Aber stimmt schon, ein PA ist keine FSM. Das liegt halt aber alles relativ nah beieinander.

Ich dachte du meintest den Unterschied zwischen "set of states" und "stack of states"; beim stack of states ist "spiel-state/pause-state" was anderes als "pause-state/spiel-state", bei set of states ist es beides das gleiche.
WIP Website: kevinheese.de

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »KeksX« (28.10.2014, 12:04)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

28.10.2014, 15:16

Die Diskussion zum Stack gab es unter dem Wikiartikel ja auch schon.
Logan was dein Problem angeht, das hat mit den Gamestates eigentlich erst mal nichts zu tun bzw kann davon unabhängig beantwortet werden. Deine Klasse implementiert einfach den Gameloop und bekommt die Implementierung einer Schnittstelle/einer abstrakten Klasse oder was auch immer du nimmst. In der Basisklasse definierst du die Methoden die im Gameloop aufgerufen werden sollen. Hier kannst du jetzt theoretisch Gamestates übergeben oder den Stack von States oder eine andere Verwaltungsklasse für deine Spielzustände, gehen tut das aber auch ohne.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
interface Game
{
    public void DoStep(Time time);
}

class GameImpl
{
    public override void DoStep(Time time)
    {
        // ......
        // ......
    }
}


void GameLoop(Game game)
{
    // ....
    // while ....
    // .....
    game.DoStep(time);
    // ....
}


Mal als Beispiel. In C++ sieht der Code halt leicht anders aus. Interfaces gibt es da ja in dem Sinne nicht, du kannst aber eine Abstrakte Klasse machen und die Methode nicht implementieren. Bei der Übergabe musst du dann natürlich einen Zeiger auf die Instanz übergeben da es sonst mit der Polymorphie nicht hin haut.
„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.“

Werbeanzeige