Langkah-langkah apa yang akan terlibat dalam membangun lanskap 2D yang dapat dirusak, seperti di Worms? Idealnya, Apa saja cara agar proses ini dapat dibuat seefisien mungkin?
Langkah-langkah apa yang akan terlibat dalam membangun lanskap 2D yang dapat dirusak, seperti di Worms? Idealnya, Apa saja cara agar proses ini dapat dibuat seefisien mungkin?
Jawaban:
Saya tidak tahu bagaimana lanskap dalam cacing diimplementasikan dengan tepat, tapi saya cukup yakin mereka menggunakan bitmap untuk lanskap (setidaknya dalam game seri yang lebih lama).
Pendekatan yang sangat mendasar adalah gambar bitmap (B / W) di mana piksel hitam mewakili udara dan piksel putih mewakili tanah . Penghancuran lanskap dapat dilakukan dengan mudah menggunakan operasi piksel. Jadi jika roket menyentuh tanah, cat lingkaran hitam dengan radius = blastRadius
titik tumbukan.
Anda kemudian dapat merender dunia Anda (atau hanya sebagian darinya) menggunakan bitmap itu. Untuk kinerja yang lebih baik, saya sarankan Anda menerapkannya dengan cara yang dapat Anda perbarui / render hanya sebagian dari "dunia". Misalnya. jika beberapa bagian dari lanskap dihancurkan oleh roket, hanya render kembali daerah yang terkena, bukan seluruh dunia.
Alih-alih gambar B / W sebagai "collision-map" Anda, Anda juga bisa menggunakan gambar 24bit di mana Anda menggunakan dua saluran untuk menyimpan permukaan normal (x, y) per piksel dan satu saluran untuk menyimpan "collision-" yang sebenarnya. peta". Memiliki permukaan normal di tangan akan sangat membantu Anda menghitung granat yang memantul, atau untuk menentukan apakah suatu karakter dapat bergerak ke arah tertentu.
Satu kemungkinan dari atas kepala saya:
Gunakan representasi jalur grafik vektor untuk menyimpan garis besar "tanah" yang dapat dirusak. Ketika peristiwa kehancuran terjadi (misalnya, sebuah granat meledak), area ledakan, yang direpresentasikan sebagai lingkaran, akan dipindahkan dari jalur darat melalui operasi pengurangan boolean. Jalur yang dihasilkan mewakili "tanah" baru untuk deteksi tabrakan tanah, dan juga mungkin topeng untuk menggambar tanah.
Saya menulis bukti konsep yang menggunakan geometri padat konstruktif untuk menangani medan yang dapat dirusak. Saya menggunakan Tessellator GLU untuk melakukan operasi boolean. The dokumentasi menjelaskan bagaimana, pencarian "CSG Menggunakan untuk Winding Aturan" .
Saya memberi makan output segitiga dari tessellator sebagai poligon statis ke Box2D. PoC bekerja dengan sangat baik. Saya dapat secara sewenang-wenang mengurangi dan menambahkan medan secara real-time dan medan terus berperilaku sesuai dengan Box2D. Satu-satunya masalah adalah bahwa tessellator GLU dapat menghasilkan segitiga degenerasi yang tidak disukai Box2D, jadi saya harus menyaringnya dengan tangan.
Langkah selanjutnya dalam PoC (yang saya tidak pernah sempat lakukan) adalah menggunakan algoritma SCC dari perpustakaan grafik boost untuk mendeteksi kapan sepotong medan telah terputus (memotong bagian atas gunung). Medan yang terputus akan tetap dapat dirusak tetapi sekarang diwakili oleh badan Box2D dinamis (non-statis) dengan segitiga yang dilampirkan sebagai bentuk. Saya memiliki desain yang berhasil tetapi kehilangan minat begitu saya mulai menggali dokumentasi dorongan. Saya "berencana" untuk meninjau kembali ide itu ketika saya membuat game earth / Worms yang hangus suatu hari nanti.
Semua jawaban di atas berbicara tentang menerapkan kasus paling sederhana, seperti pada cacing. Yaitu, ketika area dampak dihancurkan dan yang lainnya tidak tersentuh. Apakah Anda mempertimbangkan, bahwa lanskap Anda mungkin pada akhirnya akan terbelah dua? Katakanlah, ada gunung, dan pemain memotong bagian bawahnya dengan peluncur roket. Sekarang, bukankah seharusnya gunung itu jatuh? Selain itu, wajar jika lanskap sedikit elastis. Pada saat-saat Worms (setidaknya seperti yang saya ingat, saya tidak memainkan Worms selama bertahun-tahun) komputer tidak hanya cukup kuat untuk melakukannya dengan benar. Tetapi mereka sekarang.
Tentu saja, itu sepenuhnya tergantung pada ambisi proyek Anda. Tetapi jika Anda ingin benar-benar hebat, mungkin Anda harus mencoba Box2D sebagai mesin fisika. Ada banyak yang bisa Anda lakukan dengan itu.
Seperti dikatakan bummzack, Bitmap. Meskipun Anda bisa menggunakan transparansi 1 bit atau jika Anda tidak memiliki dukungan itu gunakan warna merah muda yang mengerikan yang tidak akan Anda gunakan dalam game Anda.
Titik dampak dapat dihitung hanya dengan memeriksa warna piksel. dan ketika dampak terjadi, ubah warna (atau hapusnya) dari bitmap.
Sedangkan untuk radius ledakan, pemberhentian pertama saya adalah algoritma lingkaran Bresenham , sangat cepat dan efisien. Meskipun saya akan melakukan penghapusan raten pertama dengan sesuatu seperti persegi dan meletakkan lingkaran di sekelilingnya untuk mendapatkan tepian.