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

29.07.2007, 15:45

designtechnische Frage

Meine Frage: Wie konzipiere ich am sinnvollsten eine Klasse, die verschachtelte Listen von Objekten enthält?
Beispiel: Eine Klasse, die die Spieler eines Spiels managt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Player {
int numGold;
int numWood;
int numInhabitants;

//....


std::vector<Unit> units;
};

class PlayerManager {
private:
std::vector<Player> m_players;
//andere Daten....


public:
//....

};


Mein Problem ist jetzt folgendes: Was ist sinnvoller, wenn ich auf Einheiten eines Spielers zugreifen will? Eine Funktion, die eine Kopie der gesamten Daten des Spielers zurückgibt?

C-/C++-Quelltext

1
2
3
Player PlayerManager::GetPlayer(int index) {
return m_players[index];
}


Oder eine Funktion, mit der man direkt auf eine Einheit zugreift:

C-/C++-Quelltext

1
2
3
Unit PlayerManager::GetPlayerUnit(int index,int unitIndex) {
return m_players[index].units[unitIndex];
}


Beides hat Vor- und Nachteile.
Außerdem: Sollte man den Spieler eher als Struktur (public-Elemente) oder als Klasse (Kapselung) beschreiben?
Mein Projekt: Rise of the Sylvan

2

29.07.2007, 15:48

warum willst du überhaupt auf die player units zugreifen? das hilft dir eh nichts wenn dann was zurückgegeben wird weil du eh nur die lokale variable bneutzt. also du solltest mmn dem manager eine funktion wie:

ChangePlayerAttritubutes(PlayerID, Wasgeändertwerdensoll, +/- x);

einbauen. Und den player würde ich als klasse machen un ddem dann auch solche ChangeAttribute funktionen verpassen. Auch wenn du koordinaten veränderst und so, ist das mit funktionen meinermmn übersichtlicher als wenn du einfach werte in einer struktur änderst.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

29.07.2007, 16:22

Du musst dir halt überlegen was du benötigst. Wenn du Playerobjekte hast dann bau dir eine Methode GetPlayer. Wenn du die Player "Units" benötigst, nimm deine 2. Methode. Brauchst du beides, implementier beide Methoden.

Was du aber definitiv nicht machen solltest ist eine Kopie des Players oder de rUnit zurückzugeben. Lieber eine konstante Referenz auf das Objekt in der Liste. Und die Methoden gleich auch noch konstant machen.
@D13_Dreinig

4

29.07.2007, 16:49

Danke für die Ratschläge. Werds mir mal durch den Kopf gehen lassen. Ich hatte vor allem Bedenken bezüglich Kapselung und Ausnahmesicherheit.
Mein Projekt: Rise of the Sylvan

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

29.07.2007, 17:29

Wenn du auf Player nicht zugreifen willst, dann kannst du die Struktur privat machen, ansonsten musst du sie ja zwangsläufig public machen! :)
@D13_Dreinig

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

6

30.07.2007, 11:10

ich würde den spieler sogar auf eine klasse und eine struktur aufteilen.(SPlayerType und CPlayer meinetwwegen.) Wenn du erstmal ne weile drann programmierst, wirst du feststellen, das bestimmte elemente von mehreren spielern gebraucht werden und diese immer gleich sind(meinetwegen ein modell). diese würde ich dann in die struktur packen und in der klasse einfach einen zeiger auf die struktur anlegen.
Von der Struktur erzeugst du dann ein objekt pro spielertyp(was weis ich, was es bei dir so für spielertypen geben kann) und die dann pro spieler ein objekt der klasse.

PS: Das konzept ist von David S. geklaut.^^

Socke

7

30.07.2007, 14:09

Ja ich weiß was du meinst. So habe ich das auch bei anderen Klassen gelöst. Die Sache mit den Spielern war ehrlich gesagt auch nur ein Beispiel^^. Ähnliche Probs hab ich auch bei der Modellklasse, weil es da sehr viele Verschachtelungen gibt alla

C-/C++-Quelltext

1
m_Scenes[i].m_Models[j].m_Vertices[k].m_Influences[l].weight

was sehr nervig ist. Da frag ich mich halt, ab wann man eine Klasse mit privaten Variablen und set/get-Funktionen und ab wann man halt einfach nur ne Struktur verwendet.
Mein Projekt: Rise of the Sylvan

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

30.07.2007, 15:21

Zum einen ist eine Struktur und eine Klasse in C++ bis auf einen kleinen Unterschied genau das Gleiche und zum anderen solltest du ohnehin alles Kapseln was nur geht!
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

30.07.2007, 15:33

@Crash also die Stelle musst du mal zeigen, wo sowas nötig ist, weil sowas sieht nicht nur seltsam aus, sondern ist auch ein zeichen dafür, dass was schiefgelaufen ist. Wenn es z.B. um das Zeichnen geht, sollte eigentlich jedes Modell eine Draw Methode haben.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

10

30.07.2007, 21:55

OK ihr habt recht im Prinzip ließe sich da was machen. Aber wie würdet ihr das bei ner Modellklasse mit Animationen und Partikelsystemen machen, dass die Modelldaten (Vertizes, Faces etc) von den Instanzdaten (aktuelle Transformation z.B.) getrennt wird? Entweder

C-/C++-Quelltext

1
2
3
void Scene::InitInstance(Instance& inst) {
//Zugriff auf Daten von Instance erforderlich

}


oder

C-/C++-Quelltext

1
2
3
void Instance::Init(const Scene& scene) {
//Zugriff auf interne Daten von Scene erforderlich

}
Mein Projekt: Rise of the Sylvan

Werbeanzeige