เกมเฮลิคอปเตอร์ 2 มิติวิธีสร้างกำแพงทางเดิน


12

ฉันกำลังมองหาการดัดแปลงเกม "เฮลิคอปเตอร์" แบบคลาสสิก (เช่นhttp://www.addictinggames.com/helicopter.html ) แต่ฉันยังไม่ได้หาวิธีสร้างเครื่องมือสร้างผนัง

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


1
Also- ชี้แจงฉันต้องการผนังที่จะโค้งมากกว่าบล็อกเนื่องจากพวกเขาจริงจะเป็น "คลื่นน้ำ" ...
davidkomer

1
เพียงแค่ทำเป็นบล็อก แต่สอดแทรกเรียบระหว่างแต่ละตอน
Gustavo Maciel

คำตอบ:


17

คุณสามารถใช้เสียง 1D Perlinเพื่อสิ่งนั้นได้ นี่คือภาพของเสียงรบกวน 2 มิติ ฉันเอาตัวอย่างที่เส้นสีแดงและคูณกับค่าคงที่เพื่อให้ได้เส้นสีเขียว

เสียง 2 มิติที่มีส่วน 1D

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

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


ว้าวนี่มันช่างช่วยได้! ขอบคุณ :) ฉันกำลังพัฒนาใน Flash / Actionscript- และฉันเห็นว่ามีฟังก์ชั่น perlinNoise ในตัว ... จะเล่นกับมันและดูว่ามันจะเป็นอย่างไร :)
davidkomer

@davidkomer ฉันดีใจที่มีประโยชน์ ในแฟลชคุณจะต้องสร้างBitmapDataวัตถุและใช้perlinNoiseฟังก์ชั่นของมัน บิตแมปอาจเป็น 800x3 พิกเซลหรืออะไรที่สุดโต่งจากนั้นคุณสามารถแยกค่าบรรทัดบนและล่าง (อย่างที่(bitmap.getPixel(x,y) & 0xff) / 255.0ควรให้ค่าใน0..1ช่วงนั้น)
bummzack

อืม - ฉันทำให้มันทำงานได้ แต่ค่าคงที่ / ตัวคูณดันค่าลงในพื้นที่ที่ไม่สามารถใช้ได้ ... นี่คือรหัสของฉันความคิดใด ๆ (vect เป็นเวกเตอร์ที่มีค่า 32 บิตสุ่มตัวอย่างจากบรรทัดของเสียงรบกวน perlin ... ดังนั้น y_val เป็นเพียงช่องสีฟ้าคูณด้วย scaler) สำหรับ (idx = 0; idx <vect.length; idx ++) {y_val = (vect [idx] & 0xFF) * scaler; drawData.fillRect (สี่เหลี่ยมผืนผ้าใหม่ (idx, drawData.height - y_val, 1, y_val), 0x0000ff); drawData.fillRect (สี่เหลี่ยมผืนผ้าใหม่ (idx, 0, 1, y_val), 0x0000ff); }
davidkomer

ฉันต้องวิ่งไปตอนนี้ - แต่มีบางอย่างบอกฉันว่าฉันต้องอ่านความคิดเห็นของคุณให้ละเอียดมากขึ้น;) นี่คือสิ่งที่ฉันกำลังทำอยู่ - pastebin.com/1tmMtEAh
davidkomer

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