Ho cercato una formula per tracciare (world-> screen) e mouse pick (world-> screen) tessere isometriche in un mondo a forma di diamante. Quelli che ho provato sembrano sempre essere, beh, fuori. Qual è il modo solito / corretto per farlo?
Ho cercato una formula per tracciare (world-> screen) e mouse pick (world-> screen) tessere isometriche in un mondo a forma di diamante. Quelli che ho provato sembrano sempre essere, beh, fuori. Qual è il modo solito / corretto per farlo?
Risposte:
Sulla base del tuo commento, ecco il codice che sto usando per convertire i valori delle tessere x, y in coordinate sullo schermo. Ora, non tiene conto delle "tessere 3d", tutto è considerato sullo stesso piano, quindi se stai scrivendo un gioco in cui conta, questo codice non funzionerà.
//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
point screen;
//calculate the screen coordinates
//note: these will then be modified by the camera
screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
return screen;
}
punto è semplicemente una struttura che contiene x e y, TILE_WIDTH sarebbe 64 nel tuo caso, TILE_DEPTH è un po 'mal chiamato (in realtà è l'altezza della grafica della piastrella), ma sarebbe 32 nel tuo caso. Gli offset sono se si desidera che la mappa delle tessere si "avvii" in una posizione x, y diversa (come se si desidera che le tessere si trovino sopra un'altra serie di tessere). In genere l'offset può essere 0,0.
Questo genererà una mappa con 0,0 in alto, al centro, in questo modo:
0,0
0,1 1,0
0,2 1,1 2,1
Per quanto riguarda la ricerca della tessera x, y del cursore:
point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;
In questo bit di codice, mX e mY sono le coordinate dello schermo del mouse, che stiamo combinando con i valori della telecamera per scoprire dove ci troviamo in "coordinate mondiali". Tutto il resto è uguale al precedente esempio di codice.
Ancora una volta, ciò presuppone una mappa di tessere isometrica 2d piatta. C'è qualche lavoro aggiuntivo se vuoi usare una vista semi-3d della mappa, e tutto questo presuppone che tu stia lavorando in 2d comunque.