Zarif otomobil kaplama


10

İnsanların karo tabanlı oyunlarında nasıl otomatik döşeme uyguladıkları hakkında bilgi arıyorum. Şimdiye kadar her zaman bir sürü "if ... else ..." ifadesi ile bunu doğaçlama yaptım ve şimdi daha zarif bir çözüm bulma zamanının geldiğine karar verdim. İnternette konuyla ilgili otomatik döşeme uygulamaları ve tartışma örnekleri için arama yaptım, ancak sadece üç makale buldum:

(Özellikle sonuncusu kapsamlı ve çok yardımcı.)

Ayrıca bunu uygulayan kütüphanelerin çeşitli uygulamalarına ve belgelerine de baktım, örneğin, flixel: http://www.flixel.org/features.html#tilemaps

Ne yazık ki, bulabildiğim tüm çözümler tam olarak doğaçlama ve gelişigüzel, başladığım kadar ve neredeyse tüm olası vakaları kapsamıyor.

Öğrenebileceğim zarif bir otomobil döşeme uygulaması örneği arıyorum.

Yanıtlar:


10

Ben kullandım Tilemaps uygulanması A Bit Yöntem ve çok şık bir çözüm buldum. Makale somut bir örnek sunmaktadır ve algoritmanın birden çok arazi türünü ele alacak şekilde nasıl genişletileceğini tartışmaktadır.


Bu, flixel "OTOMATİK" otomatik döşeme modu tarafından kullanılan algoritmaya benziyor. Teşekkürler, listeme ekliyorum.
Radomir Dopieralski

3

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:2x3 otomatik karo seti

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:

  • Adöşemenin sol üst kısmı, Bsağ üst, Csol Dalt, 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):resim açıklamasını buraya girin


0

Bağlantıların çoğunu okudum ve başka bir çözüm bulmak için biraz zaman harcadım. İyi olup olmadığını bilmiyorum, ancak RPG Maker VX Ace oto döşeme davranışını (47 fayans) simüle etmek için böyle bir şey yapmaya başladım:

(sol 0 veya 1) + (sağ 0 veya 1) + (0 veya 1 yukarı) + (0 veya 1 aşağı) şimdi 5 vakam var.

4 = Döşeme 46 yerleştirilirse

3 yatılı =

eğer 2 4 vaka + 2 vaka algoritma hakkında emin değil ama yapmak için çok fazla şube.

1 = üzerinde çalışıyor ancak her durumda 4 durumda sonuçlanabilir

0 = 1, 2, 4, 8 ile bağlantılarda gösterilen sayı algoritmasını kullanabilirim ve 1'den 15'e kadar id almayı doğrudan kullanabilirim.

Ben bir programcı değilim ve matematik algoritmaları ile iyi değil ve 1, 2, 4, 8, 16, 32, 64, 128 çözümü de çok sevmedim.

Belki benim yaklaşımım en azından bundan daha iyidir.


1
Bu cevabın soruyu tam olarak cevapladığından emin değilim, biraz daha açıklayabilir misiniz? Başka bir şeye atıfta bulunursanız, en azından ona bağlanabilir misiniz?
Vaillancourt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.