2010-04-02 13 views
32

Sto lavorando a un gioco isometrico per browser veloci che supportano <canvas>, che è molto divertente. Per salvare le informazioni di ogni piastrella, io uso un array bidimensionale che contiene numeri che rappresentano gli ID di piastrelle, come:Il modo più efficace per salvare i dati delle tessere di un gioco isometrico

var level = [[1, 1, 1, 2, 1, 0], 
      [0, 1, 1, 2, 0, 1], 
      [0, 1, 1, 2, 1, 1]]; 

var tiles = [ 
    {name: 'grass', color: 'green'}, 
    {name: 'water', color: 'blue'}, 
    {name: 'forest', color: 'ForestGreen'} 
]; 

Finora funziona benissimo, ma ora voglio lavorare con altezze e pendenze come in questa foto : alt text http://harmen.no-ip.org/isometrictiles.png

Per ciascuna piastrella è necessario salvare l'ID, l'altezza e le informazioni sulle tessere su cui gli angoli sono rivolti verso l'alto.

mi si avvicinò con una semplice idea di una rappresentazione bit per bit di tutti e quattro gli angoli, come questo:

1011 // top, bottom and left corner turned up 

La mia domanda è: qual è il modo più efficace per salvare questi tre valori per ogni cella? È possibile salvare questi tre valori come un intero?

+8

+1 per la foto :) – cletus

+4

+1 Eccellente domanda. Interessato anche al gioco. –

+1

+1 per non solo l'immagine ma la chiarezza complessiva della domanda. È davvero bello vedere qualcuno che si prende tutto il tempo per fare una domanda. – Ricket

risposta

14

Se si sta tentando di fare qualcosa come l'immagine non è necessario memorizzare quali angoli sono su/giù come si può dedurre dalle tessere circostanti.

Per esempio, se la tessera corrente è l'altezza n e l'altezza della piastrella è finito alle piastrelle attuale è all'altezza n+1 poi la tessera corrente deve avere "nell'angolo in alto up"

Grande! Grazie! Proverò a implementarlo. Un altro pensiero per completare la risposta: è possibile memorizzare l'altezza e l'ID tessera come numero intero?

Sì. Dovrai utilizzare Bitwise Operations.

Se si è diviso il numero intero equamente tra altezza e id utilizzando i primi 16 bit per altezza e il resto della id

var id = tile & 0x0000FFFF; //mask the first 16 bits 
var height = tile >>> 16; //shift the first 16 bits to the right 

impostazione può essere fatta in un mannar simile

tile &= 0xFFFF0000; //remove id bits 
tile |= id; //set new id 

tile &= 0x0000FFFF; //remove height bits 
tile |= (height << 16); 
+5

+1, ma memorizza le altezze degli angoli anziché le altezze delle celle, per evitare ambiguità. –

+0

Ottimo! Grazie! Proverò a implementarlo. Un altro pensiero per completare la risposta: è possibile memorizzare 'height' e' tile ID' come numero intero? – Harmen

+0

Ottima soluzione. Tuttavia, più CPU costano rispetto a memorizzare le altezze di ogni angolo. (Per determinare l'altezza di tutti gli angoli, dovrebbe fare 9 ricerche di altezza, con i loro spostamenti di bit.) – Pindatjuh

0

Se il height è nell'intervallo [0, 255] è possibile salvare 4 altezze in un singolo intero usando la manipolazione del bit. In esadecimale:

0xAABBCCDD, AA = prima altezza, BB = seconda, ecc ..

Per ottenere risultati più a sinistra altezza fareste ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF, che restituisce 170 (0xAA).

Per impostarlo: integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

+0

Puoi certamente farlo, ma ricorda che Javascript usa il virgola mobile per tutti i numeri, quindi l'efficienza si otterrebbe in C++ o qualunque cosa davvero non si applicherebbe. – Pointy

3

Sì, è possibile:

var corners = 11; // binary 1011; 
var topCornerUp = corners & 0x8; 
var bottomCornerUp = corners & 0x2; 

Se si desidera ottimizzare, però, considerare che cosa Yacoby said - è possibile memorizzare una serie di angoli, invece di salvarli separatamente per ogni piastrella.

0

L'area è rettangolare? Se lo è, puoi semplicemente archiviare la larghezza e l'altezza dell'area, la lunghezza della piastrella e una serie di numeri interi che rappresentano le altezze dei vertici.

Problemi correlati