Saya baru-baru ini mengambil monogame dan sedang mengerjakan permainan top down sederhana untuk memulai dan mempelajari dasar-dasarnya.
Saya mendapatkan pergerakan dan rotasi untuk mengikuti mouse, tetapi saya terjebak dengan tabrakan.
Apa yang ingin saya ketahui, pada dasarnya, adalah dua hal:
- Apa cara terbaik untuk menangani tabrakan? Saya tahu bahwa
Rectangle.Intersects(Rectangle1, Rectangle2)
mengembalikan persegi panjang yang tumpang tindih, tetapi, karena gerakan di atas ke bawah adalah pada sumbu x / y saya ingin tahu di mana tabrakan terjadi sehingga saya dapat membuat semacam "geser dinding" di mana pemain tidak mendapatkan terjebak di dinding.
Apakah memeriksa koordinat pemain x / y terhadap koordinat objek padat, lalu melempar pemain ke posisi sebelumnya jika ia memasuki batas objek padat benar-benar pendekatan terbaik? Apa yang kamu sarankan? - Apa cara terbaik untuk menerapkan tabrakan ke semua padatan, npc, dll.? Saat ini saya sedang berpikir untuk membuat
gameObject
kelas dimana semua objek akan mewarisi dan hanya menangani tabrakan di sana.
Terima kasih telah membaca dan berharap seseorang dapat memberi saya beberapa tips.
xna
c#
collision-detection
collision-resolution
monogame
Eliah John
sumber
sumber
Jawaban:
Umumnya cara sebagian besar mesin fisika menangani masalah ini adalah dengan memisahkan objek yang berpotongan .
Jadi jika objek Anda diwakili oleh persegi panjang (juga dikenal sebagai "Axis Aligned Bounding Boxes"), dan mereka bertabrakan pada bingkai tertentu seperti:
Anda kemudian akan mengukur jumlah interpenetrasi pada setiap sumbu. Kemudian pilih sumbu dengan jumlah interpenetrasi terkecil, dan pisahkan objek di sepanjang sumbu itu.
Anda kemudian akan mendaftarkan ini sebagai "tabrakan" dan menerapkan dinamika yang sesuai.
Misalnya, jika Anda ingin meluncur di sepanjang dinding, Anda hanya perlu nol-kecepatan pada sumbu yang Anda pisahkan (sumbu X, pada ilustrasi di atas), meninggalkan kecepatan pada sumbu lain saja.
Tapi Anda juga bisa menerapkan gesekan, atau membuat benda memantul.
Berikut ini adalah tutorial interaktif luar biasa yang menunjukkan cara melakukan ini dengan lebih detail.
Meskipun, jika Anda akan pergi jauh ke jalan ini (lebih dari tabrakan AABB sederhana), Anda mungkin ingin mempertimbangkan untuk menggunakan mesin yang ada seperti Farseer Physics .
Akhirnya, catatan implementasi (jika Anda tidak menggunakan rute Farseer):
Rectangle
menggunakanint
nilai-nilai, yang sebenarnya tidak tepat untuk melakukan fisika dalam banyak kasus. Pertimbangkan untuk membuatAABB
kelas sendiri yang menggunakan kelasfloat
.Pertanyaan kedua Anda dijawab dengan baik oleh jawaban lama saya tentang arsitektur game di sini , jadi saya tidak akan mengulanginya di sini.
sumber
1: Saya telah bekerja pada permainan aksi top-down yang relatif sederhana juga, dan setelah seminggu (-s?) Perjuangan, saya akhirnya menggunakan semacam pendekatan langkah-demi-langkah untuk mendeteksi dan merespons tabrakan. Alasan utama adalah bahwa menggunakan jumlah interpenetrasi terpendek akan dalam beberapa kasus menghasilkan "teleportasi" ke posisi baru bahwa objek bergerak tidak di sebelumnya.
jadi, ketika suatu objek ingin bergerak,
pendekatan ini keduanya memastikan bahwa objek "memantul" kembali untuk memperbaiki posisi sebelumnya dan memungkinkan untuk meluncur ke dinding, objek, apa pun.
2: Saya sendiri menggunakan kelas tabrakan statis yang dapat digunakan oleh apa pun. ia memegang metode deteksi tabrakan dan penyesuaian vektor, yang bisa disebut dengan apa saja. apakah metode ini dipanggil dari kelas game "master" atau oleh beberapa objek subclass tidak terlalu penting dalam kasus saya, karena kelas collision membuat daftar baru setiap frame untuk semua persegi panjang objek bergerak yang bersinggungan dengannya. persegi panjang ini mungkin berasal dari ubin, dekorasi, NPC, apa pun yang memiliki batas dan dapat disatukan, pada dasarnya. ini berarti bahwa kebutuhan mendasar untuk semua objek game yang dapat collidable adalah memiliki batas persegi panjang. jika mereka memilikinya, kelas tabrakan akan menangani sisanya.
Semoga ini bisa dimengerti.
sumber
1: Saya berhasil menggunakan teknik untuk menyelesaikan ini: menggunakan kecepatan dan posisi Anda dapat menemukan tabrakan, dan beralih kembali sampai posisinya sangat dekat dengan titik tabrakan yang tepat.
Ini bukan bagian dari jawaban untuk pertanyaan pertama Anda, tetapi jika Anda memiliki banyak objek yang dapat saling bertabrakan, Anda harus menggunakan quadtrees untuk meningkatkan kinerja. Ada tutorial yang sangat bagus dengan banyak contoh di sini .
2: Saya selalu merekomendasikan Entity-Systems .
sumber