我會覆蓋另一個單字節的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
感謝您的迅速答覆,理查德。我並不熟悉按位操作/表示,但我明白了一般想法。雖然我錯過了一些東西......我並不是在尋找_checking_ walkability,但是如何去表達它。考慮到我在OP中給出的例子,我如何指定節點[i] [j]可以從這個/那邊進入,但是不能從這個/那邊進入等等。然後檢查通過應該是我想是直接前鋒。再次感謝理查德。 –
我想我仍然會給出同樣的答案。與單元格網格尺寸相同的2d字節網格是一種很好的表示形式,每個字節的每一位都表示單元格是否可進入。我編輯了我的答案以顯示一些示例。 – Richard
哦,對不起。乍一看,我沒有得到完整的想法。所以總的想法是覆蓋第二個二維網格,每個單元格都有一個字節表示該單元格可以進入的方向。那麼,多虧了Lua的表格靈活性,我不需要額外的網格,我只是將這個字節打包在一個二維節點網格中,該網格包含關於匹配單元的一些信息。但是,這完全解決了這個問題,謝謝理查德! –