ฉันจะสุ่มสร้างภูมิประเทศที่ใช้แผ่นพื้นด้านข้างแบบสุ่มได้อย่างไร


11

ฉันต้องการสร้างแผนที่แบบสุ่มสำหรับเกม 2D sidescroller โดยใช้ชุดไพ่ต่อไปนี้: ป้อนคำอธิบายรูปภาพที่นี่

ฉันได้พบบทความที่ดีเกี่ยวกับกระบวนการ Bitmasking เช่น: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -method สำหรับใช้-tilemaps /

ฉันชอบความคิดในการใช้ bitmask / tilemask แทนที่จะทำประโยคคำสั่งหรือ switch ขนาดใหญ่

อย่างไรก็ตามฉันมีปัญหาในการแสดงภาพกระบวนการทั้งหมดและไม่มีบทความใดที่พูดถึงการสุ่ม

ไทล์ของฉันเข้าด้วยกันในหลาย ๆ แบบไม่ใช่แค่ทางเดียวเพราะไทล์ในตัวอย่างที่ฉันเชื่อมโยงดูเหมือนจะ

ตัวอย่างเช่นนี่เป็นเพียงตัวอย่างไม่กี่:

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

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

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

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

เนื่องจากกระเบื้องของฉันเข้ากันได้หลายวิธีฉันไม่คิดว่าหน้ากาก 8 บิตจะทำงานได้ ดังนั้นฉันคิดว่าจะใช้ bitmask ที่ใหญ่กว่านี้ บางอย่างเช่นถ่าน [8] หรือถ่าน4

หากใครบางคนสามารถแสดง pseudocode / ตัวอย่างของอัลกอริธึมทั่วไปที่ดูเหมือนฉันจะขอบคุณมันมาก

คำตอบ:


3

ใช่ขนาดหน้ากากจะเพิ่มขึ้นตามจำนวนที่เพิ่มขึ้นของตัวเลือก - ลิงค์ของคุณเองhttp://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ส่วนที่สองอธิบายแนวคิดหลัก

ในสาระสำคัญคุณจะต้องระบุความเป็นไปได้ของ X สำหรับแต่ละ 'เส้นขอบ' ระหว่างแผ่นกระเบื้อง ในตัวอย่างเฉพาะของคุณดูเหมือนว่า "กระเบื้องด้านบน / ล่าง" อาจเป็น (1) สีขาว (2) ที่มีหลังคาครอบหรือ (3) ครึ่งที่มีหลังคา - ซึ่งบังเอิญตรงกับตัวอย่าง 'trinary' ที่ให้ไว้ในบทความ

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

ชุดไพ่เฉพาะของคุณนั้นค่อนข้างเข้มงวด - อธิบายเพียงพื้นผิวเดียวที่เพิ่มขึ้น / ลดลงและ ณ จุดเริ่มต้น 'ระดับจำนวนเต็ม' คุณมีตัวเลือกที่ถูกต้องเพียงไม่กี่ตัวเท่านั้น ตัวอย่างเช่นหลังจาก tile # 2 มีเพียงไพ่ # 1 หรือ # 8 เท่านั้น คุณสามารถย้ายจากซ้ายไปขวาได้โดยทำรายการที่มี (ไม่กี่รายการ) ที่สามารถเรียงต่อกันตามลำดับก่อนหน้าและสุ่มเลือกหนึ่งในนั้น


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

1
สำหรับแต่ละประเภทของกระเบื้องมีรายการของสิ่งที่ได้รับอนุญาตหลังจากนั้น - มีจำนวนแผ่นน้อยมากสามารถทำได้ด้วยตนเองอย่างรวดเร็ว 'ความสูง' จะเปลี่ยนเติมทุกอย่างใต้กระเบื้องใหม่ด้วย # 10s
Peteris

อ่าคุณกำลังบอกว่าจะใช้วิธีนี้แทน bitmasking ไหม?
erebel55

1
ใช่ bitmasking มีประโยชน์ถ้าเนื้อหา 2d ทั้งหมดมีความหมาย แต่แผนที่ของคุณดูเหมือนจะเป็นระดับเดียวพื้นผิวแนวนอนที่มีความสูงแตกต่างกัน
Peteris

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

6

คุณเคยใช้ฟังก์ชั่นลดเสียงรบกวน 1D Perlin หรือ Simplex หรือไม่? มีข้อดีหลายประการ ได้แก่ :

  1. ไม่ จำกัด (ภายในขอบเขตของความแม่นยำจุดลอยตัว), ภูมิประเทศที่ไม่เกิดซ้ำ

  2. สามารถสร้างเรียลไทม์ (แม้ใน shader ซึ่งเร็ว ) หรือล่วงหน้าและเก็บไว้ในพื้นผิวเช่นในตัวอย่างของคุณ

  3. เส้นขอบจะจับคู่โดยอัตโนมัติเนื่องจากทั้ง Perlin และ simplex ต่อเนื่องกัน

  4. แม้ว่าภูมิประเทศจะหลอกตัวเอง แต่ก็ง่ายพอที่จะใช้ฟังก์ชั่นซองจดหมายหรือลดจำนวนอ็อกเทฟในพื้นที่ที่คุณต้องการพื้นที่ราบหรือคุณสมบัติภูมิประเทศเฉพาะอื่น ๆ ที่คุณต้องการ

ดูที่ลิงก์นี้สำหรับคำอธิบายโดยละเอียดเกี่ยวกับการใช้งาน 1D Perlin

ซองจดหมายนั้นเป็นสนามหรือฟังก์ชั่นสเกลาร์ที่คูณด้วยฟังก์ชั่นรบกวนก่อนที่จะบันทึกหรือแสดงผลลัพธ์ของคุณ

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

(ภาพเริ่มต้นที่ยืมมาจากบทความที่อ้างถึงข้างต้น)

ในตัวอย่างนี้เส้นสีแดงหมายถึงฟังก์ชันหนึ่งส่วนที่กำหนดเป็น

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... ซึ่งอาจนิยามได้ดีกว่าโดยใช้ฟังก์ชั่นที่ราบรื่น ในกรณีนี้มันจะลดขนาดลงเหลือ 0 ก่อนที่ราบสูงจากนั้นกลับไปที่ 1 หลังจากนั้น

ปรับปรุง

นี่คือตัวอย่างของ "ภูมิประเทศ" 3D simplex จากหนึ่งในโครงการของฉันที่มีการใช้แสงแบบกระจาย + แบบพิเศษซึ่งสร้างขึ้นทั้งหมดภายในท่อ Vert + Tess + Frag Shader สำหรับสถานการณ์ของคุณฉันจะนำชิ้นส่วนแนวตั้งออกจากนี้เพื่อให้ได้ความลาดชันของภูมิประเทศ

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

และมุมมอง orthographic จากบนลงล่าง:

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


นี่เป็นเทคนิคในการสร้างภาพไทล์จริงหรือไม่?
erebel55

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

ดูเหมือนว่าวิธีการที่น่าสนใจฉันแค่ไม่แน่ใจว่าฉันต้องการลงเส้นทางนี้เนื่องจากฉันได้สร้างภาพของฉันแล้ว
erebel55

@ erebel55 ใช่ไม่มีเหตุผลที่จะโยนสิ่งที่มีอยู่ถ้ามันทำงานให้คุณ
3

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