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


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.