Menerapkan lanskap perusak 2D (seperti Worms)

76

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?

William Casarin
sumber
7
Pertanyaan yang sangat bagus Cacing memiliki dua tantangan: daya hancur, dan juga gerakan pada sudut yang aneh.
ashes999
Saya pikir ini telah ditanyakan di sini beberapa kali
Wisnu
2
Vish, tautan terkait sepertinya tidak menyarankan itu.
Bebek Komunis
3
Anda dapat memeriksa bagaimana hal itu dilakukan di Hedgewars - itu klon cacing opensource.
GvS
Tidak cukup untuk menjawab, tetapi Anda mungkin ingin memeriksa Clonk juga. Ini adalah game 2D yang lebih lama oleh pengembang Jerman yang juga memiliki lanskap yang dapat dirusak, hingga piksel tertentu. Ini tidak dalam pengembangan lagi, tetapi kode sumber tersedia di bawah tautan di atas. Ada juga penerus open source OpenClonk, tetapi dari video itu tampaknya telah bergerak menjauh dari penghancuran pixel-sempurna dan berbelok ke arah Terraria-esque dengan jenis blok yang dapat dihancurkan.
Christian

Jawaban:

47

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 = blastRadiustitik 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.

bummzack
sumber
3
Menyimpan informasi tambahan adalah tabrakan-peta adalah ide yang bagus.
deft_code
6

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.

Phillip Parker
sumber
2
Saya pikir begitulah Hedgewars melakukannya. @ Bill, Anda bisa melihatnya, karena opensource.
Gastón
2
@ Gastón Peta di Hedgewars adalah semua gambar (PNG). Saya ragu mereka sedang dikonversi ke grafik vektor. Juga: menggunakan grafik vektor (splines, bezier, dll.) Jauh lebih berat dari CPU untuk hal-hal seperti deteksi tabrakan atau pengurangan bentuk. Melihat sumbernya adalah ide yang bagus (walaupun gaya pengkodeannya agak buruk :))
bummzack
4
Geometri komputasi seperti ini bisa SANGAT rumit, SANGAT cepat!
Adam Harte
Googling "box2d destructible terrain" sekarang memberikan beberapa demo vektor runnable.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
6

Gunakan geometri padat yang konstruktif

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.

deft_code
sumber
5

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.

Septagram
sumber
3
Dalam cacing Anda bisa menggali lubang melalui lanskap menggunakan obor. Tidak akan lucu jika terowongan itu akan runtuh karena ulatmu yang memegang obor. Itu juga mungkin untuk memiliki potongan-potongan lanskap "mengambang" di udara. Proposal Anda terdengar seperti ide yang menyenangkan, hanya saja tidak seperti game Worms.
bummzack
Itulah intinya, saya berpikir tentang variasi pada gameplay itu. Selain itu, beberapa bagian lanskap mungkin tidak dapat dihancurkan dan / atau ditangguhkan secara permanen di udara, yang memungkinkan Anda membuat blok "mengambang". Juga, beberapa bisa memiliki kekuatan konstan yang diterapkan pada mereka, menariknya ke atas atau ke samping, seperti apa yang dilakukan bola udara di Dunia Goo.
Septagram
Ini lucu karena saya benar-benar mempertimbangkan untuk membuat game seperti ini, itu akan menjadi twist yang menyenangkan bagi mekanik Worms. Gagasan tubuh kaku bitmap pasti akan menjadi topik yang menarik dalam dirinya sendiri, kompleksitasnya sedikit di atas kepala saya.
William Casarin
Nah, dalam hal ini bitmap benda tegar akan menjadi jalan keluar, sebagai gantinya, saya akan membuat lanskap sebagai kisi-kisi segitiga, terhubung secara elastis. Apakah Anda bermain dunia goo? Jika tidak, lihat tangkapan layar: vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg . Tidak, tidak, tidak, tidak, jika Anda tidak memainkannya, Anda benar-benar harus :) Sekarang bayangkan bahwa alih-alih bola goo setiap segitiga menampilkan bagian dari tekstur lansekap Anda, dan mereka jauh lebih kecil. Bermain-main dengan konstanta dan lanskap Anda akan cukup keras, atau lunak seperti jeli
Septagram
2
lihat mesin Fisik . Seluruh mesin didasarkan pada gagasan bahwa semuanya adalah kisi yang cacat / dapat dirusak (seperti menara goo).
deft_code
3

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.

PhilCK
sumber