Tabrakan 2d yang cepat dan akurat

17

Saya sedang mengerjakan penembak topdown 2d, dan sekarang perlu melampaui sistem tabrakan kotak persegi panjang batas saya.

Saya memiliki level besar dengan banyak sprite berbeda, yang semuanya memiliki bentuk dan ukuran yang berbeda. Tekstur untuk sprite semua file png persegi dengan latar belakang transparan, jadi saya juga perlu cara untuk hanya memiliki tabrakan ketika pemain berjalan ke bagian berwarna dari tekstur, dan bukan latar belakang transparan.

Saya berencana untuk menangani tabrakan sebagai berikut:

  1. Periksa apakah ada sprite dalam jangkauan pemain
  2. Lakukan uji tabrakan kotak pembatas kotak
  3. Lakukan tabrakan yang akurat (Di mana saya butuh bantuan)

Saya tidak keberatan dengan teknik-teknik canggih, karena saya ingin mendapatkan yang benar dengan semua persyaratan saya dalam pikiran, tapi saya tidak yakin bagaimana cara mendekati ini. Apa teknik atau bahkan perpustakaan untuk dicoba. Saya tahu bahwa saya mungkin perlu membuat dan menyimpan beberapa bentuk yang secara akurat mewakili setiap sprite dikurangi latar belakang transparan.

Saya sudah membaca bahwa per pixel lambat, jadi mengingat tingkat besar saya dan jumlah objek saya tidak berpikir itu akan cocok. Saya juga telah melihat Box2d, tetapi belum dapat menemukan banyak dokumentasi, atau contoh bagaimana mendapatkannya dan berjalan dengan SFML.

Orang baru
sumber

Jawaban:

18
  1. Langkah satu, buat kisi dan perbarui untuk setiap objek yang bergerak.
  2. Hanya periksa tabrakan antara objek dalam kotak yang sama.
  3. Periksa apakah kotak pembatas objek bersinggungan (berisi persegi panjangnya).
  4. Periksa tabrakan piksel sempurna menggunakan versi garis resolusi rendah (lihat Fisika Game).
  5. Lakukan pemeriksaan normal terhadap penelusuran garis besar seperti yang dijelaskan dalam Fisika Game (Q 2)

Langkah 1:

Buat array grid 2d. Setiap objek tahu kotak mana yang ditempati oleh posisi x, y dan lebar serta tinggi. Jika suatu objek dipindahkan, ia membersihkan dirinya sendiri dari kotak lama dan memperbarui kotak baru yang ditempati.

Ini hanya membutuhkan O (n) total untuk n objek. Untuk objek tertentu O (1).

Langkah 2:

Jalankan semua pemeriksaan untuk tabrakan antara objek di kotak yang sama. Tidak perlu menjalankan tes untuk tabrakan antara objek di kotak yang berbeda. Objek dapat menempati hingga empat kotak jika ukurannya rata-rata. Ini berarti sangat sedikit cek.

Langkah 3:

Periksa persimpangan antara objek persegi panjang. Jika tidak ada persimpangan, hentikan.

Langkah 4:

Periksa tabrakan pixel sempurna antara garis-garis objek hanya di dalam area persimpangan. Itu harus cukup cepat. Jika tidak, buat array 2d-boolean res rendah dan periksa dulu, jika Anda menemukan tabrakan di sana, Anda hanya perlu memeriksa segmen kecil di array 2d res tinggi untuk menghemat waktu Anda yang berharga.

Baca ini untuk konsep tentang cara membagi dunia game Anda ke dalam kisi - kisi kotak:

Membuat sistem deteksi tabrakan yang efisien

Baca ini untuk intuisi tentang cara mendeteksi tabrakan piksel sempurna .

Fisika permainan / Deteksi Tabrakan 2D AS3

Anda dapat meningkatkan kinerja secara signifikan:

  1. Menyimpan versi garis resolusi rendah (1/16) untuk diperiksa terlebih dahulu.

  2. Hanya memeriksa di area di mana kedua rect berpotongan.

  3. dengan membagi garis secara kasar menjadi segmen, dan hanya memeriksa tabrakan antar segmen terlebih dahulu.

Silakan berkomentar dan saya akan uraikan.

periksa di area persimpangan

serigala
sumber
1
Seperti kata Arthur, ganti langkah Anda 1. dan 2. dengan kisi-kisi, dan untuk deteksi tabrakan yang akurat, Anda dapat menggunakan versi resolusi rendah dari gambar Anda.
Markus von Broady
1
Dan jika Anda benar-benar membutuhkan, Anda juga dapat menggunakan teknik serupa untuk jawaban saya di sini: gamedev.stackexchange.com/questions/38481/…
Markus von Broady
Markus menunjukkan ide yang bagus. Anda harus menggunakan array 2d-boolean atau array 1d yang diperlakukan sebagai 2d dan Anda bisa menyimpan 1/2 1/4 1/8 versi rendah dari array itu untuk mempercepat. Ini mungkin tidak diperlukan karena perhitungan pada array 2d-boolean sangat cepat. Ini masih merupakan alat yang berguna untuk dimiliki.
wolfdawn
Jika pemain sepenuhnya terkandung di dalam satu kotak di kotak, Anda hanya dapat memeriksa terhadap objek di kotak itu. Pemain bisa berada di empat kotak yang berdekatan sekaligus. Apakah itu yang Anda maksud? Jika Anda memaksudkan persimpangan antara persegi panjang, ya, Anda hanya perlu memeriksa tabrakan jika mereka berpotongan.
wolfdawn
1
Saya harap pembaruan ini membantu menjernihkan semuanya. Setelah beberapa kode ditulis, Anda dapat mempostingnya dalam ulasan kode dan menautkan kami dengan komentar. codereview.stackexchange.com
wolfdawn