2010-04-02 41 views
32

我正在研究支持<canvas>的快速瀏覽器的等距遊戲,這非常有趣。爲了節省每瓦的信息,我使用包含代表瓷磚的ID,像數字的二維數組:保存等距遊戲數據的最有效方法

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

到目前爲止,它的偉大工程,但現在我想的高度和坡度像在這張照片的工作: alt text http://harmen.no-ip.org/isometrictiles.png

對於每個瓷磚,我需要保存它的瓷磚ID,高度和有關哪些角落向上轉移的信息。

我想出了所有四個角落的按位表示一個簡單的想法,就像這樣:

1011 // top, bottom and left corner turned up 

我的問題是:什麼是最有效的方式來保存這三個值,每個單元?是否可以將這三個值保存爲一個整數?

+8

+1爲圖片:) – cletus 2010-04-02 12:08:22

+4

+1優秀的問題。對遊戲感興趣。 – 2010-04-02 12:13:51

+1

+1不僅是圖片,而且是問題的整體清晰度。很高興看到有人花時間徹底詢問問題。 – Ricket 2010-04-05 21:33:32

回答

14

如果你正在嘗試做一些類似於圖片的事情,你不需要存儲哪些角落是向上/向下,因爲它可以從周圍的圖塊中推導出來。

例如,如果當前瓦片是高度n,並從當前瓷磚瓷磚一起來的高度是高度n+1那麼目前的瓷磚必須有「右上角向上」

太好了!謝謝!我會盡力實現這一點。還有一個想法來完成你的答案:是否可以將高度和圖塊ID存儲爲整數?

是。您將需要使用Bitwise Operations

如果您使用的是高度的前16位和id其餘

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

設置可以用類似的馬納爾

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

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

+1,但存儲角高而不是單元高度,以避免含糊不清。 – 2010-04-02 12:12:17

+0

太棒了!謝謝!我會盡力實現這一點。還有一個想法來完成你的答案:是否可以將「height」和「tile ID」存儲爲整數? – Harmen 2010-04-02 12:18:49

+0

偉大的解決方案。儘管比存儲每個角落的高度更昂貴。 (要確定所有角落的高度,它應該進行9次高度查找,以及它們的位移。) – Pindatjuh 2010-04-02 13:01:06

0

如果進行劃分的高度和ID之間平等的整數高度在[0,255]範圍內,您可以使用位操作在單個整數中保存4個高度。在十六進制:

0xAABBCCDD,AA =第一高度,BB =第二,等等。

爲了得到最左邊的高度,你會做((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF,返回170(和0xAA)。

要設置:integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

+0

您當然可以這樣做,但請記住,JavaScript對所有數字都使用浮點數,所以您在C++中獲得的效率或無論什麼都不適用。 – Pointy 2010-04-02 12:33:44

3

是的,你可以:

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

如果你想優化它,不過,考慮什麼Yacoby said - 你可以改爲存儲保存它們的角陣列分別爲每個瓷磚。

0

面積是否爲矩形?如果是這樣,您可以簡單地存儲區域的寬度和高度,拼貼長度和表示頂點高度的整數數組。