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

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

03.01.2015, 07:24

Planung eines Games (objektorientiert)

Hallo, ich habe eine Frage an die erfahrenen Spieleentwickler unter euch, die im Profibereich auch an nicht-kleinen Projekten arbeiten.

Erstellt ihr so etwas wie UML-Diagramme? Also jetzt nicht was das Game-Design, sondern die konkrete Implementierung angeht.
Ich tu mich da immer etwas schwer, ich habe neulich erste einen Plan gemacht, am Ende sah dann eh alles anders aus weil man Sachen übersieht die nicht funktionieren oder einer anderen Lösung bedürfen, die wiederum andere Komponenten verändert.
Wenn dann noch Änderungen im Game-Design passieren, ist der Planung der Rest gegeben.

Allerdings lagen die größten Probleme die ich in letzter Zeit in der Entwicklung hatte nicht etwa in der Implementierung der Funktion, sondern die Integration in das ganze System (Klassen, etc.). Daher denke ich wiederum das doch irgendwie geplant werden muss.
Ich habe meinen kleinen Codevorrat der mittlerweile mehr als 2000 Zeilen Code in über 10 Klassen enthält (basierend auf der Unreal Engine) schon öfters warten müssen.
Ich nehm mir halt immer Feature für Feature vor und programmiere es (abgesehen von einem Grundgerüst am Anfang).
Ich stoße daher in letzter Zeit oft auf zyklische Abhängigkeiten, Abhängigkeiten die hierarchisch gesehen falsch herum sind und Redundanzen.

Beispiel:
Der GameMode ist das Zentrum des Spielablaufes, oder eher der Kopf. Dort sind die Regeln definiert die den Spielfluss kontrollieren.
Mein Spiel ist Singleplayer und der GameMode enthält z.B. eine Referenz auf das Objekt, das die Asteroiden spawnt, die Spieleinstellungen, die Leveldauer, die vergangene Zeit, etc.

Nun greifen Objekte auf dem GameMode zu und zwar auf meinen GameMode (dynamischer Cast), was ich denke was nicht gut ist, da die Actors ja dann an diese Spielart gebunden sind. Eher soll ja der GameMode die Objekte verändern und diese sollen unabhängig sein.
Das meinte ich vorher auch mit den Abhängigkeiten. So Sachen zwingen mich regelmäßig (und das ist sehr oft), größere Teile des Codes zu verändern.

Ich vermute nun dass dies durch mangelnde Planung auftritt (oder durch Inkompetenz meinerseits :S ) aber wie ich vorher erläutert habe funktioniert das auch nicht so toll.

Ich hoffe jemand kann mir da helfen.

mfg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

03.01.2015, 08:42

UML nutzt man eher zur Dokumentation. Für Planung meist nur sehr grob um Komponenten zu identifizieren und grobe Kommunikation zu planen. Details wie Klassen und Methoden nutzt man in der Praxis nicht. Zumindest nicht bei uns. Detailplanung nennt sich Wasserfall-Modell und funktioniert nicht.

GameMode klingt für mich ehrlich gesagt nach einem Enum. Dass alle Deine Objekte darauf zugreifen, klingt für mich schon mal sehr falsch. Das hast Du ja bereits selbst erkannt.
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]

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

03.01.2015, 10:01

GameMode ist ein actor und mein gamemode ist ein gamemode. Er sitzt auf dem server und kontrolliert das spiel. Ich kann einen pointer eig von überall abrufen und über ihn weitere pointer holen oder so. Das geht immer.
Jedoch caste ich den pointer immer in meinen gamemode ( er ist polymorph). In der annahme es isr immer diese unterklasse funktionieren die objekte und obwohl das so ist ist es irgendwie schmutzig.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

03.01.2015, 14:01

GameMode ist ein actor und mein gamemode ist ein gamemode. Er sitzt auf dem server und kontrolliert das spiel. Ich kann einen pointer eig von überall abrufen und über ihn weitere pointer holen oder so. Das geht immer.
Jedoch caste ich den pointer immer in meinen gamemode ( er ist polymorph). In der annahme es isr immer diese unterklasse funktionieren die objekte und obwohl das so ist ist es irgendwie schmutzig.

Was hindert dich denn daran die Abhängigkeiten (Pointer) bei der Erzeugung eines Gameobjekts direkt im Konstruktor mitzugeben und dann den Gamemode als fixe Abhängigkeit rauszulassen? Damit wären die Objekte nicht nur von deinem speziellen Gamemode unabhängig sondern von jeglicher Art Gamemode.

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

5

03.01.2015, 14:17

Um Gottklassen zu vermeiden, würde ich vielleicht andere Programmierkonzepte verwenden.
Sehr beliebt, übersichtlich und oft verwendet: Component + Entity. Oder Entity System.
Wird auch von Unity, Waveengine und vielen weiteren verwendet.

UML wird in unserem Unternehmen meist direkt aus dem Code generiert. (Für Besprechungen, Dokumentationen oder rein zur Übersichtlichkeit)
Sich jedoch vor dem Programmieren ein Konzept zurecht zu legen, kann sicherlich nicht schaden.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

03.01.2015, 14:21

Was ist eine Entity mit sehr vielen Komponenten, wenn nicht eine Gott-Klasse? ;) Nur weil ich sie über ein gemeinsames Interface zusammengefasst in einen Array/Liste werfe statt sie einzeln fest in der Klasse zu deklarieren, ändert sich eigentlich gar nichts. Das ist eine scheinbare Verbesserung, die aber eigentlich nicht wirklich eine ist. Ähnlich dem "Ich verwende keine globalen Objekte, ich verwende Singletons"-Trugschluss.
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]

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

7

03.01.2015, 14:26

Das ist component-basiert jedoch hat GameMode als abstrakter Actor keine. Ich habe genauer darüber nachgedacht und herausgefunden dass ich alles unabhängig lösen kann. Es gibt diverse Sachen die einen anderen Platz haben sollten.
Da hab ich wohl GameMode als Gottklasse missbraucht was im Singleplayer durchaus funktioniert.

Wenn ihr das nicht plant, wie macht ihr das dann? Einfach drauflosprogrammieren d.h. system und details kurz vor der implementierung überlegen?

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

8

03.01.2015, 15:12

Was ist eine Entity mit sehr vielen Komponenten, wenn nicht eine Gott-Klasse? ;) Nur weil ich sie über ein gemeinsames Interface zusammengefasst in einen Array/Liste werfe statt sie einzeln fest in der Klasse zu deklarieren, ändert sich eigentlich gar nichts. Das ist eine scheinbare Verbesserung, die aber eigentlich nicht wirklich eine ist. Ähnlich dem "Ich verwende keine globalen Objekte, ich verwende Singletons"-Trugschluss.
So kann man das auch sehen. Nur sind die Komponenten unabhängig, eigenständig und benötigen keine "Gottklasse" für Datenmanipulation. (Bzw. gibt es nicht nur eine Gottklasse, sondern eben Count(Entity) viele) Auch können die Komponenten klar abstrahiert und wiederverwendet werden. Gottklasse vs Entity verliert bereits bei der Übersichtlichkeit. Auch wenn es sich um eine scheinbare Verbesserung handelt, habe ich das Gefühl von CleanCode und weniger Angst vor Antipattern.



Das ist component-basiert jedoch hat GameMode als abstrakter Actor keine. Ich habe genauer darüber nachgedacht und herausgefunden dass ich alles unabhängig lösen kann. Es gibt diverse Sachen die einen anderen Platz haben sollten.
Da hab ich wohl GameMode als Gottklasse missbraucht was im Singleplayer durchaus funktioniert.

Wenn ihr das nicht plant, wie macht ihr das dann? Einfach drauflosprogrammieren d.h. system und details kurz vor der implementierung überlegen?
Überlegen was ich erreichen will. Realisierungsmöglichkeiten gedanklich auflisten. (API's, Frameworks)
Gedanklich bereits grobe Klassen zusammenstellen, ihre Aggregate und Schnittstellen ermitteln.
Dann programmieren. Während dem Programmieren versuche ich bereits zu optimieren. Google, nimm Bücher zur Hand etc.
Nach ein paar Tagen/Wochen/Monaten (regelmäßig) überfliegen und refactorn. (Man lernt schließlich nie aus)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

03.01.2015, 18:42

Bzw. gibt es nicht nur eine Gottklasse, sondern eben Count(Entity) viele
Wo siehst Du da jetzt einen Unterschied? Ob ich nun Ball, Spieler, Monster als einzelne Klassen habe und jedes davon hat mehrere Animationen, mehrere Sounds, mehrere KIs/Controller, mehrere Physik-Bodies oder alle haben nur eine unbestimmte Menge von Komponenten, die im Detail auch wieder Animation, Sound, KI/Controller und Physik-Body heißen, macht doch null Unterschied. Das Einzige, wofür so ein Komponenten-System wirklich gut ist, ist Scripting. Wenn jemand von außen beliebig viele Komponenten an irgendein "Ding" anfügen kann um damit zu machen, was er will, ohne dass es dafür eine neue Klasse bräuchte. Den Vorteil kannst Du im Normalfall aber gar nicht ausreizen.

Auch können die Komponenten klar abstrahiert und wiederverwendet werden.
Und wo genau ist da der Unterschied zum klassischen OOP-Ansatz Deiner Meinung nach? Auch dort können Komponenten wiederverwendet werden und sind klar abstrahiert.

Gottklasse vs Entity verliert bereits bei der Übersichtlichkeit.
Eine Entity ist nebenbei bemerkt kein spezielles Wort für eine Klasse, die einen Komponenten-Ansatz verwendet. Ich behaupte eben, dass so eine Klasse mit Komponenten-Ansatz eine Gottklasse ist und zusätzlich sogar durch fehlende Kontrollierbarkeit ihrer eigenen Komponenten viel ihrer Zuständigkeit an andere Stellen nach *außen* abgibt, was abstrakt betrachtet eigentlich mal ein schlechter Ansatz ist, weil sie sich nicht mehr um ihre eigenen Daten kümmert, sondern jemand anders, was sie teilweise zu einem reinen Gott-Datenhalter degradiert, statt zu einer logisch in sich geschlossenen Klasse.

Wie ich schon sagte, ein Komponenten-Ansatz ist noch immer ein Haufen Komposition wie bei klassischer OOP-Entwicklung, die eine Gott-Klasse schön aussehen lässt, weil statt 20 einzelner Attribute in der Klasse eine Liste von Komponenten verwendet wird. Allerdings bringt dieses Vorgehen sehr viele Probleme mit sich wie etwa double-dispatch-Unmöglichkeiten, dynamische Typprüfungen zur Laufzeit, wilde typunsichere Casts, dynamische (langsame) Auflösung/Suche der richtigen Komponente aus der Liste, etc, etc. All diese Nachteile nimmt man in Kauf für einen einzigen großen Vorteil: Es kann nach der Kompilierung entschieden werden welche Komponenten ein Spiel-Objekt genau bekommt. Solange man diesen Vorteil nicht ausreizen kann, ist man meiner Meinung nach mit so einem System ordentlich in die Kacke getreten. In Unity wird sogar empfohlen sich viele der Komponenten nur einmal zurückgeben zu lassen und zu cachen. Das ist dann erst mal Unsinn. Klar ist das massiv schneller, genau deswegen soll man es ja machen, aber ich habe damit effektiv eine Gottklasse, die zu jeder ihrer Komponenten in der Component-List auch noch zusätzlich eine Property für das Caching der jeweiligen Komponente hat. Das tut doch weh, schon wenn man drüber nachdenkt.
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« (03.01.2015, 18:49)


birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

03.01.2015, 23:23

Der Vorteil bei Unreal ist dass ich die Komponenten über Pointer in der Klasse definiere. Vererbte Komponenten erbe ich in Form eines Pointers oder eines Getters.
Somit muss ich keine Komponenten suchen oder cachen sondern hab zu jeder einen Pointer.

Werbeanzeige