Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

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

by
Difficulty:IntermediateLength:LongLanguages:

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 Map
กำลังสร้างที่สุ่มแผนที่ (คลิกเพื่อเรียกใช้บคุณสมบัติ)

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

Screenshot 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 Leafs
ตัวอย่างของพื้นที่ถูกแบ่งแยกโดย Leafs

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

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

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

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

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

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

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

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

Sample 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 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.