別の 2D グリッドを 1 バイトでオーバーレイします。バイトの各ビットは、可能な入口方向に対応し、1 はその方向から歩くことができることを意味し、0 はそうでないことを意味します。その後、バイナリ マスキングを使用して入力可能性を確認できます。
ほとんどのセルに任意の方向から入力できる場合は、タイルの絶対 ID (X*MaxY+Y など) をキーとしてマップを使用し、入力可能性を示す上記のバイト スキームを使用することを検討してください。これはアクセスが遅くなりますが、必要なスペースは少なくなります。
たとえば、方向を次のようにレイアウトします。
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)
~
not操作はどこにありますか。
ドアを閉める必要がある場合、たとえば東に、そのビットの設定を解除できます。
Enterability(X)=Enterability(X) & (~16)
ドアを再び開くには、次を使用します。
Enterability(X)=Enterability(X) | 16
または、より簡単に、
Enterability(X)|=16
は~16
、16 を参照するビットを除いてすべて 1 のビットフィールドを生成します。これを AND 演算子 ( &
) と共に使用すると、16 を参照するビットを除くすべてのビットがオンのままになります。
また、16 進数のアドレス指定の方が便利な場合があることにも注意してください。
Decimal Hexadecimal
1 2 4 0x1 0x2 0x4
8 16 = 0x8 0x10
32 64 128 0x20 0x40 0x80