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

09.04.2015, 21:22

Erstellen von Items/Modulen

Hallo, ich habe eine Frage die sich mehr auf das objektorientierte Design bezieht:

Es gibt in vielen Spielen Items oder Module. Ich kann mir ein Schwer mit 10 Schaden kaufen und ein weiteres mit 20 Schaden. Für mein Raumschiff kann ich einen Laser ausrüsten der mehr Schaden macht als der andere.

Ich frage mich wie ich die verschiedenen Typen objektorientiert am besten umsetze. Eine Instanz eines Objekts kommt nicht infrage, weil die Instanz nacher das agierende Objekt in der Spielwelt ist.

Folgende 2 Möglichkeiten hab ich mir überlegt:

1. Vererbung, für jeden Typ eine eigene Unterklasse, einfach die Werte über Defaults/Konstruktor ändern.
Vorteil: Höhere Dynamik, Überschreiben von Funktionalität, neue Funktionalität implementieren.
Nachteil: Höhere Komplexität

2. Eine Deskriptor-Klasse/Struktur, die die Eigenschaftswerte enthält. Es sind Instanzen dieser vorhanden und werden dem Objekt nach dem Erzeugen übergeben.
Vorteil: Weniger Klassen
Nachteil: Weniger Dynamik

Ein Beispiel noch zu beiden:
1. PulseLaser-Klasse als abstraktes Überobjekt, davon erben PulseLaserC1, PulseLaserC2, die eigene Werte setzen etc.

2. PulseLaserDesc-Klasse die Werte wie Schaden, Verbrauch, Kosten, Modell etc. enthält. Bei Erstellen der nicht-abstrakten Klasse PulseLaser wird mit einer PulsLaserDesc initialisiert.


Welche Herangehensweise würdet ihr verwenden?

2

09.04.2015, 22:06

Wenn ich dich jetzt richtig verstehe, willst du wissen, wie man verschiedene Items von gleichen Typen am besten erstellt?

Man muss beachten, ob diese Items ihre Funktionsweise grundlegend ändern, oder ob sich nur bestimmte Werte ändern.
Wenn sich nur die Werte ändern, mach das über die selbe Klasse, andernfalls wird es komplizierter.
Aber an sich schreit das bereits nach einer entity component system. Google mal danach, das ist ein recht komplexes Thema, aber wenn man es richtig umsetzt eigentlich eine schöne Sache ;)
Damit kannst du einem Item praktisch ohne die Item Klasse an sich ändern zu müssen, neue Funktionsweisen zuweisen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »anti-freak« (09.04.2015, 22:12)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

3

09.04.2015, 22:41

Am simpelsten hat man einfach ein Array/ Map whatever von PulsLaserDesc Instanzen und der PulseLaser selbst haelt einfach nur einen Index/ Key um die Daten dort bei Bedarf abzuholen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

10.04.2015, 06:31

Aber an sich schreit das bereits nach einer entity component system.
Nein, es schreit nicht danach. Das hier gewünschte unterscheidet sich nicht von sonstigen OOP-Objekten. Die Werte, die die Objekte annehmen können, müssen halt irgendwo konfiguriert sein. Entweder in einem Array statisch kodiert, in einer XML-Datei hinterlegt oder in einer Datenbank. Aber ansonsten reicht es vollkommen aus eine einzige Klasse zu haben (z.B. Waffe mit den Eigenschaften Schadensart, Schadenswert, Feuerrate, visueller Effekt).
Selbst bei komplexeren Änderungen am Verhalten der Waffe, ist kein Entity Component System notwendig. Man macht ganz normales OOP-Design, wobei eine Komponente der Klasse eben ein Interface-Typ ist und die dahinter liegende Instanz ist polymorph. Alternativ (auch wenn nicht so schön) ist ein Switch-Case-Konstrukt ;)
Ich glaube manchmal, dass niemand mehr weiß, wie man richtiges OOP-Design einsetzt und dann wirft man halt mit Entity Component Systems um sich... Das Thema kommt in letzter Zeit so unglaublich oft hoch, es ist gruselig.
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]

5

10.04.2015, 07:11

Zitat

Nein, es schreit nicht danach. Das hier gewünschte unterscheidet sich nicht von sonstigen OOP-Objekten. Die Werte, die die Objekte annehmen können, müssen halt irgendwo konfiguriert sein. Entweder in einem Array statisch kodiert, in einer XML-Datei hinterlegt oder in einer Datenbank. Aber ansonsten reicht es vollkommen aus eine einzige Klasse zu haben (z.B. Waffe mit den Eigenschaften Schadensart, Schadenswert, Feuerrate, visueller Effekt).


Richtig, da habe ich mich anscheinend nicht richtig ausgedrückt. Wenn sich lediglich die Werte der Member ändern, ist so ein pattern alles andere als nötig!


Zitat

Selbst bei komplexeren Änderungen am Verhalten der Waffe, ist kein Entity Component System notwendig. Man macht ganz normales OOP-Design, wobei eine Komponente der Klasse eben ein Interface-Typ ist und die dahinter liegende Instanz ist polymorph. Alternativ (auch wenn nicht so schön) ist ein Switch-Case-Konstrukt ;)


Auch hier liegst du richtig, grundlegend benötigt er das nicht.


Zitat

Ich glaube manchmal, dass niemand mehr weiß, wie man richtiges OOP-Design einsetzt und dann wirft man halt mit Entity Component Systems um sich... Das Thema kommt in letzter Zeit so unglaublich oft hoch, es ist gruselig.
Ja, war ein wenig übereifrig von mir, allerdings glaube ich schon, dass ich das durchaus hinbekomme. Hab das ja schließlich auch schon oft genug selbst umgesetzt ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

10.04.2015, 07:17

Der letzte Satz war nicht zwingend auf Dich bezogen. Letztlich ist der Ansatz von TGGC (ob nun hardcoded oder per XML geladen) eben der einfachste, der den wenigsten Aufwand darstellt zur Laufzeit die Werte umzuschalten. Alternativ (und doch sehr ähnlich) wäre es denkbar, dass der "Shop" diese Werte hält und dem Zielobjekt zuweist, wenn der Spieler eine Ausrüstung wählt - oder eine passende Instanz mit diesen Config-Werten erzeugt und dem Spieler gibt (im Falle eines Inventars/Rucksacks z.B.).
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]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

7

10.04.2015, 08:07

der Ansatz von TGGC (ob nun hardcoded oder per XML geladen)
Das habe ich absichtlich nicht eingeschraenkt, da jeder abhaengig von seinen Anforderungen, Tools, Wissenstand etc. selbst darauf kommen sollte wie er dieses Array am besten fuellt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

10.04.2015, 09:21

Jo, schon klar. Ich wollte nur nochmal auf Möglichkeiten hinweisen, woher die Werte z.B. kommen könnten.
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

9

10.04.2015, 13:53

Alles klar, danke für die Antworten, ich denke ich hab verstanden wie man das am besten löst.

Werbeanzeige