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

1

19.11.2010, 18:24

Inventory in c++ programmieren - Listen

Huhu, habe vor ein kleines Textadventure zu basteln und bin auf Probleme gekommen bezüglich der Item/Inventarverwaltung.

Ich habe mir zunächst folgende Klassen geschrieben.
class cGame Enthält zwei Listen mit Zeigern auf die Objekte von cWeapons & cArmors
class cWeapons Klasse für alle Waffen im Spiel
class cArmors Klasse für alle Rüstungen im Spiel
class cPlayer Enthält zwei Listen mit Kopien der Waffen & Rüstungsobjekte

Jetzt taucht aber das Problem auf, dass ich nicht weiß ob es optimal ist für den Spieler erneut zwei Listen (für die Waffen und Rüstungen die er besitzt) zu erstellen. Hatte mir das so gedacht, dass die Objekte einfach in diese neuen Listen kopiert werden.

Und wenn ich das so machen möchte, stoße ich auf folgendes :

Meine Listen sind immer private und ich möchte vermeiden dafür Get und Set-Methoden zu schreiben. Ich hatte nämlich vor über die Listen der cGame Klasse - die ja alle Waffen und Rüstungen enthalten - die beiden Inventar-Listen des Spielers zu füllen. Komme aber in der cPlayer Klasse nicht so einfach an die Liste ran. Das ist auch der eigentlich Grund warum mich dieser Lösungsansatz ein bisschen schmunzeln lässt. "Muss doch anders gehen" hab ich im Hinterkopf.

Könnt ihr mir bei der Problematik weiterhelfen?
Danke schonmal :)

2

19.11.2010, 19:11

Vielleicht dett Janze mal hierarchisch angehen?

cGame - Oberste Ebene, da cGame wohl nur einmal existiert

cPlayer - Zweite Ebene (gibt vermutlich auch nur einen Spieler)

cWeapons - 1 Spieler mit x Waffen
cArmors - 1 Spieler mit x Rüstungen


Bei einem entsprechenden Klassensystem sollte cGame, die gleichzeitig alles steuert, Zugriff auf alle Member haben.
Mein spontaner Einfall dazu. Haut mich, wenn ich daneben liege... 8|
fka tm

3

19.11.2010, 20:54

Danke schonmal für die Antwort aber werd' daraus nicht ganz schlau momentan.

Zitat

cWeapons - 1 Spieler mit x Waffen
cArmors - 1 Spieler mit x Rüstungen


Das klingt ja jetzt nach 2 Instanzen der Klasse cPlayer oder was wolltest du damit aussagen?


Zitat

cGame [...] Zugriff auf alle Member haben.


Aufgebaut ist es ja so, dass die Klasse cGame einen Zeiger auf das cPlayer Objekt enthält. cGame kann damit ohne Probleme auf den Spieler zugreifen: aber logischerweise nur auf die public Funktionen. An irgendwelchen privaten Listen kommt die Klasse auch nicht ran.

Wenn ich jetzt also über cGame dem Spieler etwas ins Inventar legen möchte, brauch ich Zugriff auf:
  • Die Liste mit allen Waffen/Rüstungen
Das ist gegeben, weil die Liste ja sowieso Teil der Klasse ist und die privaten Member intern ja genutzt werden können.

  • Die Liste mit allen Gegenständen im Inventar des Spielers. (Also die zwei Listen für Waffen und Rüstungen, die der Spieler besitzt)
Hier hat halt cGame dann auch keinen Zugriff. Weiß nicht wie ich das regeln soll ohne Get und Set Methoden.

4

19.11.2010, 21:07

Das klingt ja jetzt nach 2 Instanzen der Klasse cPlayer oder was wolltest du damit aussagen?

Ich vermute, er meinte eher, das du das inventar des Spielers nochmal kapselst.
sprich, cPlayer enthält ein cWeapons und ein cArmors.
Weiß nicht wie ich das regeln soll ohne Get und Set Methoden.

wie wärs mit cPlayer::addItem, removeItem, hasItem, ...
du kapselst halt die listein in cPlayer, bzw. nach TMs Vorschlag in einer weiteren klasse, und machst exat die funktionalität public, die andere klassen benutzen sollen. Dank inlining verbraucht das in der regel nichtmal leistung.

5

19.11.2010, 22:11

Zitat

sprich, cPlayer enthält ein cWeapons und ein cArmors.


Das erschliesst sich mir gerade auch noch nicht was du damit meinst. Das hört sich nämlich so an als sollte die Klasse cPlayer jeweils ein Objekt aus der Klasse cWeapons und eins aus der Klasse cArmors erhalten. Sehe aber den Sinn noch nicht ganz dahinter. Der Spieler braucht ja ein bestimmtes Objekt, was schon existiert (also eine bestimmte Waffe/Rüstung).

Zitat

cPlayer::addItem


Versteh's hier auch nicht ganz, was da rein soll. Der Namen sagt eigentlich alles aus, allerdings frag ich mich über welche Schnittstellen das geschehen soll. Fakt ist, dass die Methode addItem Zugriff auf die Liste aller Items haben muss (cGame: std::list<cArmors*> m_lArmors und std::list<cWeapons*> m_lWeapons ), sowie Zugriff auf das "Inventar" des Spielers.
War der Vorschlag jetzt, das Inventar des Spielers als gesonderte Klasse zu betrachten, die nichts weiter enthält als eine Liste, sowieso Zugriffsfunktionen ? (class cInventory mit wieder 2 Listen für Waffen & Rüstungen)

Danke schonmal :P

6

19.11.2010, 22:29

Also
cGame hat zugriff sowohl auf die listen der objekte, als auch auf die liste der spieler.
Jeder Spieler hat ein cArmors und ein cWeapons objekt.
Für cArmors (cWeapons funzt analog):
cArmors enthält wiederrum die liste der rüstungen.

Will jetz z.B. das spiel dem spieler eine neue rüstung geben, lässt es sich vom spieler eine referenz auf dessen cArmors geben. Dann schnappt es sich das entsprechende Objekt aus seiner liste, und ruft cArmors::add() mit diesem auf.
Soll eine andere Klasse auch in der Lage sein, einem spieler eine neue Rüstung zu verpassen, braucht cGame natürlich eine möglichkeit die Rüstungen abzufragen. Oder man verwendet die bestehende Abstraktion wieder und verpasst cGame auch ein cArmors, oder falls es unterschiedliche Zugriffe braucht, kann man dank vererbung trotzdem Gemeinsamkeiten ausnutzen...
Sowas ist ja grade das tolle an Objektorientierung...

Das sind jetz einfahc mal ein paar anregung, was letzendlich die beste lösung ist, wer was kapselt/speichert, welchen zugriff darauf bietet,... hängt natürlich von deinem Gesamtdesign ab.

7

19.11.2010, 22:37

Hört sich gut an. Werd' mich morgen mal dransetzen. vielen Dank euch und schönen Abend/Nacht noch =)

Werbeanzeige