Pregunta La manera más eficiente de guardar datos de mosaico de un juego isométrico


Estoy trabajando en un juego isométrico para navegadores rápidos que soportan <canvas>, que es muy divertido Para guardar información de cada tesela, utilizo una matriz bidimensional que contiene números que representan identificadores de teselas, como:

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'}
];

Hasta ahora funciona muy bien, pero ahora quiero trabajar con alturas y pendientes como en esta imagen: texto alternativo http://harmen.no-ip.org/isometrictiles.png

Para cada azulejo, necesito guardar su identificación, altura e información sobre las esquinas que se giran hacia arriba.

Se me ocurrió una idea simple sobre una representación bit a bit de las cuatro esquinas, como esta:

1011 // top, bottom and left corner turned up

Mi pregunta es: ¿cuál es la forma más eficiente de guardar estos tres valores para cada celda? ¿Es posible guardar estos tres valores como un entero?


32
2018-04-02 12:06


origen


Respuestas:


Si intentas hacer algo como la imagen, no necesitas almacenar qué esquinas están arriba / abajo, ya que puede deducirse de las teselas circundantes.

Por ejemplo, si el mosaico actual es altura n y la altura del azulejo uno arriba del azulejo actual es altura n+1 entonces la ficha actual debe tener "esquina arriba"

¡Estupendo! ¡Gracias! Trataré de implementar esto. Una idea más para completar su respuesta: ¿es posible almacenar la altura y el ID del mosaico como un número entero?

Sí. Necesitarás usar Operaciones Bitwise.

Si dividiste el número entero entre height e id usando los primeros 16 bits para height y el resto de id

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

El ajuste se puede hacer de manera similar

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

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

14
2018-04-02 12:08



Sí tu puedes:

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

Si desea optimizarlo, considere qué Yacoby dijo - podría almacenar una matriz de esquinas en lugar de guardarlas por separado para cada tesela.


3
2018-04-02 12:13



Si la altura está en el rango [0, 255], puede guardar 4 alturas en un solo entero utilizando la manipulación de bits. En hex:

0xAABBCCDD, AA = primera altura, BB = segundo, etc.

Para obtener la altura más a la izquierda, harías ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF, que devuelve 170 (0xAA).

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


0
2018-04-02 12:10



¿El área es rectangular? Si es así, simplemente podría almacenar el ancho y la altura del área, la longitud del mosaico y una matriz de enteros que representan las alturas de los vértices.


0
2018-04-02 12:14