Klassen Design
-
Servus Community,
ich habe eine Frage zu dem Design meiner Klassenstruktur.
Erstmal vorweg, ich benutze C#.
Ich habe ein GameObject welches eine Draw Schnittstelle implementiert. Außerdem enthält es die Informationen wie die Location, Color etc.
Weiterhin habe ich eine Player und Item klasse, die von GameObject erben.
Zu guter letzt habe ich eine Map Klasse, die eine Liste von GameObjects enthält. Hier fängt schon leicht mein Problem an. Wenn ich überprüfen will, ob der Spieler über einem item ist, muss ich down casten. Daher habe ich eine separate Liste für items angelegt und die Liste der GameObjects ist rein für den Maphintergrund. Kann man das anders lösen?
Die andere frage ist, ich hatte vor das Observable Pattern für das GameObject zu implementieren. Sollte die Map die items beobachten und die items die player Location? Das item würde dann zum beispiel, wenn der Spieler auf dem item ist, seinem Zustand auf Collected ändern, was die Map abfangen würde. Oder sollte dir Map den Spieler beobachten und immer schauen ob dort ein item ist?
Und was haltet ihr davon das der Spieler von GameObject erbt? GameObject enthält alles, was er brauch, genauso auch bei dem item.
Über Verbesserungsvorschläge Würde ich mich freuen.Mit freundlichen Grüßen
Freaky
-
Google: component based game design
-
freaky schrieb:
Sollte die Map die items beobachten und die items die player Location? Das item würde dann zum beispiel, wenn der Spieler auf dem item ist, seinem Zustand auf Collected ändern, was die Map abfangen würde.
Würde ich dir nicht empfehlen.
Wenn du es so machst, würdest du bei jeder Bewegung haufenweise Events an Items feuern die das gar nicht interessiert, da der Player eh nicht draufgefahren ist.
Das frisst sinnlos Rechenzeit.Oder sollte dir Map den Spieler beobachten und immer schauen ob dort ein item ist?
Eher so.
Wobei ich das echt nicht über Events verdrahten würde.
Sowas wie "gibt es was für den Player zu collecten" kann man 1x Zentral in der Update-Funktion der Game-Logik machen.Also (ganz grob skizziert)
void Update() { // Do stuff... // Move player var oldMapIndex = m_map.IndexFromPosition(m_player.Position); MovePlayer(); // Wie auch immer das implementiert ist var newMapIndex = m_map.IndexFromPosition(m_player.Position); bool mapIndexChanged = newMapIndex != oldMapIndex; // Notify items that player is over their position if (mapIndexChanged) { foreach (var item in m_map[oldMapIndex]) item.NotifyPlayerLeave(); foreach (var item in m_map[newMapIndex]) item.NotifyPlayerEnter(); } foreach (var item in m_map[newMapIndex]) item.NotifyPlayerOver(); // Do more stuff... }
Bzw. wenn ich mir das nochmal so ansehe sollte der ganze "notify" Code in eine "NotifyPlayerMoved" Funktion der Map-Klasse verpackt werden. Ändert aber am Prinzip nix.
Und was haltet ihr davon das der Spieler von GameObject erbt? GameObject enthält alles, was er brauch, genauso auch bei dem item.
Über Verbesserungsvorschläge Würde ich mich freuen.Guck dir das was cooky451 geschrieben hat an. Vielleicht wirst du daraus schlau
-
@cooky451
Ich hab' nen neuen Thread aufgemacht, um diesen Beitrag hier nicht zuzumüllen. Falls du kurz reinsehen magst: http://www.c-plusplus.net/forum/p2397561