2D Game - Sauberste Klassen-/Funktionsstruktur?

01/25/2016 07:20 IceTrailer#1
Hallo,

da ich mich seit ein paar Wochen mit SFML befasse und dabei ganz gute Fortschritte sehe - und aus einem Projekt ein kleines 2D Spiel rausholen möchte, stellt sich mir natürlich die Frage, was am Saubersten ist, was die Klassenstruktur betrifft.

Ich habe meine Game-Klasse, die dann die draw/update/handle Funktion von Player etc aufruft. Die Player-Klasse enthält allerdings nicht nur das Sprite des Players, sondern auch die einzelnen Eigenschaften wie HP, MP, sonstige bools und einfach die ganzen nicht-grafischen Sachen.


Mein Problem ist, ich möchte das grafische mit den funktionalen nicht vermischen, weiß jemand weiter/kann mir diesbezüglich weiterhelfen?

Ich hab mich auch schon mit dekompiliertem Minecraft Forge befasst :D allerdings ist das unfassbar viel Code, dass das a) nicht besonders lesbar und b) vom Hundertsten ins Tausendste kommt..

Vielen Dank im Voraus :)
01/25/2016 11:10 .SkyneT.#2
Einfach den Player in mehrere Klassen aufteilen.
Eine beispielhafte Aufteilung wäre:
- PlayerController: Verarbeitet Input und bewegt den Spieler
- PlayerState: HP, Mana, etc.
- PlayerView: Sprites, etc.
01/25/2016 11:52 Shadow992#3
Quote:
Originally Posted by .SkyneT. View Post
Einfach den Player in mehrere Klassen aufteilen.
Eine beispielhafte Aufteilung wäre:
- PlayerController: Verarbeitet Input und bewegt den Spieler
- PlayerState: HP, Mana, etc.
- PlayerView: Sprites, etc.
Das wäre eine Möglichkeit. Ich für meinen Geschmack würde alles in eine Klasse hauen, weil es wohl nicht so gigantisch viel Code für eine Klasse Player geben wird.
Ganz spontan fällt mir da nur das ganze Grafikzeugs ein, was bissel Code werden könnte.

Ist aber Geschmackssache, wenn man view und funktionalität wirklich trennen will, würde ich aber nicht nur eine Klasse PlayerInput/PlayerView machen sondern auch eine Klasse GeneralInput/GeneralView und diese Klasse dann an PlayerInput und sonstige Sachen weitervererben.
01/25/2016 13:54 algernong#4
Das ist nicht so wirklich Mainstream, glaube ich, aber du kannst dir auch Entity Component Systems anschauen: https://en.wikipedia.org/wiki/Entity_component_system
01/25/2016 16:14 IceTrailer#5
Also ist das so gemeint, dass die Game-Klasse drei Klassen erstellt (Player, PlayerController, PlayerView) und an PlayerController und PlayerView das Object (also kein Pointer) Player übergibt? oder wie wärs am schlausten?
01/25/2016 22:32 .SkyneT.#6
Ich würde beim Spielstart eine "Player" Klasse instanziieren welche im Konstruktor dann die einzelnen Komponenten der "Player" Klasse (PlayerController, PlayerState, etc.) instanziiert.

Am besten du probierst einfach ein wenig herum, dir wird schon schnell auffallen wie es am besten funktioniert. Sobald du der Meinung bist das es "perfekt" ist, kannst du ja noch mal fragen, ob es nicht noch weitere Verbesserungen gibt.
01/25/2016 23:10 IceTrailer#7
Ich hab mein Projekt jetzt neu gestartet und das jetzt so gemacht:

Game erstellt:
GeneralController
GeneralView
Player


GeneralController erstellt:
PlayerController (+ alle anderen Controller)


GeneralView erstellt:
PlayerView (+ alle anderen die Grafik betreffenden Klassen)


Player erstellt:
PlayerStats
PlayerState
etc


Also so:


[Only registered and activated users can see links. Click Here To Register...]


Falls das irgendwie schwerwiegend unschön ist, weist mich bitte darauf hin, ansonsten würde ich dabei erstmal bleiben. Danke an euch :)