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

21

05.10.2014, 23:09

Ahhh okay. Ich habe meinen Text grade nochmal durchgelesen und man kann ihrn wirklich missverstehen ;)

Das einzige "Zusammenfassen" welches ich vorhabe, ist dass alle dieser Objekte von einer Klasse verwaltet werden. Also es bleibt bei polymorphen Klassen (wie im letzten Post erwähnt), aber es gibt den "GebäudeManager"(mir fällt grade kein besser Name ein). Das mache ich, damit die MainLoop nicht 500000 Zeilen lang wird. Ich hoffe man versteht, was ich mit der "Manager" Klasse meine. Ist das denn so "erlaubt"? ;)

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

22

05.10.2014, 23:27

Was tut er denn? Ist er eine Factory oder so? Oder kannst du über ihn alle Gebäude bekommen?

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

23

18.10.2014, 23:50

Was tut er denn? Ist er eine Factory oder so? Oder kannst du über ihn alle Gebäude bekommen?
Ich verstehe jetzt nicht ganz, was du meinst?!?
Falls du den "BuildingManager" meinst, das ist einfach eine Klasse, welche die Gebäude und verschiedene Methoden für diese vereint.

Ich hab da nochmal ein Problemchen. Die Türme haben gleichnamige Methoden, manche brauchen aber andere Werte als andere übergeben. Ich dachte mir, dass ich das ganze in etwa so gestalte:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
if (tower.at(i) == type1)
{
    tower.at(i).Update(Wert1, Wert2)
}
else if (tower.at(i) == type2)
{
    tower.at(i).Update(Wert1,Wert3)
}
.....

Leider komme ich da um diese Verschachtelungen nicht drum rum, weil manche nunmal andere Werte als andere benötigen. Diese kommen allerdings nur sehr selten vor. Ist das so in Ordnung?

Ausserdem habe ich eine Frage zur Überprüfung, welche Klasse der aktuelle Turm nun ist. Ich habe gelesen, dass "if(typeid(tower.at(i)) == typeid(Klasse1))" die beste Möglichkeit wäre. Was sagt ihr dazu?

24

19.10.2014, 02:46

Kann man so machen. Ich würde aber lieber noch eine abstraktionsebene einführen, sodass die update Funktion bspw. Je nach Implementation unterschiedliche Parameter bekommt. Sobald du mehrere solcher unterscheidungen hast, wird es sonst unschön.

Zur Frage, wie man den Typ einer klasse feststellen kann: ein richtiges typeof wie in anderen Sprachen gibt es glaub ich nicht in c++, genauso wenig wie eine "beste" Lösung für das Problem. Ich persönlich würde diese Abfragen, von welchem Typ eine Instanz ist, so weit wie möglich minimieren, am besten darauf Gang verzichten. Wenn es doch sein muss, sollte man der Implementierung eine GetType Funktion spendieren, die dann bspw. Einen enum Wert zurück gibt.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (19.10.2014, 02:51)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

25

24.10.2014, 13:55

Ich finde, dass die Stelle, die die Update-Methode aufruft, nicht zwischen den verschiedenen Ausprägungen unterscheiden müssen sollte. Wenn alles Türme/Gebäude sind, dann sollten sie auch eine einheitliche Schnittstelle haben. Das heißt nicht nur, dass die Parameterliste übereinstimmt, sondern auch, dass die Bedeutung der einzelnen Parameter der gleiche ist und somit bei allen Türmen die gleiche Methode auf die gleiche Art aufgerufen werden kann. Entweder werden alle benötigten Parameter er einzelnen Ausprägungen in der Parameterliste aufgeführt, die Parameter werden (abhängig davon, was es eigentlich für Parameter sind) dem Turm zugewiesen, bevor die Methode aufgerufen wird (dürfte in den meisten Fällen aber ebenfalls eher schlecht sein) oder die Parameter werden in einem einzigen Objekt zusammengefasst, welches dan übergeben wird. Im ersten und letzten Fall werden dann die Werte, die nicht relevant sind, einfach ignoriert.

Auch wenn andere Sprachen entsprechende Konstrukte (instanceof, is o. ä.) besitzen, sollte man dennoch grundsätzlich so weit wie möglich auf solche Typprüfungen verzichten.

Wichtig zu überdenken wäre auch, was das für Werte sind, die übergeben werden, und ob diese wirklich übergeben werden müssen. Es könnte auch gut sein, dass die einzelnen Türme eher eine Referenz auf ein andere Objekt erhalten, bspw. bei der Initialisierung, von dem zu gegebener Zeit der gewünschte Wert abgerufen werden kann.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

26

24.10.2014, 14:28

dito @ Sacaldur
So und nicht merkwürdig anders.
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

27

24.10.2014, 20:25

Hmmmm, okay, hier ist meine aktuelle Idee:

Erstmal zur Erklärung: Ein Tower besteht immer aus 2 Klassen, einmal die logische und dann die grafische Klasse. Beides wird in jeweils einem Vektor gespeichert. (vector<lT> l; vector<gT> g;). Das gleiche wie bei den Towern gilt auch für alle Arten von "Schüssen", also gS und lS. Wobei hier die "Schüsse" in dem Object des jeweiligen Towers gespeichert werden.

Wäre es in Ordnung, wenn dem logischen Tower sein grafischer Partner bekannt ist? Weil dann würde ich das ganze in etwa so gestalten, dass der Tower alles für sich updatet und dann die entsprechenden Werte (vor Allem Winkel und ähnliches) bim grafischen Tower ändert. Selbiges würde natürlich auch gehen, wenn der Update Methode der grafische Tower übergeben wird.

So könnte ich eigentlich alle diese Überprüfungen umgehen. Dann muss ich nur noch die Kelinigkeit ändern, dass jeder Tower die gleiche Werte übergeben bekommt.


Ich glaube mein Geschriebenes hört sich sehr merkwürdig an und ich hoffe ihr versteht, was ich meine.

28

25.10.2014, 14:05

Meiner Meinung nach sollte keiner von beiden den anderen wirklich "kennen", sondern eine Datenklasse oder vergleichbares anlegen. Die Logic hat darauf schreibenden Zugriff, die Visuelle Klasse lediglich lesenden (const Referenz).
In dieser Klasse werden dann eben Sachen wie, X und Y und Rotation und ähnliches gespeichert. So würde ich das in diesem Falle angehen.

mfg

29

25.10.2014, 17:51

Du könntest auch btw eine map machen, die als Key std::type_index hat, mit einem vector der Objekte als value.
Mit typeid holst du dir dann die entsprechenden Gebäude da heraus.
Ob das hier sinnvoll ist, keine Ahnung, recht vage, aber ich wollts mal erwähnen.

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

30

25.10.2014, 17:53

Dann kann er auch gleich mehrere speziell typisierte Listen verwenden und sich die Casterei schenken - sofern er welche braucht.
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]

Werbeanzeige