javascript isometric

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



isometric (4)

Estoy trabajando en un juego isométrico para navegadores rápidos que admiten <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: alt text 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?


¿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.


Sí tu puedes:

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

Sin embargo, si desea optimizarlo, tenga en cuenta lo que dijo Yacoby : podría almacenar una serie de esquinas en lugar de guardarlas por separado para cada tesela.


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 la altura del azulejo uno arriba del azulejo actual es altura n+1 entonces el azulejo actual debe tener "arriba 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á 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);


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, lo haría ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF , que devuelve 170 (0xAA).

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