Ich programmiere einen Level-Editor für ein neues Spiel. Das Problem ist, ich bin nicht sicher, welche Struktur zum Speichern meiner Daten verwendet werden soll.Datenstruktur 2d/3d Array von Fliesen C++
Es ist eine Kachel-basierte Karten-Engine, die x- und y-Koordinaten und eine ID für die Kachel an dieser Position verwendet.
Ich habe mehrere Ebenen, die Größe der Karte ist veränderbar, daher kann ein Array mir Probleme bereiten, deshalb habe ich für diesen Fall einen std :: vector gewählt. Um eine große Überlastung zu vermeiden, füge ich nur eine Kachel hinzu, wenn jemand sie platziert, also ist die Vektorgröße Null, wenn keine Kacheln vorhanden sind, und erhöht sich, je mehr Kacheln platziert werden.
struct tile {
unsigned short tile_id;
unsigned short tile_x;
unsigned short tile_y;
};
Und mein Vektor:
std::vector<tile> tiles;
Die Sache ist, bevor Sie eine neue Kachel hinzugefügt ich überprüfen müssen, ob es bereits eine Kachel an dieser x- und y-Position.
// Returns true/false if there is a tile at given position or not
bool Layer::has_tile_at(unsigned short x, unsigned short y) {
unsigned int i;
for (i = 0; i < tiles.size(); i++) {
if (tiles[i].tile_x == x && tiles[i].tile_y == y)
return true;
}
return false;
}
Mein Problem ist, dass für jede Kachel platziert, muss ich Schleife durch den ganzen Vektor, der schnell am Anfang, aber wirklich ein Schmerz in den Arsch bekommt, nachdem einige Fliesen gelegt wurden.
Glaubst du, mein Ansatz ist soweit in Ordnung, oder ist etwas intelligenter und leistungsfähiger?
Die zu verwendende Datenstruktur sollte hauptsächlich von den Anwendungsfällen abhängen: Wenn Sie hauptsächlich (x, y) lesen, dann benötigen Sie vielleicht eine Matrix (sei es über einen Vektor von Vektoren oder nur Array von Arrays). Wenn Sie indizierten Zugriff benötigen UND leicht über Kacheln iterieren können, behalten Sie die Daten möglicherweise in zwei Datenstrukturen?Sie sollten in der Lage sein, einfach eine 2D-Karte mit Zeigern auf Kacheln in Vektor zu implementieren - zunächst leer, lazy geladen auf (x, y) Zugriff (erinnern Sie sich an Datensicherheit!) – hauron
Können Sie Ihre letzte Aussage weiter erklären? Vielen Dank! – elasticman
@elasticman Er tat es. Schauen Sie unten auf die Antworten. – WhozCraig