Najskuteczniejszy sposób zapisywania danych z gry izometrycznej

Pracuję nad grą izometryczną dla szybkich przeglądarek, które obsługują <canvas>, co jest świetną zabawą. Aby zapisać informacje o każdej płytce, używam dwuwymiarowej tablicy, która zawiera liczby reprezentujące identyfikatory płytek, takie jak:

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

Jak na razie działa świetnie, ale teraz chcę pracować z wysokościami i zboczami jak na tym zdjęciu: alt text http://harmen.no-ip.org/isometrictiles.png

Dla każdego kafelka muszę zapisać jego ID, wysokość i informacje o tym, które narożniki są obrócone / align = "left" /

Wpadłem na prosty pomysł o bitowej reprezentacji wszystkich czterech rogów, jak to:

1011 // top, bottom and left corner turned up

Moje pytanie brzmi: jaki jest najskuteczniejszy sposób na zapisanie tych trzech wartości dla każdej komórki? Czy można zapisać te trzy wartości jako jedną liczbę całkowitą?

Author: Andrei Botalov, 2010-04-02

4 answers

Jeśli próbujesz zrobić coś takiego jak zdjęcie, nie musisz przechowywać, które rogi są góra/dół, ponieważ można to wywnioskować z otaczających płytek.

Na przykład, jeśli bieżąca płytka ma wysokość n, a jej wysokość w górę od bieżącej płytki wynosi wysokość n+1, to bieżąca płytka musi mieć "górny róg w górę"

Świetnie! Dziękuję! Spróbuję to zaimplementować. Jeszcze jedna myśl, aby uzupełnić swoją odpowiedź: czy możliwe jest przechowywanie wysokości i ID płytki jako integer?
Tak. Będziesz musiał użyć operacji bitowych .

Jeśli podzieliłeś liczbę całkowitą równo między height i id używając pierwszych 16 bitów dla height i reszty id

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

Ustawienie można wykonać w podobnym mannarze

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

tile &= 0x0000FFFF; //remove height bits
tile |= (height << 16);
 14
Author: Yacoby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-02 20:35:08

Tak, Możesz:

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

Jeśli chcesz go zoptymalizować, zastanów się, co powiedział Yacoby - możesz przechowywać tablicę narożników zamiast zapisywać je osobno dla każdego kafelka.

 3
Author: Alex Gyoshev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:24:23

Jeśli wysokość jest w zakresie [0, 255], możesz zapisać 4 wysokości w jednej liczbie całkowitej za pomocą manipulacji bitami. W hex:

0XAABBCCDD, AA = pierwsza wysokość, BB = druga itd..

Aby uzyskać największą wysokość w lewo, wykonaj ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF, która zwraca 170 (0xAA).

Aby go ustawić: integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

 0
Author: Andreas Bonini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-02 12:10:34

Czy powierzchnia jest prostokątna? Jeśli tak, możesz po prostu zapisać szerokość i wysokość obszaru, długość kafelka i tablicę liczb całkowitych reprezentujących wysokość wierzchołków.

 0
Author: Matthew Dresser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-02 12:14:58