Rendering e prelievo isometrici?


23

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?


Il metodo esatto e la formula utilizzati dipendono un po 'dalla forma delle tessere e probabilmente un po' da come stai disegnando la mappa (è 0,0 in alto, in basso o su uno dei lati della mappa) Maggiori dettagli del tuo problema sarebbe d'aiuto.
thedaian

1
Le piastrelle sono 2: 1 (più precisamente, 64x32). Il sistema di coordinate non ha importanza poiché sto scrivendo l'editor. (0,0 in alto o a sinistra sembra comunque ragionevole.)
mpnk121,

Molto tardi alla domanda e non ho nemmeno una risposta completa, ma su questo argomento preciso c'è stato un ottimo Google Tech Talk. La loro configurazione include la selezione della parte non trasparente di immagini arbitrarie (in javascript, non meno). youtube.com/watch?v=_RRnyChxijA
Seth Battin

Risposte:


21

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.


1
Grazie! - funziona alla grande per le mappe piatte. Ora, puoi dirmi un po 'di più su come potrei aggiungere tessere di dimensioni arbitrarie (cioè con una profondità Z) che si trovano su un altro livello? (Come oggetti di scena come un pozzo o un lampione)
mpnk121,

2
Questo è quando usi i valori offsetY e offsetX. Se il tuo lampione è 64x64, quindi passare un 32 negativo per il valore offsetY dovrebbe farlo apparire nel posto giusto. Spero che sia abbastanza per iniziare.
thedaian

6
La coordinata "2,1" nel tuo esempio non dovrebbe essere un "2,0"?
Chris
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.