Saya sedang mengembangkan mesin game 2D kecil. Karakter memiliki metode cat yang saat ini melakukan hal berikut:
- Hitung posisi karakter baru sesuai kecepatannya, dll.
- Perbarui sel jaringan tabrakan **
- Gambar karakter di posisi baru
** Saya telah membuat collision grid untuk mengurangi jumlah pemeriksaan persimpangan
Sekarang algoritma dasar yang saya pikirkan untuk mendeteksi tabrakan adalah:
For Each Character
Check intersection with characters in surrounding 8 cells
Saya hanya bisa menempatkan kode ini dalam metode cat. Tapi inilah masalah yang saya antisipasi.
Misalkan dua karakter A dan B terletak di sel yang berdekatan di grid tabrakan. Sekarang sesuai dengan algoritma di atas dalam iterasi karakter A ia akan mendeteksi bahwa ia telah bertabrakan dengan B. Dalam iterasi untuk karakter B itu akan mendeteksi bahwa ia telah bertabrakan dengan A.
Tapi saya punya ide bahwa ketika A mendeteksi bahwa ia bertabrakan dengan B, itu harus memberitahu B bahwa ia bertabrakan dengan A. Ini akan menghemat banyak perbandingan ketika ada lebih dari 2 aktor bertabrakan. Tapi saya tidak yakin bagaimana menangani ini. Saya pikir alih-alih setiap karakter memeriksa tabrakannya, saya harus memeriksa tabrakan di dalam loop game.
Apakah pendekatan ini benar? Bagaimana Anda menangani masalah seperti ini? Saya memikirkan hal tabrakan sendiri. Apakah ada alternatif selain logika tabrakan?
Jawaban:
Pendekatan yang biasa untuk deteksi tabrakan adalah tidak memiliki A atau B mendeteksi tabrakan sendiri.
Sebagai gantinya, Anda pertama-tama memindahkan semua objek, kemudian memiliki sistem tumbukan yang terpisah mencari tumbukan antara semua pasangan objek, memberi tahu setiap objek tentang hal-hal yang telah bertabrakan, dan akhirnya membuat semua objek.
Jadi pada dasarnya, alih-alih melakukan "pindah, periksa tabrakan, gambar" di dalam fungsi Paint () Anda, Anda membagi "bergerak" dan "menggambar" menjadi fungsi terpisah yang Anda panggil secara terpisah ("langkah" pertama untuk setiap objek, lalu "gambar" untuk setiap objek). Dan di antara itu, periksa tabrakan.
Catatan lanjutan: Jika ada objek Anda yang bergerak sendiri sebagai reaksi terhadap tabrakan yang terdeteksi, maka Anda mungkin perlu mengulangi langkah "cari tabrakan di antara semua pasangan objek", seandainya respons tabrakan objek menyebabkan benturan lain.
sumber
Saya menjalankan loop untuk semua karakter saya di loop game seperti yang Anda katakan.
Cara saya melakukannya adalah dengan menyatakan pada masing-masing karakter saya, jadi jika A dan B bertabrakan saat A sedang memeriksa tabrakan A dan B diatur untuk memukul. pada awal loop B ia memeriksa untuk melihat apakah sudah terkena, jika id tidak menjalankan loop.
Saya meletakkan kode afeksi di loop sehingga setiap tindakan yang harus diambil pada B telah terjadi di loop A sehingga tidak boleh ada alasan untuk B untuk memeriksa karena ini akan mengacaukan hasil dari tabrakan, ini mungkin berbeda untuk Anda sekalipun .
sumber