Aktualisierung: Korrigierter Kartenrendering-Algorithmus, weitere Illustrationen hinzugefügt, Formatierung geändert.
Vielleicht ist der Vorteil für die „Zick-Zack“ -Technik zur Abbildung der Kacheln auf den Bildschirm kann, dass die x
und y
Koordinaten auf den vertikalen und horizontalen Achsen sind die Fliesen gesagt werden.
„Zeichnung in einem Diamanten“ -Ansatz:
Durch eine isometrische Karte Zeichnung mit „in einem diamantenen“, das ich glaube, bezieht sich auf nur die Karte Rendering durch einen verschachtelten for
-loop über die beide mit -dimensional Array, wie dieses Beispiel:
tile_map[][] = [[...],...]
for (cellY = 0; cellY < tile_map.size; cellY++):
for (cellX = 0; cellX < tile_map[cellY].size cellX++):
draw(
tile_map[cellX][cellY],
screenX = (cellX * tile_width/2) + (cellY * tile_width/2)
screenY = (cellY * tile_height/2) - (cellX * tile_height/2)
)
Vorteil:
der Vorteil für den Ansatz ist, dass es eine einfache verschachtelte for
-Schleife mit ziemlich geradliniger Logik, die durchgängig in allen Kacheln funktioniert.
Nachteil:
Ein Nachteil dieses Ansatzes ist, dass die x
und y
Koordinaten der Fliesen auf der Karte in diagonalen Linien zu erhöhen, was es optisch schwieriger machen könnte, um die Position auf dem Bildschirm abzubilden auf die Karte als Array dargestellt wird:
jedoch wird ein pitfall zur Umsetzung des obigen Beispielcode, dort sein - die Render-Reihenfolge verursacht Fliesen, die soll hinter bestimmten Fliesen sein oben auf den Fliesen vor gezogen werden:
Um dieses Problem zu ändern, der inner for
-loop der Reihenfolge umgekehrt werden muss - vom höchsten Wert ausgehend und in Richtung des unteren Wert Rendering:
:
tile_map[][] = [[...],...]
for (i = 0; i < tile_map.size; i++):
for (j = tile_map[i].size; j >= 0; j--): // Changed loop condition here.
draw(
tile_map[i][j],
x = (j * tile_width/2) + (i * tile_width/2)
y = (i * tile_height/2) - (j * tile_height/2)
)
Mit der obigen Lösung, die Wiedergabe der Karte soll korrigiert werden
„Zig-Zag“ -Ansatz:
Vorteil:
Vielleicht ist der Vorteil der „Zick-Zack“ -Ansatz ist, dass die übertragene Karte ein wenig mehr vertikal kompakt erscheinen als der "Diamant" Ansatz:
Nachteil:
Aus dem Versuch, die Zick-Zack-Technik zu implementieren, ist der Nachteil, dass es ein wenig schwieriger ist, den Rendering-Code zu schreiben, weil es nicht verschachtelt for
-loop über jedes Element in einem Array geschrieben werden kann:
tile_map[][] = [[...],...]
for (i = 0; i < tile_map.size; i++):
if i is odd:
offset_x = tile_width/2
else:
offset_x = 0
for (j = 0; j < tile_map[i].size; j++):
draw(
tile_map[i][j],
x = (j * tile_width) + offset_x,
y = i * tile_height/2
)
auch kann es ein wenig schwierig zu versuchen, die Koordinate einer Fliese aufgrund der gestaffelten Art des Renderings, um herauszufinden:
Hinweis: die Abbildungen enthalten in diesem s Antwort wurde mit einer Java-Implementierung des Kachel-Rendering-Code präsentiert, mit der folgenden int
Array als Karte erstellt:
tileMap = new int[][] {
{0, 1, 2, 3},
{3, 2, 1, 0},
{0, 0, 1, 1},
{2, 2, 3, 3}
};
Die Kachelbilder sind:
tileImage[0] ->
Ein Kästchen mit einem inneren Kasten.
tileImage[1] ->
Eine Blackbox.
tileImage[2] ->
Eine weiße Box.
tileImage[3] ->
Eine Box mit einem hohen grauen Objekt drin.
Ein Hinweis auf Fliese Breiten und Höhen
Die Variablen tile_width
und tile_height
, die in den obigen Code Beispielen verwendet werden, beziehen sich auf die Breite und die Höhe der Bodenfliese in dem Bild, die die Fliese:
die Abmessungen des Bildes Mit funktionieren wird, solange die Bildabmessungen und der Fliesenmaße übereinstimmen. Andernfalls könnte die Kachelkarte mit Lücken zwischen den Kacheln gerendert werden.
Sie zeichnete sogar Bilder. Das ist Anstrengung. – zaratustra
Prost coolabird. Ich verwende den Diamond-Ansatz für das aktuelle Spiel, das ich gerade entwickle, und es funktioniert. Danke noch einmal. –
Gut zu hören, dass die Dinge funktionieren :) Viel Glück! – coobird