Ich hab mich in letzter Zeit wieder ein bisschen damit beschäftigt und möchte euch jetzt mein "Konzept" dazu vorstellen
Also:
Ich hab einen kleinen Editor mit SDL geschrieben. Er verwendet 3 Klassen. Die 1. zur Verwaltung der Map (also zeichnen, speichern usw.). Die . ist ein einzelnes Tile. Die ist recht klein, enthält nur die Nummer der 32*32 Pixel Grafik im Tilesheet und einen Konstruktor. Die 3. ist ein (selbst implementierter

) 3D-Vektor aus Tiles. Dies ist also die eigentliche Map und ist auch in der 1. Klasse enthalten.
Die Map hat x, y und z (fixe Layers) Koordinaten. Sie ist mindestens 20*20 Tiles groß, aber eben dynamisch. Und wie bestimme ich jetzt die Position eines Tiles in der Map? Der Cursor im Editor ist das aktuelle Tile, rechts unten wird auch die aktuelle Schicht angezeigt. Klickt man jetzt auf einen Platz in der Map, übergebe ich den SDL_Event an die Methode LayTile.
Diese sieht so aus:
Code: Alles auswählen
void CMap::LayTile (SDL_Event event, int tile, int layer) // Klick-Event, Nummer des Tiles, Schicht
{
int x, y, xpos, ypos; // Koordinaten
x = event.button.x - (event.button.x % 32); // Koordinaten auf die letzte durch 32 teilbare Zahl abrunden
y = event.button.y - (event.button.y % 32);
xpos = x / 32; // durch 32 dividieren, ergibt die Position im 3D-Vektor
ypos = y / 32;
map.v[xpos + distleft][ypos + distup][layer].SetTile (tile); // Wert im Vektor setzen
}
Also ich runde auf die letzte im x- und y-Bereich teilbare Zahl ab. Dann bin ich am linken oberen Eck des Feldes (im Fenster), wo die Grafik hinkommen soll. Dividiere ich durch 32, erhalte ich die x- bzw. y-Position im Vektor. "distleft" und "distup" sind Member der Klasse und die Entfernungen vom linken bzw. oberen Rand, der durch das Scrollen in der Map entsteht. Layer wird von main übergeben. So kann ich bequem ins binary-File schreiben und muss mir keine Gedanken über Ordnung machen, da der Vektor ja schon geordnet ist.
Wie findet ihr diesen Ansatz?
Mir gefällt er gut, da er recht einfach ist und auch das Scrollen in der Map nicht schwer zu implementieren war.