나는이 문제를 직접 인터넷 검색하여 여기에 도착하고 링크 된 기사를 읽고 47 개의 타일 세트를 생성하는 비교적 컴팩트 한 솔루션을 제작했습니다. 다음과 같이 자동 타일 된 재료에는 2x3 타일셋이 필요합니다.
왼쪽 상단에 단일 타일 변형이 있고 오른쪽 상단에 내부 코너가 있고 하단에 4 개의 외부 코너 타일이 있습니다 (RPG Maker에서이 배열을 인식 할 수 있음).
트릭은 렌더링을 위해 각 "논리적"맵 타일을 4 개의 반 타일로 나누는 것입니다. 또한 타일셋의 반 타일은 생성 된 타일의 해당 위치 에만있을 수 있으므로 왼쪽 위 절반 타일은 왼쪽 위 위치에만 사용할 수 있습니다.
이 제한 사항은 8 개의 이웃 타일 대신 절반 타일 당 3 개의 전체 타일 이웃 만 확인하면된다는 것을 의미합니다.
이 아이디어를 신속하게 구현하여 테스트했습니다. 개념 증명 코드 (TypeScript)는 다음과 같습니다.
//const dirs = { N: 1, E: 2, S: 4, W:8, NE: 16, SE: 32, SW: 64, NW: 128 };
const edges = { A: 1+8+128, B: 1+2+16, C: 4+8+64, D: 4+2+32 };
const mapA = { 0:8, 128:8, 1:16, 8:10, 9:2, 137:18, 136:10, 129:16 };
const mapB = { 0:11, 16:11, 1:19, 2:9, 3:3, 19:17, 18:9, 17:19 };
const mapC = { 0:20, 64:20, 4:12, 8:22, 12:6, 76:14, 72:22, 68:12 };
const mapD = { 0:23, 32:23, 4:15, 2:21, 6:7, 38:13, 34:21, 36:15 };
export function GenerateAutotileMap(_map: number[][], _tile: integer): number[][]
{
var result = [];
for (var y=0; y < _map.length; y++) {
const row = _map[y];
const Y = y*2;
// half-tiles
result[Y] = [];
result[Y+1] = [];
// each row
for (var x=0; x < row.length; x++) {
// get the tile
const t = row[x];
const X = x*2;
if (t != _tile) continue;
// Check nearby tile materials.
const neighbors = (North(_map, x, y) == t? 1:0)
+ (East(_map, x, y) == t? 2:0)
+ (South(_map, x, y) == t? 4:0)
+ (West(_map, x, y) == t? 8:0)
+ (NorthEast(_map, x, y) == t? 16:0)
+ (SouthEast(_map, x, y) == t? 32:0)
+ (SouthWest(_map, x, y) == t? 64:0)
+ (NorthWest(_map, x, y) == t? 128:0);
// Isolated tile
if (neighbors == 0) {
result[Y][X] = 0;
result[Y][X+1] = 1;
result[Y+1][X] = 4;
result[Y+1][X+1] = 5;
continue;
}
// Find half-tiles.
result[Y][X] = mapA[neighbors & edges.A];
result[Y][X+1] = mapB[neighbors & edges.B];
result[Y+1][X] = mapC[neighbors & edges.C];
result[Y+1][X+1] = mapD[neighbors & edges.D];
}
}
return result;
}
설명:
A
타일의 왼쪽 상단 부분, B
오른쪽 상단, C
왼쪽 D
하단, 오른쪽 하단입니다.
edges
각각에 대한 비트 마스크를 보유하므로 관련 이웃 정보 만 가져올 수 있습니다.
map*
은 타일셋 이미지 (0..24)에서 인접 상태를 그래픽 인덱스에 매핑하는 사전입니다.
- 각 반 타일은 3 개의 이웃을 확인하기 때문에 각각 2 ^ 3 = 8 상태를 갖습니다.
_tile
자동 기울이기 대상 타일입니다.
- 논리 타일은 렌더링 타일의 두 배 크기이므로 렌더링 맵에서 모든 자율 좌표 (x, y)를 두 배로 늘려야합니다.
어쨌든 결과는 다음과 같습니다 (어쨌든 하나의 타일 만 있음).