2010-04-02 12 views
32

Pracuję nad izometryczną grą dla szybkich przeglądarek obsługujących <canvas>, co jest świetną zabawą. Aby zapisać informacje z każdej płytki, używam dwuwymiarową tablicę, która zawiera numery reprezentujących identyfikatory dachówka, jak:Najbardziej efektywny sposób na zapisywanie danych kafelków izometrycznej gry

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

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

Dla każdego kafelka muszę zapisać jego identyfikator płytki, wysokość i informację o tym, które rogi są skierowane w górę.

wpadłem na prostym pomyśle o reprezentacji mnożenie wszystkich czterech rogach, tak:

1011 // top, bottom and left corner turned up 

Moje pytanie brzmi: co to jest najbardziej skuteczny sposób, aby zapisać te trzy wartości dla każdej komórce? Czy można zapisać te trzy wartości jako jedną liczbę całkowitą?

+8

+1 za zdjęcie :) – cletus

+4

+1 Doskonałe pytanie. Również interesuje się grą. –

+1

+1 za nie tylko zdjęcie, ale ogólną przejrzystość pytania. Miło jest zobaczyć kogoś, kto poświęca swój czas na dokładne zadawanie pytań. – Ricket

Odpowiedz

14

Jeśli próbujesz zrobić coś podobnego do zdjęcia, nie musisz zapisywać, które rogi są w górę/w dół, ponieważ można je wywnioskować z otaczających płytek.

Na przykład, jeżeli prąd płytka jest wysokość n i wysokość jednej płytki w stosunku do obecnej dachówki jest wysokość n+1 wtedy obecny dachówka musi mieć „górny róg up”

świetnie! Dziękuję Ci! Spróbuję to zaimplementować. Jeszcze jedna myśl, aby ukończyć twoją odpowiedź: czy można zapisać wysokość i identyfikator płytki jako liczbę całkowitą?

Tak. Będziesz musiał użyć Bitwise Operations.

przypadku podzielony na całkowitą równo wysokość ID użyciu pierwszych 16 bitów dla wysokości 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że być zrealizowane w podobny Mannar

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

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

+1, ale należy przechowywać wysokości narożników zamiast wysokości komórek, aby uniknąć niejasności. –

+0

Świetnie! Dziękuję Ci! Spróbuję to zaimplementować. Jeszcze jedna myśl, aby ukończyć twoją odpowiedź: czy możliwe jest zapisanie 'height' i' tile ID' jako liczby całkowitej? – Harmen

+0

Świetne rozwiązanie. Chociaż więcej procesora jest drogie niż przechowywanie wysokości każdego rogu. (Aby określić wysokość wszystkich narożników, należy wykonać 9 wyszukiwań wysokości z ich przesunięciami bitów.) – Pindatjuh

0

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

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

Aby uzyskać lewą najwięcej wysokość byś zrobił ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF, która zwraca 170 (0xAA).

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

+0

Z pewnością możesz to zrobić, ale pamiętaj, że JavaScript używa zmiennoprzecinkowego dla wszystkich liczb, więc wydajność, którą uzyskasz w C++ lub cokolwiek naprawdę nie miałoby zastosowania. – Pointy

3

Tak, można:

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

Jeśli chcesz zoptymalizować go jednak rozważyć, co Yacoby said - można przechowywać tablicę rogach zamiast ich zapisaniem osobno dla każdego kafelka.

0

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

Powiązane problemy