Bagaimana saya dapat secara acak membuat medan sisi-penggulung berbasis ubin 2D?

11

Saya ingin membuat peta secara acak untuk gim sidescroller 2D menggunakan tileset berikut: masukkan deskripsi gambar di sini

Saya telah menemukan beberapa artikel bagus tentang proses bitmasking, misalnya: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -metod-for-apply-tilemaps /

Saya suka ide menggunakan bitmask / tilemask alih-alih melakukan klausa besar atau beralih pernyataan.

Namun, saya mengalami kesulitan memvisualisasikan seluruh proses dan tidak ada artikel ini berbicara tentang pengacakan.

Ubin saya cocok bersama dalam berbagai cara, bukan hanya satu cara seperti ubin dalam contoh yang saya tautkan tampaknya.

Contohnya di sini hanya beberapa contoh:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Karena ubin saya cocok bersama dalam berbagai cara saya tidak berpikir topeng 8 bit akan bekerja. Karena itu, saya berpikir untuk menggunakan bitmask yang lebih besar. Sesuatu seperti char [8] atau char 4 .

Jika seseorang dapat menunjukkan beberapa pseudocode / contoh bagaimana algoritma umum akan terlihat, saya akan sangat menghargainya.

erebel55
sumber

Jawaban:

3

Ya, ukuran topeng akan tumbuh dengan meningkatnya jumlah opsi - tautan Anda sendiri http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ bagian kedua menjelaskan gagasan utama.

Intinya, Anda harus menyebutkan kemungkinan X untuk setiap 'batas' antar ubin; dalam contoh khusus Anda sepertinya "ubin atas / bawah" dapat berupa (1) putih (2) tertutup atau (3) setengah tertutup - yang secara kebetulan cocok dengan contoh 'trinary' yang diberikan dalam artikel.

Tapi topeng hanya akan membantu Anda membatasi kemungkinan ubin untuk yang bisa ditarik, dengan sendirinya itu bukan metode yang menunjukkan cara menghasilkan peta yang sebenarnya dengan cara yang masuk akal.

Ubin khusus Anda sebenarnya sangat terbatas - ini hanya menggambarkan satu permukaan naik / turun, dan pada titik awal 'integer-level' Anda hanya memiliki beberapa pilihan yang valid. Misalnya, setelah ubin # 2 hanya ubin # 1 atau # 8 yang mungkin. Anda dapat dengan mudah berpindah dari kiri ke kanan, membuat daftar yang mana (beberapa) ubin dapat muncul setelah ubin sebelumnya, dan secara acak memilih salah satunya.

Peter adalah
sumber
Saya pikir ini adalah jawaban yang saya cari, namun masih sedikit mendung. Bisakah Anda mendapatkan sedikit lebih rinci, baik dalam bentuk teks atau kodesemu tentang bagaimana bagian terakhir dari penjelasan Anda akan bekerja? "Anda cukup berpindah dari kiri ke kanan, membuat daftar yang (beberapa) ubin dapat muncul setelah ubin sebelumnya, dan secara acak memilih salah satunya."
erebel55
1
Untuk setiap jenis ubin, miliki daftar ubin apa yang diizinkan setelah itu - ada begitu sedikit ubin, dapat dengan cepat dilakukan secara manual. 'Tinggi' akan berubah, isi semuanya di bawah ubin baru dengan # 10s.
Peteris
Ah jadi Anda mengatakan untuk menggunakan metode ini alih-alih dengan bitmasking?
erebel55
1
Ya, bitmasking berguna jika semua konten 2d bermakna, tetapi peta Anda tampaknya bertingkat tunggal, permukaan horizontal dengan ketinggian yang bervariasi.
Peteris
Itu masuk akal, "gunung" akan memiliki ketinggian yang berbeda dan akan mengalir satu sama lain. Jadi intinya gunung itu akan terus berubah ketinggian saat Anda bergerak bersama. Semacam gelombang cosinus / sinus yang memiliki magnitudo acak di berbagai titik. Haruskah saya pindah dari kiri ke kanan atau atas ke bawah saat membuat peta?
erebel55
6

Sudahkah Anda mempertimbangkan untuk menggunakan fungsi Perlin 1D atau simpleks noise? Ada sejumlah keuntungan untuk ini, termasuk:

  1. Infinite (dalam bidang presisi titik mengambang), medan yang tidak berulang

  2. Dapat dihasilkan secara real-time (bahkan dalam shader, yang cepat ), atau sebelumnya dan disimpan dalam tekstur, seperti pada contoh Anda

  3. Perbatasan secara otomatis cocok karena Perlin dan simpleks bersambungan.

  4. Meskipun medannya sendiri pseudo-acak, cukup mudah untuk menerapkan fungsi amplop atau cukup mengurangi jumlah oktaf di area di mana Anda memerlukan area datar atau fitur terain spesifik lainnya yang Anda butuhkan.

Lihat tautan ini untuk penjelasan yang cukup menyeluruh tentang implementasi 1D Perlin.

Amplop pada dasarnya adalah bidang skalar atau fungsi yang dikalikan dengan fungsi derau sebelum menyimpan atau menampilkan output Anda.

masukkan deskripsi gambar di sini

(Gambar awal dipinjam dari artikel yang disebutkan di atas.)

Dalam contoh ini, garis merah mewakili fungsi piecewise yang didefinisikan sebagai

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

... yang mungkin lebih baik didefinisikan menggunakan fungsi yang halus. Dalam hal ini, itu hanya skala ke 0 sebelum dataran tinggi, lalu kembali ke 1 sesudahnya.

Memperbarui

Berikut adalah contoh "medan" simpleks 3D dari salah satu proyek saya, dengan pencahayaan difus + specular yang diterapkan, seluruhnya dihasilkan dalam pipa vert + tess + frag shader. Untuk situasi Anda, saya akan mengambil irisan vertikal untuk mendapatkan kemiringan medan.

masukkan deskripsi gambar di sini

Dan pandangan ortografis top-down:

masukkan deskripsi gambar di sini

3Dave
sumber
Ini adalah teknik untuk menghasilkan gambar ubin yang sebenarnya sendiri?
erebel55
1
@ erebel55 Ya. Anda dapat menggunakan fungsi 2D untuk memutuskan di mana (berdasarkan contoh Anda) untuk menempatkan anak-anak tanaman yang berbeda di dalam gambar, dan juga untuk menghasilkan medan yang miring. Saya telah menggunakan ini dalam 3D dengan hasil yang bagus.
3Dave
Sepertinya metode yang menarik, saya tidak yakin ingin turun rute ini karena gambar saya sudah dibuat.
erebel55
@ erebel55 ya, tidak ada alasan untuk melemparkan barang-barang yang ada jika itu bekerja untuk Anda.
3Dave
Yah saya belum membuat generasi acak bekerja, tapi saya berharap;) Saya memberikan Anda suara untuk metode ini, karena itu menarik dan saya dapat menggunakannya beberapa waktu di masa depan. Terima kasih
erebel55