Bu sorunu Googling ile kendim buraya geldim, bağlantılı makaleleri okudum ve 47 karonun ortak setini oluşturan nispeten kompakt bir çözüm ürettim. Bunun gibi otomatik döşenmiş malzeme için 2x3 karo seti gerektirir:
Sol üstte tek bir karo varyantı, sağ üstte iç köşeler ve altta dört dış köşe döşemesi ile (bu düzenlemeyi RPG Maker'dan tanıyabilirsiniz).
İşin püf noktası, her "mantıksal" harita döşemesini oluşturma için 4 yarı döşemeye ayırmaktır. ayrıca, karo setindeki bir yarım karo sadece üretilen bir karoda bu konumda olabilir , bu nedenle sol üst yarım karo sadece sol üst konumda kullanılabilir.
Bu kısıtlamalar, 8 komşu kutucuk yerine, her yarım kutucuk için sadece 3 tam kiremit komşusunu kontrol etmeniz gerektiği anlamına gelir.
Bu fikri test etmek için çabucak uyguladım. İşte kavram kanıtı kodu (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çıklama:
A
döşemenin sol üst kısmı, B
sağ üst, C
sol D
alt, sağ alt.
edges
bunların her biri için bitma maskeleri tutar, böylece yalnızca ilgili komşu bilgilerini alabiliriz.
map*
komşu devletleri karo kümesi görüntüsünde grafik indekslerle eşleştiren sözlüklerdir (0..24).
- her yarım kiremit 3 komşuyu kontrol ettiğinden, her birinin 2 ^ 3 = 8 durumu vardır.
_tile
, otomatik döşeme için hedeflenen döşemedir.
- Mantıksal karolarımız görüntü oluşturma karolarımızdan iki kat daha büyük olduğundan, tüm otomatik karo kablolarının (x, y) görüntü oluşturma haritasında iki katına çıkarılması gerekir.
Neyse, işte sonuçlar (sadece bir döşemeyle, zaten):