인접한 타일을 기준으로 타일을 선택하십시오


10

타일 ​​맵 편집기에서 작업 중이며 인접한 타일을 기준으로 타일을 자동으로 선택해야합니다. 예를 들어, 도로 타일을 다른 도로 타일 옆에 배치 할 때 두 도로가 연속 도로를 형성하도록 방향을 정해야합니다. 주변에 다른 도로가있는 경우 모서리 또는 교차로 타일을 사용해야 할 수도 있습니다.

누구 든지이 작업을 수행하는 데 알고리즘을 추천 할 수 있습니까? 게임은 8 방향 사각형 타일 맵을 사용합니다.


사용자가 새 타일을 내려 놓을 때마다 주변의 모든 8 타일을 검사하고 그에 따라 새 타일의 방향을 지정할 수 있습니까? 물론 방향 및 유형과 같은 각 타일에 추가 정보를 저장해야합니다.
XiaoChuan Yu

모든 주변 타일을 검사하고 있지만 모든 타일 조합을 처리하는 방법을 몰랐습니다. 예를 들어, 7 가지 타일 중에서 선택할 수 있습니다 (가로, 세로, 네 모서리 및 십자가). 복잡한 스위치 문을 사용하려고 생각했지만 잘못 느꼈습니다.
alekop

답변:


18

어쩌면 이것이 일반적으로 수행되는 방법 일 수 있습니다. 도로 타일을 가능한 모든 방향으로 나타내는 다른 타일 목록이 있습니다. 왼쪽에서 오른쪽, 네 모서리 모두, 위에서 아래로, 무엇이든. 이제 모든 타일을 각각 바이트로 인덱싱합니다. 각 방향에 하나씩 8 비트. 이것은 해시 맵 또는 파일 이름 일 수 있지만 ...이 작업을 수행하려고합니다.

그래서 당신은 이것을 가지고 있습니다 :

여기에 이미지 설명을 입력하십시오

위 타일의 바이트 코드는 00000000 입니다. 그런 다음 왼쪽에서 오른쪽으로 (또는 오른쪽에서 왼쪽으로) 타일은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

해당 타일의 바이트 코드는 10001000 또는 136입니다. 다른 예로 3 가지 교차점을 살펴 보겠습니다.

여기에 이미지 설명을 입력하십시오

해당 타일의 바이트 코드는 10101000 입니다.

내가가는 곳을 보셨을 것입니다. 연결을 나타내는 바이트에서 비트 위치를 설정합니다. 이것은 내가 전에 본 큰 if / else 체인을 시도하는 것보다 훨씬 낫습니다. 타일을 배치하려고 할 때 타일을 검사하고 그에 따라 바이트를 만듭니다. 도로가있는 타일 (또는 연결하려는 대상)은 1로 설정하고 연결하지 않은 타일은 0으로 설정하십시오. 완료되면 필요한 정확한 타일의 바이트 코드를 갖게됩니다.

에셋을 만들 때 올바른 바이트 코드를 회전하고 할당하여 많은 자산을 재사용 할 수 있습니다.

편집 : 이미지가 덜 깔끔하도록 업데이트되었습니다. 예, 이전보다 낫습니다.


아주 좋아요! 간단하고 효율적입니다. 내가 이해하지 못하는 것은 비트 마스크를 얻는 방법입니다. 예를 들어 숫자 3과 7에서 17의 비트 마스크를 어떻게 얻습니까?
alekop

걱정 마세요, 당신이하는 일을 봅니다. 비트 3과 7을 설정하고 있지만 오른쪽 대신 왼쪽부터 세고 있습니다.
alekop

오, 얼마나 부끄러운 지 내 엔디안이 모두 섞여 있어 . 그건 내가 고칠 사고 야!
MichaelHouse

좋아, 이제 내 의견이 이해가되지 않습니다! : p 농담입니다. 답변 해 주셔서 감사합니다. 바로 내가 찾던 것입니다.
alekop

1
좋은 설명입니다. 실제 코드와 타일 해상도로 동일한 기술을 다루는 블로그 게시물이 있습니다. kitsu.github.io/2016/07/18/roguelike-project-05
kitsu.eb

3

이 편리한 페이지를보고 자세한 정보를 확인하십시오. 현재 수행중인 작업의 거의 모든 측면과 몇 가지 잠재적 최적화에 대해 자세히 설명되어 있습니다. http://www.angryfishstudios.com / 2011 / 04 / adventures-in-bitmasking /

tldr은 인접한 각 셀을 쿼리하고 조합을 비트 필드 / 바이트로 저장 한 다음 0 ~ 255의 숫자를 0 ~ 47의 값으로 변환하는 맵을 통해 전달합니다.이 값은 고유 이미지에 해당합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.