การนำทางอัตโนมัติที่สง่างาม


10

ฉันกำลังมองหาข้อมูลเกี่ยวกับวิธีที่ผู้คนใช้การทำให้เป็นอัตโนมัติในเกมแบบเรียงต่อกัน จนถึงตอนนี้ฉันมักจะพูดโพล้เพล้ด้วยประโยค "hardcoded" if ... else ... "และตอนนี้ฉันตัดสินใจแล้วว่าถึงเวลาที่จะหาคำตอบที่ดีกว่านี้แล้ว ฉันไปค้นหาบนอินเทอร์เน็ตเพื่อดูตัวอย่างการใช้งานอัตโนมัติและการอภิปรายหัวข้อ แต่ฉันมีบทความสามบทความเท่านั้น:

(โดยเฉพาะอย่างยิ่งสุดท้ายคือครอบคลุมและเป็นประโยชน์มาก)

ฉันได้ดูการใช้งานต่างๆและเอกสารประกอบของห้องสมุดที่นำมาใช้เช่น flixel: http://www.flixel.org/features.html#tilemaps

น่าเศร้าที่วิธีแก้ปัญหาทั้งหมดที่ฉันสามารถหาได้นั้นเป็นวิธีการที่ได้รับการปรับแต่งและส่งเดชตรงตามที่ฉันเริ่มต้นและแทบไม่เคยครอบคลุมกรณีที่เป็นไปได้ทั้งหมด

ฉันกำลังมองหาตัวอย่างอันงดงามของการติดตั้งระบบอัตโนมัติที่ฉันเรียนรู้ได้

คำตอบ:


10

ฉันได้ใช้วิธีการ Bitwise สำหรับการสมัคร Tilemapsและพบว่ามันเป็นทางออกที่หรูหรามาก บทความแสดงตัวอย่างที่เป็นรูปธรรมและอธิบายถึงวิธีการขยายอัลกอริทึมในการจัดการภูมิประเทศหลายประเภท


ดูเหมือนว่าอัลกอริทึมที่ใช้โดยโหมด "อัตโนมัติ" ของการหมุนอัตโนมัติ ขอบคุณฉันเพิ่มลงในรายการของฉัน
Radomir Dopieralski

3

ฉันมาที่นี่โดย Googling ปัญหานี้ด้วยตัวเองอ่านบทความที่เชื่อมโยงและผลิตโซลูชันที่มีขนาดกะทัดรัดซึ่งสร้างชุดไพ่ทั่วไปจำนวน 47 แผ่น ต้องใช้ชุดไพ่ 2x3 สำหรับวัสดุที่ล็อคอัตโนมัติดังนี้:ชุดการหมุนอัตโนมัติ 2x3

ด้วยชุดตัวเลือกไทล์เดี่ยวที่ด้านบนซ้ายมุมด้านในที่มุมขวาด้านบนและไทล์มุมด้านนอกสี่ชุดที่ด้านล่าง (คุณอาจรู้จักข้อตกลงนี้จาก RPG Maker)

เคล็ดลับคือการแบ่งไทล์แผนที่ "ตรรกะ" แต่ละรายการออกเป็น 4 แผ่นครึ่งหนึ่งเพื่อการแสดงผล ยิ่งไปกว่านั้นครึ่งแผ่นในชุดไพ่สามารถอยู่ในตำแหน่งนั้นในแผ่นกระเบื้องที่สร้างขึ้นได้ดังนั้นจึงสามารถใช้แผ่นครึ่งซ้ายบนในตำแหน่งด้านบนซ้ายเท่านั้น

ข้อ จำกัด เหล่านี้หมายความว่าคุณจะต้องตรวจสอบ 3 ประเทศเพื่อนบ้านแบบเต็มกระเบื้องต่อครึ่งแผ่นแทนที่จะเป็น 8 ประเทศเพื่อนบ้าน

ฉันใช้ความคิดนี้อย่างรวดเร็วเพื่อทดสอบ นี่คือรหัสการพิสูจน์แนวคิด (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 เก็บ bitmasks ไว้สำหรับแต่ละรายการดังนั้นเราจึงสามารถคว้าเฉพาะข้อมูลเพื่อนบ้านที่เกี่ยวข้องเท่านั้น
  • map* เป็นพจนานุกรมการทำแผนที่รัฐเพื่อนบ้านกับดัชนีกราฟิกในภาพชุดไพ่ (0..24)
    • เนื่องจากแต่ละครึ่งแผ่นตรวจสอบ 3 เพื่อนบ้านแต่ละคนมี 2 ^ 3 = 8 รัฐ
  • _tile มีการกำหนดไทล์สำหรับการเรียงอัตโนมัติ
  • เนื่องจากไทล์ตรรกะของเรามีขนาดใหญ่กว่าไพ่เรนเดอร์ของเราสองเท่าดังนั้นออโตไทล์คอร์ด (x, y) ทั้งหมดจึงต้องเพิ่มเป็นสองเท่าในแผนที่เรนเดอร์

อย่างไรก็ตามนี่คือผลลัพธ์ (โดยมีเพียงไทล์เดียวอยู่แล้ว):ป้อนคำอธิบายรูปภาพที่นี่


0

ฉันอ่านลิงค์ส่วนใหญ่และใช้เวลาพอสมควรในการหาวิธีแก้ปัญหาอื่น ฉันไม่รู้ว่ามันดีหรือไม่ แต่เพื่อจำลองพฤติกรรมของตัวต่อภาพอัตโนมัติของRPG Maker VX Ace (47 แผ่น) ฉันเริ่มทำสิ่งนี้:

(ซ้าย 0 หรือ 1) + (ขวา 0 หรือ 1) + (ขึ้น 0 หรือ 1) + (ลง 0 หรือ 1) ตอนนี้ฉันมี 5 ราย

ถ้า 4 = Tile 46 ถูกวางไว้

ถ้านักเรียนประจำ 3 คน =

ถ้า 2 4 ราย + 2 รายไม่แน่ใจเกี่ยวกับอัลกอริทึม แต่ไม่สามารถแยกสาขาได้มากนัก

ถ้า 1 = กำลังดำเนินการอยู่ แต่ทุกทิศทางสามารถจบลงได้ 4 กรณี

ถ้า 0 = ฉันสามารถใช้อัลกอริทึมตัวเลขที่แสดงในลิงก์ด้วย 1, 2, 4, 8 และรับ id จาก 1 ถึง 15 ฉันสามารถใช้โดยตรง

ฉันไม่ใช่โปรแกรมเมอร์และไม่เก่งที่สุดกับอัลกอริธึมคณิตศาสตร์และโซลูชัน 1, 2, 4, 8, 16, 32, 64, 128 และ 128 ฉันก็ไม่ค่อยชอบ

บางทีแนวทางของฉันอาจดีกว่าอย่างน้อย


1
ฉันไม่แน่ใจว่าคำตอบนี้ตอบคำถามคุณช่วยอธิบายอีกเล็กน้อยได้ไหม? ถ้าคุณอ้างถึงอย่างอื่นคุณสามารถลิงก์ไปยังอย่างน้อยได้ไหม
Vaillancourt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.