Apakah ada cara yang terkenal (atau mungkin sedikit kode yang dapat digunakan kembali) untuk deteksi tabrakan pixel-sempurna di XNA?
Saya berasumsi ini juga akan menggunakan poligon (kotak / segitiga / lingkaran) untuk lulus pertama, tes cepat untuk tabrakan, dan jika tes itu menunjukkan tabrakan, maka akan mencari tabrakan per-pixel.
Ini bisa rumit, karena kita harus memperhitungkan skala, rotasi, dan transparansi.
PERINGATAN: Jika Anda menggunakan kode sampel dari tautan dari jawaban di bawah ini, ketahuilah bahwa penskalaan matriks dikomentari untuk alasan yang baik. Anda tidak perlu menghapus tanda komentar untuk mendapatkan skala untuk bekerja.
xna
2d
collision-detection
ashes999
sumber
sumber
Jawaban:
Saya melihat bahwa Anda menandai pertanyaan sebagai 2d, jadi saya akan melanjutkan dan membuang kode saya:
Sunting : Walaupun kode ini hampir jelas, saya merasa tidak enak karena tidak memiliki komentar, jadi saya menambahkan beberapa;) Saya juga menyingkirkan operasi bitwise karena pada dasarnya melakukan apa yang properti Color.A lakukan dengan cara yang lebih rumit ;)
sumber
Bounds
?CollidesWith(Sprite other, bool calcPerPixel = true);
:)Di App Hub, ada sampel sangat lama yang memandu Anda melalui deteksi tabrakan 2D dari kotak ikatan sederhana hingga pengujian piksel pada sprite yang diputar dan diskalakan. Telah sepenuhnya diperbarui ke 4.0. Seluruh seri ini layak dibaca jika Anda baru dalam topik ini.
http://xbox.create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel_transformed
Saya juga menemukan pendekatan Riemer Grootjans menarik dalam game penembak 2D-nya. http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php
(Butuh waktu agak lama baginya untuk sampai ke sana ... http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Coll_Detection_Overview.php ... tetapi Anda mungkin ingin mengikuti untuk melihat masalah dia memecahkan)
Tapi saya memperingatkan Anda bahwa sampel Riemers bukan XNA 4.0 dan Anda mungkin harus melakukan sedikit pekerjaan untuk membuatnya berjalan. Namun itu bukan pekerjaan yang sulit atau misterius.
sumber
Saya merekomendasikan membuat peta tabrakan hitam dan putih. Memprogramnya sehingga piksel hitam adalah titik tabrakan. Berikan karakter tabrakan peta juga; Saat memproses peta, gunakan algoritma yang akan mengubah kotak besar piksel hitam menjadi persegi panjang tabrakan. Simpan data persegi panjang ini dalam sebuah array. Anda dapat menggunakan fungsi berpotongan Rectangle untuk mencari tabrakan. Anda juga dapat mengubah peta tabrakan dengan tekstur.
Ini sangat mirip dengan menggunakan tabrakan matriks tetapi lebih maju dan Anda dapat mengubahnya! pertimbangkan membangun alat penghasil peta tabrakan jika Anda membutuhkannya. Jika Anda membuatnya berfungsi, silakan bagikan kodenya dengan yang lain!
sumber