सुरुचिपूर्ण ऑटोटाइलिंग


10

मैं इस बारे में जानकारी की तलाश कर रहा हूं कि लोग अपने टाइल-आधारित खेलों में ऑटोटाइलिंग को कैसे लागू करते हैं। अब तक मैंने इसे हमेशा हार्डकॉक्ड "इफ ... और ..." स्टेटमेंट्स के झुंड के साथ इंप्रूव किया है, और अब मैंने फैसला किया कि यह कुछ और सुरुचिपूर्ण समाधान खोजने का समय है। मैं इंटरनेट पर ऑटोटीलिंग कार्यान्वयन और विषय पर चर्चा के उदाहरणों के लिए खोज पर गया, लेकिन मैं केवल तीन लेखों के साथ आया:

(विशेष रूप से अंतिम एक व्यापक और बहुत उपयोगी है।)

मैंने पुस्तकालयों के विभिन्न कार्यान्वयन और प्रलेखन को भी देखा है, जो इसे लागू करते हैं, उदाहरण के लिए, flixel: http://www.flixel.org/features.html#tilemaps

अफसोस की बात है, सभी समाधान जो मुझे मिल सकते हैं वे बिल्कुल सुधार और बेतरतीब हैं, जैसा कि मैंने शुरू किया था, और लगभग सभी संभावित मामलों को कवर नहीं किया।

मैं ऑटोटीलिंग कार्यान्वयन के एक सुंदर उदाहरण की तलाश कर रहा हूं, जिससे मैं सीख सकता हूं।

जवाबों:


10

मैंने टिलमैप्स लगाने के लिए एक बिटवाइज़ विधि का उपयोग किया है और यह एक बहुत ही सुंदर समाधान है। लेख एक ठोस उदाहरण प्रदान करता है और कई भू-प्रकारों को संभालने के लिए एल्गोरिथ्म का विस्तार करने के तरीके पर चर्चा करता है।


यह ऑटोटाइलिंग के फ्लिक्सल "ऑटो" मोड द्वारा उपयोग किए गए एल्गोरिदम जैसा दिखता है। धन्यवाद, मैं इसे अपनी सूची में जोड़ रहा हूं।
रेडोमिर डोपिराल्स्की 18

3

मैं स्वयं इस समस्या को गोग्लिंग करके यहां पहुंचा, लिंक किए गए लेखों को पढ़ा, और एक अपेक्षाकृत कॉम्पैक्ट समाधान का उत्पादन किया जो 47 टाइलों के सामान्य सेट को उत्पन्न करता है। इसे इस तरह से ऑटोटेल्ड सामग्री के लिए 2x3 टाइलसेट की आवश्यकता होती है:एक 2x3 ऑटोटाइल टाइलसेट

शीर्ष बाईं ओर एक एकल-टाइल संस्करण के साथ, ऊपरी दाएं कोने में आंतरिक कोने, और तल पर चार बाहरी कोने टाइल (आप आरपीजी निर्माता से इस व्यवस्था को पहचान सकते हैं)।

चाल के लिए प्रत्येक "तार्किक" नक्शा टाइल को 4 आधा टाइलों में तोड़ना है। इसके अलावा, टाइलसेट में एक आधा-टाइल केवल उत्पन्न टाइल में उस स्थिति में हो सकती है , इसलिए शीर्ष-बाएं आधा टाइल का उपयोग केवल शीर्ष-बाईं स्थिति में किया जा सकता है।

इन प्रतिबंधों का मतलब है कि आपको केवल सभी 8 पड़ोसी टाइलों के बजाय, आधे टाइल वाले प्रति पूर्ण-टाइल पड़ोसियों की जांच करने की आवश्यकता है।

मैंने इसका परीक्षण करने के लिए इस विचार को जल्दी से लागू किया। यहां प्रूफ-ऑफ-कॉन्सेप्ट कोड (टाइपस्क्रिप्ट):

//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) को रेंडरिंग मैप में दोगुना होना चाहिए।

वैसे भी, यहाँ परिणाम हैं (केवल एक टाइल के साथ, वैसे भी):यहाँ छवि विवरण दर्ज करें


0

मैंने अधिकांश लिंक पढ़े और कुछ समय दूसरे समाधान के साथ आने में बिताया। मुझे नहीं पता कि यह अच्छा है या नहीं, लेकिन आरपीजी निर्माता वीएक्स ऐस ऑटो-टाइल व्यवहार (47 टाइल) का अनुकरण करने के लिए मैंने कुछ ऐसा करना शुरू किया:

(बाएं 0 या 1) + (दाएं 0 या 1) + (ऊपर 0 या 1) + (नीचे 0 या 1) अब मेरे पास 5 मामले हैं।

अगर 4 = टाइल 46 रखी जाती है

यदि 3 बोर्डर =

यदि 2 4 मामले + 2 मामले एल्गोरिथ्म के बारे में निश्चित नहीं हैं, लेकिन बनाने के लिए बहुत अधिक शाखाएं नहीं हैं।

अगर 1 = इस पर काम कर रहा है, लेकिन हर दिशा 4 मामलों में समाप्त हो सकती है

यदि 0 = मैं 1, 2, 4, 8 के साथ लिंक में दिखाए गए संख्या एल्गोरिदम का उपयोग कर सकता हूं और 1 से 15 तक आईडी प्राप्त कर सकता हूं तो मैं सीधे उपयोग कर सकता हूं।

मैं एक प्रोग्रामर नहीं हूं और गणित एल्गोरिदम के साथ सबसे अच्छा नहीं हूं और 1, 2, 4, 8, 16, 32, 64, 128 समाधान मुझे भी पसंद नहीं आया।

शायद मेरा दृष्टिकोण उससे कम से कम बेहतर हो।


1
मुझे यकीन नहीं है कि यह जवाब पूरी तरह से सवाल का जवाब देता है, क्या आप थोड़ा और समझा सकते हैं? यदि आप किसी और चीज़ का संदर्भ देते हैं, तो क्या आप कम से कम इससे जुड़ सकते हैं?
वैलेनकोर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.