Game helikopter 2D, bagaimana cara membuat dinding koridor?

12

Saya melihat ke dalam mengadaptasi permainan "helikopter" klasik (yaitu http://www.addictinggames.com/helicopter.html ), tetapi saya belum menemukan cara untuk membuat mesin generasi dinding.

Adakah petunjuk ke pseudocode? Saya tidak begitu tertarik pada objek di tengah - hanya metodologi untuk menghasilkan sisi dengan cara yang meningkat dengan kesulitan (semakin banyak, memiliki lebih banyak kurva yang tidak terduga) saat permainan berlangsung.

davidkomer
sumber
1
Juga - untuk memperjelas, saya perlu dinding menjadi lebih melengkung daripada kuning, karena mereka benar-benar akan menjadi "gelombang air" ...
davidkomer
1
lakukan saja sebagai blok, tetapi interpolasi halus antara masing-masing.
Gustavo Maciel

Jawaban:

17

Anda bisa menggunakan 1D Perlin noise untuk itu. Berikut gambar noise 2D. Saya mengambil sampel di mana garis merah berada dan mengalikannya dengan beberapa konstanta untuk mendapatkan garis hijau.

Kebisingan 2D dengan bagian 1D

Konstanta Anda mengalikan nilai akan menentukan ketinggian noise. Jadi Anda bisa dengan mudah meningkatkan kesulitan. Manfaat lain dari kebisingan Perlin adalah, bahwa ia dapat menghasilkan kebisingan ubin, sehingga Anda dapat membangun tingkat yang tampaknya tidak ada habisnya.

Jika Anda ingin membuat bagian bawah dan langit-langit, penting agar Anda tidak menghasilkan area yang tidak dapat dilewati. Cara termudah adalah dengan menggunakan bagian "atas" dari kebisingan (mis. 1.0 - noiseValue) Sebagai langit-langit dan bagian bawah ( noiseValue) untuk bagian bawah (dengan beberapa offset di antara tentu saja). Jika itu terlihat terlalu membosankan, Anda juga dapat mempertimbangkan dua sampel dekat, misalnya. bayangkan garis sampel merah lain satu atau dua piksel naik atau turun. Ini akan memberikan gelombang yang serupa, tetapi tidak sama.

bummzack
sumber
Wow, ini sangat membantu! Terima kasih :) Saya sedang mengembangkan di Flash / Actionscript- dan saya melihat ada fungsi perlinNoise built-in ... akan bermain dengannya dan melihat bagaimana kelanjutannya :)
davidkomer
@davidkomer Saya senang ini bermanfaat. Dalam sekejap Anda harus membuat BitmapDataobjek dan menggunakan perlinNoisefungsinya. Bitmap dapat berukuran 800x3 piksel atau sesuatu yang ekstrem, maka Anda cukup mengekstraksi nilai-nilai garis atas dan bawah (sesuatu seperti (bitmap.getPixel(x,y) & 0xff) / 255.0seharusnya memberi Anda nilai dalam 0..1kisaran.
bummzack
Hmmm- saya berhasil, tetapi konstanta / pengali mendorong nilai ke area yang tidak dapat dilewati ... inilah kode saya, ada ide? (vect adalah vektor dari nilai 32 bit, disampel dari garis perlin noise ... jadi y_val hanyalah saluran biru yang dikalikan dengan scaler) untuk (idx = 0; idx <vect.length; idx ++) {y_val = (vect [idx] & 0xFF) * scaler; drawData.fillRect (Rectangle baru (idx, drawData.height - y_val, 1, y_val), 0x0000ff); drawData.fillRect (Rectangle baru (idx, 0, 1, y_val), 0x0000ff); }
davidkomer
Saya harus mencalonkan diri sekarang - tetapi ada yang mengatakan saya perlu membaca komentar Anda lebih hati-hati;) Di sinilah saya sejauh
ini-
Apa itu scaler? Nilai yang Anda dapatkan akan berada dalam kisaran 0..255dalam kode Anda.
bummzack