2012-10-15 4 views
3

각 에이전트가 직각/비스듬히 (8 방향으로) 이동할 수있는 타일 기반 게임을 고려하십시오. 이 시점에서2D 그리드 기반 게임 : 수동성 표현

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

, 우리가 어떻게 나타낼 수 기본적으로,이 같은지도가 0이 걸어 갈 위치와 1 개 unwalkable 위치를 (I 루아를 사용하고 있습니다)를 나타냅니다 것 일반 2D 그리드로 표현 될 수있다 에이전트가 오는 방향에 따라 타일 이동 가능성이 있습니까? 즉, 정적으로 알 수없는 위의 셀 [2] [2]는 [1] [2] (위) 또는 [2] [1] (왼쪽)에서 오는 경우에는 걷기가 가능하지만 예를 들어 [3 ] [2] (아래).

나는 이것을 몇 가지 생각을했지만, 나에게 충분히 깨끗한 것을 생각해 낼 수 없었다.

미리 감사드립니다.

답변

2

다른 2D 그리드에 단일 바이트를 겹쳐 놓았습니다. 바이트의 각 비트는 가능한 입구 방향에 해당하며 1은 해당 방향에서 걸을 수 있고 0은 의미가 없음을 의미합니다. 그런 다음 이진 마스킹을 사용하여 enterability를 확인할 수 있습니다.

대부분의 셀을 어느 방향에서나 입력 할 수있는 경우 타일의 절대 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 
사실 다음 반환

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

(미안 해요, 나도 몰라 두려워하면 나는 방향에서 입력 할 수 있습니다

그래서) 해당 언어로

편집이를 쓸 루아 충분히 내 방향으로 말 등은 이상하다 나는 북쪽에서만 입력 할 수있는 사각형을 원한다. 나는 북쪽과 남서쪽에서 모두 입력이 가능한 인 정사각형을 원하는 경우

Enterability(X)=2 

, 내가 사용하는 것이 : 이렇게하려면, 내가 비트 # 2를 설정 |이 비트가

Enterability(X)=2 | 64 

이다 OR 조작.

나는 사각형은 어떤 방향 입력이 가능한 것으로 싶다면 서쪽 내가 사용 ~가없는 작업입니다

Enterability(X)=(~8) 

.나는 문을 닫고해야하는 경우

, 나는 그 비트 설정 해제 할 수, 동쪽으로 말 :

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

다시 문을 열려면을, 내가 사용

Enterability(X)=Enterability(X) | 16 

또는, 더 간단을 ,

Enterability(X)|=16 

~16가 t를 사용하여 16를 참조하여 비트를 제외한 모든 비트 필드 것 인 생산 신속한 대답, 리차드에 대한

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

감사 : 그의 AND 연산자 (&)와 또한 더 편리 할 수 ​​있습니다 주소 그 진수를주의 16

참조를 제외한, 모든 비트를 떠난다. 나는 비트 연산/표현에 익숙하지 않지만 일반적인 생각을 갖습니다. 내가 뭔가를 놓치고 있지만 ... 나는 walkability를 찾지 않고 있었지만 _represent_하는 방법을 찾고있었습니다. 내가 OP에서 쓴 예제를 생각해 보면, 노드 [i] [j]가이 쪽/쪽에서 엔트리 할 수 ​​있다고 지정 할 수 있지만,이 쪽/그 쪽 등에서 엔트리 할 수 ​​없다고 지정하는 방법은 무엇입니까? 똑바로 전진 할 것 같네요. 다시 한 번 고마워, Richard. –

+0

나는 여전히 같은 대답을 줄 것이라고 생각한다. 셀 그리드와 동일한 차원의 2 차원 바이트 격자가 좋은 표현이며, 각 바이트의 각 비트는 셀을 입력 할 수 있는지 여부를 나타냅니다. 내 대답을 편집하여 몇 가지 예를 보여주었습니다. – Richard

+0

아, 죄송합니다. 언뜻 나는 완전한 생각을 얻지 못했습니다. 따라서 일반적인 아이디어는 각 셀이이 셀을 어떤 방향에서 표현할 수 있는지 나타내는 바이트를 보유하는 두 번째 2D 그리드를 오버레이하는 것입니다. Lua 테이블의 유연성 덕분에 추가 그리드가 필요하지 않습니다. 일치하는 셀에 대한 정보가있는 노드의 2D 그리드 내에이 바이트를 팩할 것입니다. 하지만이 문제는 확실히 해결됩니다. Richard에게 감사드립니다! –