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

25.09.2006, 18:37

Umsetzung einer Levelkarte

Hallo!

Ich programmiere schon seit einiger Zeit an einem Programm, das eine per Textfile erstellte Levelkarte darstellen soll.
Mein Problem ist jetzt, in welcher Form ( also in welchem Datentyp) ich die Karte selbst implementieren soll.
Meine allererste Idee war, einen 2D-Vektor in der Größe der Karte zu nehmen, in den dann die Informationen für jedes Objekt gespeichert wird.
Beispiel: An Position (2,3) der Karte soll ein Haus stehen, also steht in worldMap.at(2).at(3) ein Pointer, der auf die Instanz der Hausklasse zeigt (wobei worldMap der angesprochene Vektor sein soll).

Hier entsteht nun schon das Problem: Da die Karte offensichtlich nicht nur aus Instanzen der Klasse "Haus" bestehen soll, habe ich eine Oberklasse definiert, von der sich sämtliche Objekte der Karte ableiten (also Häuser, Verzeirungen, Einheiten ...) . So ist es mir möglich, jeden beliebigen Gegenstand in die Karte einzufügen.
Schwierig wird es dann aber, wenn ich wieder auf die Objekte zugreifen will: Als Vektorinhalt habe ich jetzt ja nur Instanzen der Klasse BaseThing ( das ist die Klasse, von der ich sämtliche Objekte ableite ), und der fehlen nun mal ganz spezielle Funktionen, wie etwa die Möglichkeit, Ressourcen abzubauen o.ä..

Ich könnte jetzt natürlich diese speziellen Funktionen, die erst in der x-ten Ableitung der Klasse auftreten, als virtuelle Funktionen in der Basis-Klasse definieren, aber das kommt mir extrem unelegant vor. Nichtzuletzt, weil die Basisklasse dann gigantische Ausmaße annimmt.

Mir scheint damit der Weg über eine solche "Überklasse" nicht unbedingt der richtige zu sein - hat jemand von euch eine Idee, wie ich das besser machen kann? Vielleicht eine ganz andere Datenstruktur für die Levelkarte?

Danke schonmal im Voraus!
Ich bin nicht verrückt, meine Herren, ich bin lediglich zu allem fähig.

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

2

25.09.2006, 21:13

Gib doch einfach jedem Objekt eine ID von der du die bjektdefinitionen herleitest! ;)

3

26.09.2006, 09:48

Hab ich mir auch schon überlegt, aber wahrscheinlich gingen meine Überlegungen da wieder in die falsche Richtung ...
Kannst du vielleicht ein kurzes Beispiel geben, wie du das meinst?

Ich krieg nämlich jedes Mal nen Typenkonflikt, wenn ich den Inhalt des Tiles vom Typ cBaseTile als die abgeleitete Klasse cResourceTile zurückgeben will ...

Dann hab ich mir überlegt, beim Abfragen der Kachel jeweils ein Objekt der passenden Klasse neu zu instanziieren, aber irgendwie ist das doch ziemlich ineffizient, und wenn ich in der Basisklasse sowieso alle Daten speichern kann, brauch ich irgendwie auch keine Vererbung.
Ich bin nicht verrückt, meine Herren, ich bin lediglich zu allem fähig.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

26.09.2006, 11:20

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
enum TILETYPE
{
    TILE_HOUSE,
    TILE_RESOURCE
};


class IBase
{

public:

    virtual TILETYPE getType() = 0;

    // ...


    IBase() {};
    virtual ~IBase() {};

};


class IHouse : public IBase
{

public:

    TILETYPE getType() { return TILE_HOUSE; };

    void openDoor();

    // ...


    IHouse() {};
    ~IHouse() {};

};


class IResource : public IBase
{

public:

    TILETYPE getType() { return TILE_RESOURCE; };

    int getAmount();

    // ...


    IResource() {};
    ~IResource() {};

};

// ...


switch( tiles[x][y]->getType() )
{

    case TILE_HOUSE:

        IHouse* h = reinterpret_cast<IHouse*>(tiles[x][y]);

        h->openDoor();

        break;

    case TILE_RESOURCE:

        IResource* res = reinterpret_cast<IResource*>(tiles[x][y]);

        res->getAmount();

        break;
}

Werbeanzeige