Saya sedang menulis game XNA 2d dari atas ke bawah. Sejak pertama kali saya mencoba menulis fisika dan tabrakan sendiri untuk mempelajarinya.
Setiap kali karakter sprite pemain saya mencoba untuk pindah ke posisi di mana batas-batasnya bersinggungan dengan tepi dinding, saya menemukan sudut pantulan (sudut insiden = sudut pantulan) dan saya membuat pemain memantul dari dinding dan menghindari tabrakan .
Saya mengalami kesulitan mencari tahu bagaimana menghadapi situasi sprite saya berpotongan dengan dua tepi dinding secara bersamaan meskipun misalnya menyentuh sudut.
Kode saya saat ini memberi tahu saya bahwa dua tepi dinding telah berpotongan tetapi tidak pada tepi mana yang akan mengenai pertama dan oleh karena itu tepi mana yang terpental.
Apa tes matematika untuk memilih sisi mana yang harus dipantulkan? Jelas terlihat ketika melihatnya, tetapi saya berjuang untuk mengetahui tes matematika untuk itu.
Jawaban:
Jika Anda menghitung seberapa jauh ke
Wall
dalamPlayer Sprite
telah pindah, Anda mungkin bisa mendasarkan pada delta x dan koordinat y dari sudut-sudut yang berpotongan. Saya harap itu masuk akal, saya tidak bisa memikirkan cara yang lebih baik untuk mengatakannya.Jadi, misalnya, jika Anda melihat diagram Anda. Ambil
x
nilai sudut kiri atasPlayer Sprite
(setelah pindah), dan kurangix
nilai sudut kanan bawahWall
. Lakukan hal yang sama untuky
nilai - nilai dan kemudian lihat mana yang lebih besar. Kuncinya adalah bahwa jika satu lebih besar dari yang lain,Player Sprite
mungkin berpotongan di sisi itu.Berikut adalah contoh gambar (ini adalah subbagian dari gambar Anda dengan baris saya sendiri ditambahkan):
Sekarang, Anda lihat di sini bahwa garis biru lebih besar dari garis hijau. Dalam hal ini garis biru juga berada di sisi yang
Player Sprite
diharapkan memantul.Jika kedua nilai sama, mereka menekan tepat di sudut.
Sekarang, ada sedikit masalah dengan melakukannya dengan cara ini. Jika
Player Sprite
perjalanan sangat cepat atau tabrakan sangat dekat dengan sudut, ada kemungkinan bahwaPlayer Sprite
mungkin pergi lebih jauh keWall
arah yang salah. Dalam hal ini Anda mungkin harus memeriksa kecepatan objek bergerak. (Lihat jawaban Nathan Reed .)Catatan: Saya pikir saya pada dasarnya mencoba untuk menggambarkan deteksi tabrakan SAT yang @Blau sebutkan, tapi saya sudah menghabiskan waktu yang lama untuk menulis ini jadi saya akan mempostingnya. Semoga ini bisa membantu Anda.
sumber
Perpindahan minimum tidak selalu memberikan jawaban yang tepat untuk sisi mana yang pertama kali mengenai. Pertimbangkan kasus ini:
Ini terjadi ketika kecepatannya cukup tinggi sehingga blok bergerak agak jauh selama satu frame. Untuk mendeteksi dengan benar tepi mana yang pertama kali mengenai, Anda harus mengatur persamaan linier untuk dipecahkan pada saat tabrakan dengan masing-masing tepi. Dalam hal ini dijelaskan dalam diagram OP, persamaan yang relevan adalah:
(Ini mengasumsikan sistem koordinat X-kanan, Y-up.) Secara umum, Anda harus menggunakan tanda-tanda pemain. Komponen X dan Y tingkat untuk menentukan pasangan tepi mana yang perlu diuji. Bagaimanapun, setelah Anda menghitung waktu tumbukan, yang lebih awal dari keduanya adalah tumbukan yang perlu Anda tangani.
sumber
Anda membutuhkan SAT Collision Detection
Pada dasarnya Anda perlu mencari vektor perpindahan minimum yang dikurangi ke salah satu objek agar tidak berpotongan.
Dalam gambar Anda, perpindahan minimum adalah segmen oranye.
sumber
Menjawab pertanyaan serupa di sini
Anda mungkin ingin mempertimbangkan untuk memeriksa posisi sebelumnya-
Misalnya: jika sisi kiri Anda sebelumnya di sebelah kanan sisi kanan mereka dan Anda bertabrakan, maka telah terjadi tabrakan di sebelah kanan.
Jika Anda melakukan ini, cukup atasi tabrakan sumbu y, periksa apakah Anda bertabrakan dengan sesuatu, lalu atasi tabrakan sumbu x.
sumber