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

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

05.10.2014, 01:11

Best approach: Viele ähnliche Objekte zusammenfassen

In meinem derzeitigen Projekt gibt es eine Menge Gebäude, welche je nach Art unterschiedliche Variablen haben. Es geht hier nicht um unterschiedliche Werte, sondern komplett andere Variablen.
Beispiel:
Gebäude X:
Trefferpunkte, Produktion pro Minute, Stufe, ....
Gebäude Y:
Schaden, Feuerrate, Reichweite, ......

Nun möchte ich eine Klasse haben, welche alle Gebäude managt, also sie speichert, updatet und zeichnet. Ich bin mir allerdings nicht so sicher, wie ich alle Gebäude innerhalb der Klasse speichern soll.

Meine Idee wäre entweder ein zwei dimensionaler Vector oder eine Map. Mich würde interessieren, was eurer Meinung nach die beste Möglichkeit ist. Mir ist bewusst, dass es nie die eine glorreiche unschlagbare Möglichkeit gibt und dass im Endeffekt jeder Weg nach Rom führt, aber ich finde es interessant verschiedene Meinung zu sehen und sie zu diskutieren. So kann jeder noch was lernen :thumbup:

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

05.10.2014, 01:32

Wieso ein zweidimensionaler std::vector? Polymorphie nutzen und gut ist.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

05.10.2014, 03:18

Jo ich würd auch auf Polymorphie zurückgreifen. Gemeinsame Basisklasse, die die Grundlagen zusammenfasst, evtl. sogar abstrakt oder Interface, je nachdem was am besten passt.
Und dann Pointer auf die Basisklasse speichern. Dank dynamic_cast kannst du sie später sicher wieder zurückkriegen.

4

05.10.2014, 13:09

Polymorphie wäre mit Sicherheit die intuitive Lösung, es ist aber nicht notwendigerweise wirklich die Beste. Das hängt aber natürlich stark davon ab, was du letztendlich alles in deinem Programm haben wirst und auch, ob geplant ist, es später zu erweitern.
Aber du fährst damit bestimmt nicht schlecht. Ich würde empfehlen, einen std::vector zu nehmen, und darein unique_ptr's vom Basisklassentyp zu packen. Die sind super für die Speicherveraltung, und wenn du sie nicht kennst, wäre jetzt ein guter Zeitpunkt, sie sich anzusehen. Im Grunde sind sie auch ganz simpel zu benutzen.
Lieber dumm fragen, als dumm bleiben!

5

05.10.2014, 13:18

Die Problematik erinnert stark an die Frage der Umsetzung von entities. Ein Ansatz ist polymorphie. Ein anderer, und der gebräuchlichste, ist der, das ganze component-based aufzubauen. Dann hat in deinem Beispiel jedes Haus die selbe klasse. Kann aber durch Komposition bspw. Unterkomponenten tragen, die die Standard Haus klasse erweitern.
Wie du dann letztendlich die Instanzen der Hauptklasse speichert ist trivial. Wenn du pro Haus eine id festlegen möchtest bietet sich eine map an.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

05.10.2014, 13:28

Ob component-based jetzt wirklich der "gebräuchlichste" Ansatz ist, lässt sich hier wohl in ein Streitgespräch führen.
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]

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

7

05.10.2014, 13:31

Danke euch allen für die hilfreichen Rückmeldungen.

Bei Polymorphie habe ich allerdings ein Problem und zwar handelt es sich dabei doch immer um eine ist-Beziehung. Ich könnte zwar alle Gebäude auf ihren kleinsten gemeinsamen Nenner runterbrechen, dass sie eben Gebäude sind. Da würde es allerdings so ziemlich keine gleichen Werte geben.
Aber wenn ich weiter so drüber nachdenke, denke ich dass es vielleicht sinnvoll ist, Polymorphie zu benutzen, aber nicht für alle Gebäude. Gewisse Gebäude haben ähnliche Werte und diese könnte ich zusammenfassen.

Ich muss zugeben, dass ich bei meinen Überlegungen irgendwie gar nicht auf Polymorphie kam. Ich denke mal, dass damit alles geregelt ist. Ihr wart wie immer eine gute Hilfe. DANKE :thumbsup: :)

Tobiking

1x Rätselkönig

  • Private Nachricht senden

8

05.10.2014, 14:35

Bei Polymorphie habe ich allerdings ein Problem und zwar handelt es sich dabei doch immer um eine ist-Beziehung. Ich könnte zwar alle Gebäude auf ihren kleinsten gemeinsamen Nenner runterbrechen, dass sie eben Gebäude sind. Da würde es allerdings so ziemlich keine gleichen Werte geben.

Bei Polymorphie geht es nicht nur um die enthaltenen Werte, sondern auch um das Verhalten. Wenn sich die Gebäude nach deinen Anforderungen selber updaten, speichern und zeichnen, haben sie schon eine Gemeinsamkeit.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

9

05.10.2014, 15:52

Wenn er das mit "ähnlichen Werten" anspricht, könnte man die Werte und ihre Funktionalitäten doch vielleicht besser in Components kapseln. Also eine AttackComponent die dann Damage, FireRate und so enthält und schießen kann oder so.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

10

05.10.2014, 15:57

Ist es denn wirklich noetig, das es so eine starke Verbindung von den unterschiedlichen Teilen des Gebaeudes gibt? Ich wuerde einfach zu den unterschiedlichen Funktionen eines Gebaeudes unterschiedliche Klassen machen, welche jeweils dann auch in ihren eigenen Listen, Maps etc. liegt. Also z.b. eine Klasse, die sich nur mit dem Rendern eines Gebaeudes auseinandersetzt. Oder mit der Produktionsfunktion. Oder der Kampffunktion. Wenn jetzt ein Gebaeude aus diesen 3 Funktionen besteht, so haette es einfach in jeder der drei Listen einen Eintrag. Du brauchst dann nur noch eine Moeglichkeit, wie dieses einzelnen Teile untereinander kommunizieren, denn das wird ab und an dann doch noetig sein. Eine Moeglichkeit waere z.B. das jedes Teil die ID des Gesamtgebaeudes kennt und an Hand der ID man nach allen Teilklassen des Hauses sucht.

Werbeanzeige