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

Korowai

unregistriert

1

03.04.2015, 21:02

mehrdimensionale Objekte?

Hi,

ich habe folgendes Problem:

Man denke sich ein Objekt, etwa eine Klasse für Mittelalterliches Kriegsgerät, also diverse Einheiten, die wiederum über bestimmte Attribute verfügen.

Das ist mir soweit klar.

Was ist nun, wenn ich mehrere Spieler habe (SPieleranzahl forlaufend entwickelnd) , die über diese Objekte verfügen und gar neue Arten dieser EInheiten erzeugen können? WIe sieht das in code aus, was muss ich mir aneignen und lernen?

So in etwa:

Man nehme

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class CModell
{
   public:
...
...
...
}
...
...
CModell Spieler "Variable für Spieler". "Variable für Modell";
...
...
Spieler"Variable"."Variable".Parameter des Objekts;


WIe funktioniert das?

Vielen Dank für die Hilfe...

Korowai

unregistriert

2

04.04.2015, 06:36

Nachtrag

Kann ich die Objektträger in ein array packen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

04.04.2015, 11:21

Was sind deine Objektträger? An sich kannst du alles in ein Arrays packen. Besser als Arrays bieten sich Datenstrukturen wie Listen, Queues, Stacks, etc an.
Möchtest du eine Klasse haben welche zum Beispiel Spieler verwaltet, Spieler erzeugen, Spieler löschen und mehr kann, so könnte diese Klasse eine Liste vom Typ Spieler besitzen. Hier werden ein paar STL Container beschrieben. Für C++ wären die vermutlich deine Wahl.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

4

04.04.2015, 12:51

Nimm einfach einen std::vector.
Ein std::vector ist im Prinzip ein dynamisch wachsendes oder auch wieder kleiner werdendes Array. Die Suche nach anderen Datenstrukturen sind meistens Overengineering und sind in der Praxis langsamer und auch noch umständlicher zu verwenden, weil es kein Random Access gibt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (04.04.2015, 12:57)


Korowai

unregistriert

5

06.04.2015, 12:59

Hi,

habe mich jetzt ein wenig in der stl eingelesen.
Das trifft, glaube ich, nicht ganz das, was ich suche.

Also, ich habe ein Objekt:
class Einheiten.

Diese unterteile ich in:
1. Reiter
2. Bogenschütze
...
...

Und diese fortlaufende Liste aus Objekten soll dann mehreren SPielern zuordbar sein.

SO dass jeder SPieler, sagen wir mal 4 SPieler, über eine Objektgruppe der EInheiten verfügt, die konstruiert und zerstört werden können.

DAfür bräuchte ich einen Befehlssatz, und mir ist, ich hatte leider nicht allzuviel Zeit, nicht klar, wie ich das bewerkstellige.

TOll wäre bspw ein Konstrukt aus

int i=4
SPieler (i). Einheiten. Speerträger
etc...

Kann mir da jemand einen TIpp geben?
Falls die Lösung bereits genannt wurde, bitte ich um GEduld, ich hoffe, ich komme heute dazu, mehr darüber zu lesen.

Danke,

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

06.04.2015, 13:06

Was genau ist dabei jetzt dein Problem? Ich sehe irgendwie keine richtige Frage.
Willst du auf den Spieler per Index zugreifen? Pack die Spieler in einen std::vector. Dann hat so ein Spieler einen std:.vector auf die Speerträger und auf deine anderen Einheiten.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Spieler {
public:
  std::vector<Einheit> Speerträger;
  Spieler() {
    Speerträger = std::vector<Einheit>();
  }
};


// Benutzung:
std::vector<Spieler> spieler = std::vector<Spieler>();

// Spieler erstellen und in den std::vector packen
spieler[3].Speerträger.MachIrgendwas();

So könnte so etwas funktionieren.

edit: new aus dem Code genommen. Stimmt die waren falsch, sind ja keine Pointer.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schorsch« (06.04.2015, 16:32)


7

06.04.2015, 15:23

@Schorsch: Das war wohl zuviel Java?
Lass die new weg.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Korowai

unregistriert

8

06.04.2015, 17:12

Hi,

vielen Dank. Das sieht gut nach dem aus, was ich machen möchte. Ich lese mich da mal ein und beschäftige mich mit der praktischen Anwendung.

Melde mich dazu nochmal.

Ciao

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

06.04.2015, 17:21

Der Quellcode von Schorsch ist immernoch grauenvoll. In C++ wird der Konstruktor automatisch aufgerufen, weil nicht alles über einen Pointer aufgelöst wird. Da ein zweites Objekt zu erzeugen und an Stelle des ersten schieben, ist ziemlicher Blödsinn. Der Code unter Schorsch letzten Kommentar macht für mich auch wenig Sinn.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class Player
{
public:
    std::vector<Einheit> Speerträger; //Wird automatisch konstruiert.
};

// Benutzung:
std::vector<Player> players;

// Spieler erstellen und in den std::vector packen:
spieler.emplace_back(); //Neuen Spieler direkt im std::vector erstellen
//oder...
spieler.push_back(Spieler()); //Spieler Objekt erstellen und dann in den std::vector schieben.


"Einheit"/"Speerträger" scheint mir gerade auch nicht all zu sinnvoll. Vielleicht ist aber nur die Benamung falsch.
Vorschlagen würde ich std::vector<Einheit> Einheiten;, wobei die "Einheit" zum Beispiel eine Enumeration sein könnte, die "Speerträger", "Reiter" und so weiter beinhaltet.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (06.04.2015, 17:30)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

06.04.2015, 17:31


edit: new aus dem Code genommen. Stimmt die waren falsch, sind ja keine Pointer.

Ich hab' dir doch gesagt das C# auf Dauer nicht gut für dich ist. :P
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige