La forma más eficiente de guardar datos de fichas de un juego isométrico
Estoy trabajando en un juego isométrico para navegadores rápidos que soporten <canvas>
, lo cual es muy divertido. Para guardar la información de cada mosaico, utilizo una matriz bidimensional que contiene números que representan ID de mosaico, 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 ficha necesito guardar su ID de ficha, altura e información sobre qué esquinas se giran ascendente.
Se me ocurrió una idea simple acerca de 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?
4 answers
Si está tratando de hacer algo como la imagen, no necesita almacenar qué esquinas están arriba/abajo, ya que se puede deducir de las baldosas circundantes.
Por ejemplo, si la baldosa actual es height n
y la altura de la baldosa una arriba de la baldosa actual es height n+1
entonces la baldosa actual debe tener "top corner up"
Genial! ¡Gracias! Intentaré implementar esto. Un pensamiento más para completar su respuesta: ¿ es posible almacenar la altura y el ID de mosaico como un entero?
Sí. Necesitará usar Operaciones Bitwise.
Si divide el entero por igual 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 en un mannar
tile &= 0xFFFF0000; //remove id bits
tile |= id; //set new id
tile &= 0x0000FFFF; //remove height bits
tile |= (height << 16);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-02 20:35:08
Sí, puedes:
var corners = 11; // binary 1011;
var topCornerUp = corners & 0x8;
var bottomCornerUp = corners & 0x2;
Si desea optimizarlo, sin embargo, considere lo que Yacoby dijo: podría almacenar una matriz de las esquinas en lugar de guardarlas por separado para cada mosaico.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:24:23
Si la altura está en el rango [0, 255], puede guardar 4 alturas en un solo entero utilizando la manipulación de bits. En hexadecimal:
0xAABBCCDD, AA = primera altura, BB = segunda, etc..
Para obtener la altura más a la izquierda, haría ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF
, que devuelve 170 (0xAA).
Para establecerlo: integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-02 12:10:34
¿El área es rectangular? Si lo es, simplemente puede almacenar el ancho y la altura del área, la longitud del azulejo y una matriz de enteros que representan las alturas del vértice.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-02 12:14:58