การสร้างแผนที่แบบสุ่ม


63

ฉันเริ่ม / เริ่มเกม RPG tile tile 2D ใน Java และฉันต้องการใช้การสร้างแผนที่แบบสุ่ม ฉันมีรายการของกระเบื้องที่แตกต่างกัน (ดิน / ทราย / หิน / หญ้า / กรวด ฯลฯ ) พร้อมกับแผ่นน้ำและกระเบื้องทางเดินปัญหาที่ฉันมีคือฉันไม่รู้ว่าจะเริ่มสร้างแผนที่แบบสุ่มได้อย่างไร

มันจะต้องมีส่วนของภูมิประเทศ (เช่นส่วนใดส่วนหนึ่งจะเป็นทรายส่วนของสิ่งสกปรก ฯลฯ ) คล้ายกับวิธีที่ Minecraft เป็นที่ซึ่งคุณมีไบโอมที่แตกต่างกันและพวกมันจะแปลงร่างเป็นกันและกันอย่างไร้รอยต่อ ในที่สุดฉันก็ต้องเพิ่มเส้นทางแบบสุ่มลงไปในนี้รวมถึงไปในทิศทางต่าง ๆ ทั่วแผนที่

ฉันไม่ได้ขอให้ทุกคนเขียนรหัสหรืออะไรทั้งหมดให้ฉัน piont ให้ฉันไปในทิศทางที่ถูกต้องได้โปรด

tl; dr - สร้างแผนที่ย่อยด้วย biomes เส้นทางและตรวจสอบให้แน่ใจว่า biomes ต่อเนื่องเข้าด้วยกัน

คำตอบ:


68

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

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

ป้อนคำอธิบายรูปภาพที่นี่

หรือสิ่งนี้

ป้อนคำอธิบายรูปภาพที่นี่

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

ฉันใช้กลยุทธ์นี้เป็นเกมของฉันและสร้างแผนที่เช่นนี้อย่างรวดเร็ว:

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้คุณสามารถเห็นฉันเลื่อนดูแผนที่อีกสองสามต้นที่จุดเริ่มต้นของวิดีโอนี้

และนี่คือสิ่งที่จะช่วยให้คุณเริ่มต้นได้มากขึ้น:

ฉันจะสร้าง "โลก" แบบสุ่มในเอ็นจินไทล์ได้อย่างไร

ฉันจะระบุภูมิภาคของสถานที่ในโลกที่สร้างขึ้นได้อย่างไร?

ฉันจะสร้างสัญญาณรบกวนที่เป็นรูปเป็นแผ่นสำหรับการสร้างแผนที่ได้อย่างไร


ในขณะที่ลิงก์รูปหลายเหลี่ยมสร้างแผนที่สำหรับเกมเป็นบทความที่ดีมากฉันไม่คิดว่ามันเป็นแบบที่ดีมากสำหรับคำถามนี้เพราะก) มันไม่ใช่กริด tilemap และ b) มันไม่มี biomes - พื้นผิวภูมิประเทศเป็น ขึ้นอยู่กับความสูง
Tapio

@Tapio คุณพูดถูกฉันได้อัปเดตข้อมูลเพิ่มเติมแล้ว
MichaelHouse

@ Byte56 ขอบคุณทั้งหมดนี้ทำให้ฉันเป็นจุดเริ่มต้น! :)
Tom O

@ Byte56 ฉันสังเกตเห็นว่าคุณพูดถึงคำถามของฉันเมื่อสองสามปีก่อนดังนั้นฉันจึงอัปเดตด้วยรหัสทำงาน!
Nick Badal

1
BTW โครงการสร้างแผนที่รูปหลายเหลี่ยมสร้างขึ้นสำหรับเกมที่มีแผนที่ย่อยซึ่งไม่แสดงความสูง ความสูงและรูปหลายเหลี่ยมอยู่ที่นั่นเพื่อสร้าง biomes แต่พวกเขาไม่ได้แสดงจริงในเกม
amitp

29

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

ต่างจากคำตอบอื่น ๆ ที่คุณเริ่มต้นด้วยแผนที่ที่ว่างเปล่าทั้งหมด เริ่มจากสิ่งที่คุณคิดว่าเป็นระดับน้ำทะเล ใช้เสียงรบกวนของเพอร์ลินเพื่อเพิ่มความแตกต่างเล็กน้อยหากคุณมีระดับความสูงที่เป็นไปได้ 256 ระดับไม่เปลี่ยนแปลงมากกว่า 3-5 ในทิศทางใดทิศทางหนึ่ง สิ่งนี้สร้างภูมิทัศน์ของคุณในช่วงสองสามพันล้านปีแรกโดยไม่ต้องทำการจำลองในระยะเวลานั้น

แผ่นเปลือกโลก

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

เมื่อแผ่นเปลือกโลกสองแผ่นข้ามเลือกตัวเลือกที่จะผ่านและจะไปอยู่ภายใต้ตัวเลือกนี้สามารถสุ่ม กระเบื้องบนจานที่กำหนดภายใต้จะลดความสูงลงทันที 5 ขั้น เมื่อมีการกำหนดป้ายทะเบียนเหนือหรือใต้การมีปฏิสัมพันธ์กับแผ่นในอนาคตทั้งหมดจะเป็นไปตามกฎเหล่านี้

  • ในกรณีที่จานที่กำหนดข้ามจานที่ไม่ได้ออกแบบจานที่ไม่ได้ออกแบบจะกลายเป็นประเภทตรงกันข้าม (ดังนั้นจาน UD จะกลายเป็นภายใต้เมื่อข้ามผ่าน)
  • ในกรณีที่แผ่นเหล็กวางอยู่เหนือแผ่นใต้กระเบื้องเหล่านั้นจะเลื่อนขึ้นไปตามระดับความสูง 0-1 และแผ่นกระเบื้องจะทำตามเส้นทางของแผ่นเหนือ
  • ในกรณีที่แผ่นปิดทับแผ่นข้ามแผ่นเหล่านั้นจะเลื่อนขึ้นไป 1-2 ขั้นและแผ่นที่อยู่ในแผ่นกากบาทจะไม่เลื่อนอีกต่อไป
  • ที่แผ่นด้านล่างข้ามแผ่นใต้พื้นกระเบื้องใด ๆ ในพื้นที่ที่มีระดับความสูงมากกว่า 66% สำหรับแผ่นเปลือกโลกทั้งสองในพื้นที่ภาคเหนือเลื่อนขึ้นไป 1-3 ขั้นตอน (ราวกับว่าเกิดจากการระเบิดของภูเขาไฟ ) และแผ่นกระเบื้องในบริเวณนี้หยุดการลอย

เพลตทั้งหมดที่ข้ามช้าลง 20% ของความเร็วปัจจุบันในแต่ละขั้นตอน เพื่อเพิ่มความสมจริงให้เพิ่มการเปลี่ยนแปลงทิศทางการเคลื่อนที่แบบสุ่ม -10% ถึง 10% ในแต่ละขั้นตอน

หลังจากดำเนินการตามจำนวนขั้นตอนที่ต้องการ อาจ 5-10 มีมากมาย ควรวางกระเบื้องที่ไม่มีแผ่นยึดอาศัยในระดับต่ำสุดที่มีอยู่

ใหญ่หรือเล็ก

แผนที่นี้สามารถใช้ตามที่เป็นอยู่หรือขยายเพื่อสร้างแผนที่ขนาดใหญ่กว่าโดยแบ่งเป็นส่วนย่อย 4X4 (เซลล์) และขยายส่วนเหล่านั้นตามระดับความสูงของแต่ละบุคคล รักษาระดับความสูงของแต่ละเซลล์เป็นจุดและสร้างการไล่ระดับสีที่ราบรื่นในแผนที่ขนาดใหญ่ระหว่างจุดเหล่านั้น ดังนั้นถ้าแผนที่ที่ใหญ่กว่าคือ 40X40 แทนที่จะเป็น 4X4 และจุด (0,0) คือ 10 และจุด (0,1) คือ 1, ไทล์บนแผนที่ขนาดใหญ่ระหว่างพวกเขาจะเป็น 10,9,8,7,6 สูง 5,4,3,2,1 คุณสามารถเพิ่มเสียงรบกวน Perlin เพิ่มเติมเพื่อทำให้เนินเขาเรียบ เทคนิคการปรับสเกลทั้งหมดนี้คล้ายกับอัลกอริธึมDiamond Square

น้ำ

เพื่อจำลองแม่น้ำและทะเลสาบมหาสมุทรและโต๊ะน้ำ ฉันชอบที่จะใช้ออโตเซลลูลาร์

ความสูงจะกลายเป็นลอยหรือขยายช่วง int เพื่ออนุญาตให้มีการติดตามที่ละเอียดยิ่งขึ้น เซลล์น้ำมีค่าความอิ่มตัวกล่าวในช่วง 1-256 แผนที่ควรเริ่มอย่างสม่ำเสมอ คุณจะต้องเล่นกับตัวเลขสำหรับขนาดแผนที่แต่ละขนาดอย่างไรก็ตามโดยทั่วไปคุณจะต้องปฏิบัติตามกฎดังนี้:

  • หากเซลล์เพื่อนบ้านมีความอิ่มตัวมากขึ้นเพิ่มความอิ่มตัวและเพิ่มความสูง
  • หากเซลล์เพื่อนบ้านมีความอิ่มตัวน้อยลงลดความอิ่มตัวและลดความสูง

ทำการตรวจสอบนี้สำหรับทุกเซลล์ที่อยู่ใกล้เคียง วิ่งผ่านจำนวนขั้นตอนที่เพียงพอ หากคุณต้องการคุณสามารถเพิ่มอุณหภูมิให้กับการจำลองนี้โดยการเปลี่ยนปริมาณของความอิ่มตัวที่หายไป / ที่ได้รับจากอุณหภูมิ คุณยังสามารถเปลี่ยนได้ตามระดับความสูง ทะเลสาบธรรมชาติและแม่น้ำควรก่อตัว บางคนจะตกลงไปในมหาสมุทร (มหาสมุทรอาจจะไม่เติมด้วยตัวชี้วัดใด ๆ แต่คุณจะกำหนดสิ่งใดภายใต้ระดับน้ำทะเลให้เป็นน้ำที่เต็มไปด้วยจุดสิ้นสุดอย่างไรก็ตาม)

คุณสามารถเก็บข้อมูลอุณหภูมิและความอิ่มตัวของข้อมูลไว้เช่นเดียวกับคำตอบอื่น ๆ เพื่อสร้าง biomes พวกเขาควรแม่นยำและน่าสนใจมากขึ้น ด้วย biomes หิมะที่ขั้วและที่ร้อนอยู่ตรงกลาง (ถ้าคุณใช้รายการอุณหภูมิที่จบการศึกษาอย่างราบรื่น)

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

วิวัฒนาการภูมิทัศน์

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

ข้อสรุป

ในขณะที่เทคนิคประเภทนี้มีส่วนเกี่ยวข้องมากขึ้น แต่ก็ให้ผลที่สมจริงและมีการพัฒนามากขึ้น รับสิ่งที่คุ้มค่า?


15

คุณสามารถใช้Perlin Noiseสำหรับการสร้างภูมิประเทศนี่คือวิธีที่biomesในเกม Minecraft ทำงาน อย่างที่คุณเห็นเขาใช้ heatmap ร่วมกับ rainmap เพื่อสร้าง biomes

Biomes จาก Minecraft

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