2012-10-15 35 views
3

考慮基於平鋪的遊戲,其中每個代理可以直線/對角線(8方向)移動。 基本上,圖像這樣可以表示爲一個普通的2D網格,其中,0將表示一個適合步行位置和1個不可行走位置(我使用的Lua):基於2D網格的遊戲:表示可通過性

-- Example : 3x3 sized map 
local map = { 
{0,0,0}, 
{0,1,1}, 
{0,0,0}, 
} 

在這點上,我們如何可以表示瓦片的可行性取決於代理來自哪個方向? 也就是說如果來自[1] [2](上)或[2] [1](左),但不是例如來自[3]的靜態不可行的上述單元[2] [2] ] [2](下)。

我已經給了這個想法,但我不能拿出足夠乾淨的東西給我。

在此先感謝。

回答

2

我會覆蓋另一個單字節的2D網格。字節的每一位對應於一個可能的入口方向,其中1表示可以從該方向行走,0表示不行。然後您可以使用二進制掩碼檢查可侵入性。

如果您的大部分單元格都可以從任意方向輸入,那麼您可以考慮使用帶有瓦片的絕對ID(例如X * MaxY + Y)的map作爲關鍵字,並使用上述字節方案指示可進入性。訪問速度較慢,但​​佔用的空間較少。

例如,我們的方向進行佈局像這樣:

Bit #  X offset Y offset 
123  -1 0 1 -1 -1 -1 
4 5  -1 0 1  0 0 0 
678  -1 0 1  1 1 1 

如果我在東北方向走,這相當於位#3。我可以通過轉換上述值進行掩蔽成位掩碼:

1 2 4 
8  16 
32 64 128 

我可以從一個方向進入,如果下面的返回true

Enterability(CurrentX+Xoffset(Dir), CurrentY+Yoffset(Dir)) & BitMask(Dir) 

(對不起,我怕我不知道Lua的不夠好,在語言來寫這個了)

編輯

所以,說我的方向,並如上文我想要一個只能從北方進入的廣場。要做到這一點,我設置位2:

Enterability(X)=2 

如果我想要一個平方是從北方和西南兩個進入的,我會用:

Enterability(X)=2 | 64 

其中|是按位OR操作。

如果我想要一個平方是從任何方向進入的,但西我用:

Enterability(X)=(~8) 

其中~是不操作。

如果我需要關閉了一扇門,說東,我可以取消設置該位:

Enterability(X)=Enterability(X) & (~16) 

再次打開門,我使用:

Enterability(X)=Enterability(X) | 16 

,或者更簡單,

Enterability(X)|=16 

~16產生的位字段,其是除了位參照16.使用噸所有那些他與AND運算符(&)離開所有的位上,除了一個參照16

還要注意的是十六進制的地址可以更方便:

Decimal   Hexadecimal 
1 2 4  0x1 0x2 0x4 
8  16 = 0x8  0x10 
32 64 128  0x20 0x40 0x80 
+0

感謝您的迅速答覆,理查德。我並不熟悉按位操作/表示,但我明白了一般想法。雖然我錯過了一些東西......我並不是在尋找_checking_ walkability,但是如何去表達它。考慮到我在OP中給出的例子,我如何指定節點[i] [j]可以從這個/那邊進入,但是不能從這個/那邊進入等等。然後檢查通過應該是我想是直接前鋒。再次感謝理查德。 –

+0

我想我仍然會給出同樣的答案。與單元格網格尺寸相同的2d字節網格是一種很好的表示形式,每個字節的每一位都表示單元格是否可進入。我編輯了我的答案以顯示一些示例。 – Richard

+0

哦,對不起。乍一看,我沒有得到完整的想法。所以總的想法是覆蓋第二個二維網格,每個單元格都有一個字節表示該單元格可以進入的方向。那麼,多虧了Lua的表格靈活性,我不需要額外的網格,我只是將這個字節打包在一個二維節點網格中,該網格包含關於匹配單元的一些信息。但是,這完全解決了這個問題,謝謝理查德! –