Bagaimana cara menangani deteksi tabrakan sehingga benda cepat tidak diizinkan melewati dinding?


14

Saya membuat penembak pengendali sisi 2d, dan saya mengalami sedikit masalah dengan deteksi tabrakan untuk peluru. Segala sesuatu termasuk peluru adalah objek dengan poligon mereka sendiri / metode pembaruan.

Masalahnya adalah bahwa peluru melaju dengan cepat, dan pada 60 frame per detik (apa permainan berjalan) peluru akan sering melewati dinding - karena bergerak lebih dari lebar dinding selama dalam interval pembaruan - dan terus dengan senang karena poligon tidak akan pernah tumpang tindih.

Apa yang bisa saya lakukan? Satu-satunya hal yang dapat saya lakukan adalah menggambar garis dari posisi lama ke posisi baru dan melakukan deteksi tabrakan, tetapi gambar garis untuk deteksi tabrakan direkomendasikan oleh dokumentasi slick2d. Bagaimana saya bisa memecahkan masalah ini?


Bukan jawaban lengkap, begitu komentar. Saya tidak akan merekomendasikan menggambar garis secara grafis tetapi secara matematis Anda dapat melakukan ini, hanya persimpangan sinar-pesawat sederhana untuk melihat apakah tabrakan terjadi. Anda kemudian dapat melakukan deteksi langkah tetap yang lebih kecil untuk mendapatkan momen yang tepat (dan semua informasi yang menyertainya) ketika tabrakan terjadi tanpa harus berjalan pada tingkat yang lebih tinggi secara konstan seperti yang disarankan dalam jawaban. Lakukan pengecekan yang lebih murah dan habiskan waktu untuk mendapatkan jawaban yang tepat seperti yang Anda butuhkan.
James

Jawaban:


9

Pendekatan standar adalah (pilih satu):

  1. Tingkatkan lebar batas Anda DAN / ATAU kurangi kecepatan maksimum peluru Anda sehingga peluru itu tidak akan pernah bisa menembus dinding dalam satu pembaruan (minta sedikit Pythagoras untuk mengetahui jarak maxium / lebar batas minimum);
  2. Lakukan deteksi tabrakan terus menerus (CCD), biasanya dengan raycasting untuk mendeteksi tabrakan dengan permukaan linear (2) atau planar (3D) di depan objek bergerak. Ini lebih mahal, tetapi merupakan solusi yang lebih menyeluruh. Raycasting terhadap garis 2D cukup mendasar, tetapi Anda perlu mendefinisikan semua batas Anda sebagai poligon lurus dalam kasus ini.

Untuk itu, Anda bisa memodelkan peluru Anda sebagai sinar - jika itu cocok dengan tampilan & nuansa permainan Anda, seperti di left4kdead . Dengan begitu Anda tidak perlu memperkirakan peluru sebagai sinar, karena mereka sudah sinar. Dari sudut pandang penampilan, ini bisa terlihat baik jika Anda menggambar garis dengan titik yang lebih terang di ujung peluru, atau hanya menggambar garis sebagai gradien dari cahaya (ujung peluru) ke gelap (ujung ekor), memberikan penampilan gerakan.

Saya setuju bahwa dalam sebagian besar keadaan, menggunakan grafik untuk pendeteksian tabrakan agak salah arah, namun pendeteksian tabrakan pixel-sempurna persis seperti itu, dan merupakan teknik yang diterima. Saya kira itu semua tergantung pada apa yang ingin Anda capai, dan seberapa cepat. Jika Anda tidak membutuhkan permainan yang sangat cepat dengan banyak aksi + aksi, lakukanlah. Selain itu, lebih baik menggunakan salah satu pendekatan yang saya uraikan di atas.


Terima kasih atas jawaban yang bagus - idealnya saya ingin cepat dengan banyak benda bergerak. Alasan saya memperlakukan peluru sebagai benda fisik adalah agar benda tersebut dipengaruhi oleh gravitasi seperti benda lainnya (jadi turun sedikit, tergantung pada kecepatan peluru, dll.). Apakah ini bukan cara yang baik untuk melakukannya? Ini adalah game pertama saya, jadi saya masih mencari-cari praktik terbaik. Saya juga bisa menggunakan persamaan parabola, tapi saya tidak yakin bagaimana saya mengatur koefisien yang berkaitan dengan sudut kecepatan / arah peluru
Mala

3
Sepertinya terlalu banyak detail untuk peluru. Dalam kehidupan nyata, ketika Anda menembakkan peluru, Anda tidak akan pernah menemukan siput itu karena kekuatan ricochet, ketidakpastian sudut richochet, dll. Atau, itu hanya masuk ke tubuh dan tetap di sana (pohon, orang). Saya hanya ingin mereka menghilang atau memantul dan kemudian menghilang segera sesudahnya. Fokus pada gameplay inti Anda, jangan terlalu khawatir tentang detail kecil ini. Realisme paling baik difokuskan pada hal-hal yang penting.
Insinyur

Ya, saya kira saya bisa menggunakan garis lurus untuk peluru dan mungkin menemukan cara untuk membuat mereka melengkung ke bawah sedikit kemudian, jika tampaknya penting.
Mala

2
Jika kecepatan peluru tidak terlalu tinggi (yaitu tidak terlalu cepat sehingga Anda tidak akan bisa melihatnya melintasi layar), maka Anda bisa menerapkan gravitasi pada kecepatannya sambil memodelkan deteksi tabrakan menggunakan sinar sederhana. Pengguna tidak akan melihat bahwa peluru bergerak sebagai serangkaian garis lurus lagi daripada dia akan melihat bagaimana semua benda Anda yang lain juga melakukan hal yang sama. Untuk jalur peluru, menghitung dan menggambar jejak melengkung (spline) tidak sulit dan akan meningkatkan ilusi kurva halus ke lintasan peluru.
Sean Middleditch

3

Jika Anda ingin peluru Anda berperilaku seperti benda fisik yang realistis (mis. Peluru Anda lebih seperti panah atau batu dari ketapel daripada tembakan senjata), maka Anda juga dapat mencoba meningkatkan frekuensi pembaruan fisika Anda.

Jadi, sementara gim Anda dapat berjalan dengan 60 frame per detik, simulasi fisik Anda dapat berjalan pada 120 pembaruan per detik (di sini ada di mana-mana memperbaiki artikel cap waktu Anda yang menjelaskan pengaturan fisika yang baik yang dapat berjalan pada kecepatan yang berbeda dari render-loop).

Tentu saja, meningkatkan interval pembaruan pada mesin fisika akan menambah beban pada CPU. Jadi pendekatan ini hanya masuk akal jika proyektil Anda tidak bergerak sangat cepat (yang saya asumsikan karena Anda dapat mengatakan bahwa proyektil Anda bergerak melengkung).


Terima kasih! Saya secara efektif melakukan ini (juga menggunakan proyektil berbentuk garis) dan saya berharap itu tetap layak karena permainan menjadi lebih rumit
Mala
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.