Advertisement
  1. Game Development
  2. Programming

วิธีการใช้ BSP ต้นไม้เพื่อสร้างแผนที่

by
Read Time:12 minsLanguages:

Thai (ภาษาไทย) translation by Muhammad Gufron (you can also view the original English article)

ตอนที่มาแทนในพื้นที่ของโดยบังเอิญกับวัตถุอย่างห้องในการสุ่มคุกใต้ดิน,เธอวิ่งหนีความเสี่ยงที่ทำให้หนักเรื่องนั้นเหมือนกันโดยผลลัพธ์จากใน clumping หรือแค่ข้อที่ไม่สามารถใช้ได้วุ่นวาย ในหัดเล่น,ผมจะแสดงให้ดูว่าต้องใช้ฐานสองอวกาศ Partitioning ต้องแก้ปัญหานี้

ฉันจะเป็นผู้นำคุณลองค้นหาทั่วไปขั้นตอนเพื่อใช้ BSP ให้เรียบง่าย 2D นแผนที่ซึ่งจะถูกใช้สำหรับคุกใต้ดินผังแป้นพิมพ์สำหรับเกมส์ ฉันจะให้คุณดูวิธีที่จะทำให้เป็นพื้นฐานใบไม้ติดสิ่งซึ่งเราจะใช้เพื่อแบ่งพื้นที่ขึ้นในเซกเมนต์เล็กๆ;งั้น,วิธีที่จะสร้างการสุ่มห้องในแต่ละใบไม้ติ;และในที่สุดก็ยังต้องเชื่อมต่อทั้งหมดของห้องด้วยกันกับทางเดินนะ

ข้อควรทราบ:ตอนที่วอย่างเช่นรหัสที่ใช้ AS3 คุณควรจะเป็นสามารถใช้เวทมนตร์ที่ทบทวนคอนเซ็ปท์ในค่อนข้างมากมีภาษาของคุณต้องการ

โครงการสาธิต

ฉันสร้างสาธิตการแสดงถึงการของพลังงานของ BSP น ที่สาธิตการถูกเขียนใช้ Flixel เป็นอิสระเปิดแหล่งข่าว AS3 องสมุดที่ทำให้เกมส์

เมื่อคุณคลิกที่สร้างปุ่มมันวิ่งผ่านทางเดียวกับรหัสที่อยู่เหนือสร้างบางอย่า Leafs แล้ววาดพวกเขาต้องเป็น BitmapData สิ่งซึ่งมันก็แสดง(ถูกปรับขนาดขึ้นมาเพื่อเติมเต็มหน้าจอ)ย

Screenshot from Demo program - Generating the Random MapScreenshot from Demo program - Generating the Random MapScreenshot from Demo program - Generating the Random Map
กำลังสร้างที่สุ่มแผนที่ (คลิกเพื่อเรียกใช้บคุณสมบัติ)

ตอนที่คุณกำลังเล่นกระดุมมันผ่านไปคนที่ถูกสร้างแผนที่ภาพบิตแมพให้ FlxTilemap วัตถุที่หลังจากนั้นมันก็สร้างเป็น playable tilemap และแสดงมันอยู่บนหน้าจอสำหรับคุณที่เดินไปเดินมาใน:

Screenshot from Demo program - Playing the MapScreenshot from Demo program - Playing the MapScreenshot from Demo program - Playing the Map
เล่นเป็นแผนที่ (คลิกเพื่อเรียกใช้บคุณสมบัติ)

ใช้ปุ่มลูกศรต้องไปแล้ว


มันคืออะไร BSP?

ฐานสองอวกาศ Partitioning เป็นวิธีการของ dividing เข้าไปในพื้นที่เล็กกว่าชิ้นส่วนอน

โดยทั่วไปแล้ว,คุณใช้เป็นพื้นที่เรียกว่าใบไม้ติดและแบ่งมัน—ทั้งทางแนวตั้งหรือทางแนวนอน—ออกเป็นสองเล็กลง Leafs และพูดโพรเซสที่เล็กกว่าส่วนที่ซ้ำแล้วซ้ำอีกจนกระทั่งแต่ละพื้นที่อย่างน้อยเล็กเท่าการตั้งค่าสูงสุดได้

เมื่อคุณเสร็จแล้วคุณมีลำดับชั้นในผังต้นไม้ของกแบ่งส่วน Leafs ซึ่งคุณสามารถทำได้ทุกอย่างของอย่างด้วย ใน 3 มิติภาพกราฟิก,คุณอาจจะใช้ BSP จะค่อยๆจัดการกับซึ่งวัตถุเป็นสามารถมองเห็นได้เล่นหรือไม่,หรือจะให้ช่วยเกี่ยวกับอุบัติเหตุรถชนในการตรวจสอบเล็กกว่ากันไซชิ้นส่วนอน


ทำไมถึงใช้ BSP สร้างแผนที่อ?

ถ้าคุณต้องการสร้างการสุ่มแผนที่นั่นเป็นตัวอย่างของการที่จะไปเกี่ยวกับมัน คุณสามารถเขียนเรียบง่ายตรรกะที่จะสร้างแบบมั่นไซ rectangles ที่สุ่มตำแหน่งของแต่มันสามารถทิ้งคุณกับแผนที่ที่เต็มไปด้วยนั้นมันซ้อนกัน,clumped หรือแปลกดี-เว้นระยะห่างโดยสิ้นเชิห้องของตัวเอง มันก็ยังทำให้มันยากที่จะเชื่อมต่อที่ห้องเพื่อกันและกันและเพื่อทำให้แน่ใจว่าไม่มีเอกสารอื่นๆห้องของตัวเอง

กับ BSP คุณสามารถรับประกันได้มากก evenly-เว้นระยะห่างโดยสิ้นเชิห้องในขณะที่ยังทำให้มั่นใจว่าคุณสามารถเชื่อมต่อทั้งหมดห้องอยู่ด้วยกัน


กำลังสร้าง Leafs

สิ่งแรกที่เราต้องการคือเพื่อสร้างของใบไม้ติดห้องเรียน เป็นของใบไม้ติจะเป็นสี่เหลี่ยมกับบางพิเศษ functionality น แต่ละใบไม้ติดเหมือนกัมีคู่ของลูก Leafs หรือเป็นคู่ของห้องที่องห้องโถงหรือสองคน

นี่คือสิ่งที่เราสองคนดูเหมือนใบไม้ติด:

ตอนนี้คุณต้องการจะจริงสร้างของคุณ Leafs:

หลังจากเรื่องนี้เล่นเสร็จเธอจะออกไปกับเว็กเตอร์(พิมพ์อาเรย์)ที่เต็มไปด้วยทุกของคุณ Leafs น

นี่เป็นตัวอย่างกับบรรทัดแยกกันอยู่แต่ละใบไม้ติด:

Sample of an area divided by LeafsSample of an area divided by LeafsSample of an area divided by Leafs
ตัวอย่างของพื้นที่ถูกแบ่งแยกโดย Leafs

กำลังสร้างห้อง

ตอนนี้ของคุณ Leafs เป็นกำหนดไว้เราต้องทำให้ห้องของตัวเอง เราต้องการเป็นแบบ'หย่อนล'ลูกเล่นอยู่ไหนเราต้องทำตัวยังไงหลังจากของเราที่ใหญ่ที่สุด,เพราก'ใบไม้ติดตามทางของเล็กๆน้อยๆให้กับ Leafs กับไม่มีลูกแล้วทำให้เป็นห้องกันตัวแรนดอมขังไว้ก่อนไหม

งั้นเพิ่มฟังก์ชันนี้ต้องของใบไม้ติดคลาส:

หลังจากนั้นหลังจากที่คุณสร้างสรรของเว็กเตอของ Leafs โทรเรียกใหม่ของเราฟังก์ชันออกจากรากของใบไม้ติด:

นี่เป็นตัวอย่างของบางอย่าสร้าง Leafs กับห้องข้างในของพวกเขา:

Sample of Leafs with random room inside each oneSample of Leafs with random room inside each oneSample of Leafs with random room inside each one
ตัวอย่างของ Leafs กับแรนดอมอยู่ในห้องแต่ละคน

อย่างที่คุณเห็นแต่ละใบไม้ติดบรรจุดห้องกับเป็นการสุ่มขนาดและตำแหน่งแล้ว คุณสามารถเล่นกับค่าต่ำสุดและสูงสุดของใบไม้ติดขนาด,และเปลี่ยนแปลงยังไงคุณระบุขนาดและตำแหน่งของแต่ละห้องจะต่างออกฤทธิ์นะครับ

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

Sample of Leafs with a room inside each one separator lines removedSample of Leafs with a room inside each one separator lines removedSample of Leafs with a room inside each one separator lines removed
ตัวอย่างของ Leafs กับห้องข้างในแต่ละหนึ่งกับเครื่องหมายแยกเลขหลักบรรทัดถูกลบออกไป

การเชื่อมต่อ Leafs

ตอนนี้ทั้งหมดที่เราต้องทำคือเชื่อมต่อแต่ละห้อง ขอบคุณที่ตั้งแต่เรามีคนสร้างความสัมพันธ์ระหว่าง Leafs ทั้งหมดที่เราต้องทำคือทำให้มั่นใจว่าใบไม้ติดกันและนั่นมีเด็ก Leafs มีโถงทางเดินเชื่อมโยงเด็ก

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

ก่อนอื่นเราต้องการคนใหม่ฟังก์ชันจะ iterate จากมีใบไม้ติดเข้ามาในห้องใดห้องหนึ่งที่เป็นภายในหนึ่งของเด็ก Leafs:

ต่อไปเราต้องการฟังก์ชันที่ใช้คู่ของห้องเลือกสุ่มจุดภายในทั้งสองห้องแล้วสร้างเหมือนกัหนึ่งหรือสองคนสองหั่นชิ้นเรียงต่อเนื่อง-หนา rectangles ต้องเชื่อมโยงคะแนนอยู่ด้วยกัน

ในที่สุดก็เปลี่ยนของคุณ createRooms ฟังก์ชัน()จะโทรหา createHall ฟังก์ชัน()มีใบไม้ติดที่มีจับคู่ของลูก:

ห้องคุณและทางเดินควรจะตอนนี้ฟังนะเรื่องแบบนี้:

Sample of Leafs filled with random rooms connected via hallwaysSample of Leafs filled with random rooms connected via hallwaysSample of Leafs filled with random rooms connected via hallways
ตัวอย่างของ Leafs เต็มไปด้วยการสุ่มห้องเชื่อมต่อผ่านทางทางเดินนะ

อย่างที่คุณเห็นเพราะว่าเราคือทำให้มั่นใจว่าจะเชื่อมโยงทุกใบไม้ติดอน,เราจะไม่ทิ้งไว้กับเด็กกำพร้าห้องของตัวเอง อย่างที่เห็นกันอยู่ว่าห้องโถงทางเดินตรรกะอาจจะเป็นมากก refined ต้องพยายามที่จะหลีกเลี่ยงวิ่งหนีเหมือนกัใกล้ชิดกันทางเดินแต่มันได้ผลดีพอ


กำลังทำให้เสร็จสิ้น

นั่นเป็นพื้นฐานแล้ว! เรารู้แล้ววิธีที่จะสร้าง(ค่อนข้าง)เรียบง่ายใบไม้ติดสิ่งซึ่งคุณสามารถใช้เพื่อสร้างต้นไม้ของถูกแบ่งออกเป็น Leafs,สร้างการสุ่มห้องข้างในแต่ละใบไม้ติดและเชื่อมต่อที่ห้องผ่านทางทางเดินนะ

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

ตอนนี้คุณสามารถใช้ BSP ต้องทำอะไรสุ่มแผนที่คุณต้องการหรือใช้มันเพื่อ evenly ไลพลังงานทั้งหรือศัตรูข้ามพื้นที่หรืออะไรก็ตามที่คุณต้องการ!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.