Aggiornamento: algoritmo di rendering della mappa corretto, aggiunta di più illustrazioni, modifica della formattazione.
Forse il vantaggio della tecnica "a zig-zag" per mappare le piastrelle sullo schermo si può dire che le piastrelle x
e le y
coordinate sono sugli assi verticale e orizzontale.
Approccio "Disegnare in un diamante":
Disegnando una mappa isometrica usando "disegno in un diamante", che credo si riferisca al semplice rendering della mappa usando un for
ciclo nidificato sull'array bidimensionale, come questo esempio:
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)
)
Vantaggio:
Il vantaggio dell'approccio è che è un semplice nidificato for
loop con una logica piuttosto semplice che funziona in modo coerente in tutte sezioni.
Svantaggio:
Un aspetto negativo di tale approccio è che le coordinate x
e y
delle tessere sulla mappa aumenteranno in linee diagonali, il che potrebbe rendere più difficile mappare visivamente la posizione sullo schermo sulla mappa rappresentata come un array:
Tuttavia, ci sarà una trappola nell'implementazione del codice di esempio sopra - l'ordine di rendering farà sì che le tessere che si suppone siano dietro determinate tessere vengano disegnate sopra le tessere davanti:
Per correggere questo problema, l' for
ordine del ciclo interno deve essere invertito, partendo dal valore più alto e rendendolo al valore più basso:
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)
)
Con la correzione precedente, il rendering della mappa dovrebbe essere corretto:
Approccio "Zig-zag":
Vantaggio:
Forse il vantaggio dell'approccio "zig-zag" è che la mappa renderizzata può sembrare un po 'più compatta verticalmente dell'approccio "diamante":
Svantaggio:
Dal tentativo di implementare la tecnica a zig-zag, lo svantaggio potrebbe essere che è un po 'più difficile scrivere il codice di rendering perché non può essere scritto come un for
ciclo nidificato su ogni elemento in un array:
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
)
Inoltre, potrebbe essere un po 'difficile provare a capire le coordinate di un riquadro a causa della natura sfalsata dell'ordine di rendering:
Nota: le illustrazioni incluse in questa risposta sono state create con un'implementazione Java del codice di rendering del riquadro presentato, con il seguente int
array come mappa:
tileMap = new int[][] {
{0, 1, 2, 3},
{3, 2, 1, 0},
{0, 0, 1, 1},
{2, 2, 3, 3}
};
Le immagini delle piastrelle sono:
tileImage[0] ->
Una scatola con una scatola dentro.
tileImage[1] ->
Una scatola nera
tileImage[2] ->
Una scatola bianca
tileImage[3] ->
Una scatola con un alto oggetto grigio al suo interno.
Una nota su larghezze e altezze delle piastrelle
Le variabili tile_width
e tile_height
che sono utilizzate negli esempi di codice sopra riportati si riferiscono alla larghezza e all'altezza della piastrella di terra nell'immagine che rappresenta la piastrella:
L'uso delle dimensioni dell'immagine funzionerà, purché le dimensioni dell'immagine e quelle della piastrella corrispondano. Altrimenti, la mappa delle tessere potrebbe essere resa con degli spazi tra le tessere.