Saya mengalami beberapa masalah dengan mencoba mendeteksi tabrakan dua ubin isometrik.
Saya telah mencoba merencanakan garis antara setiap titik di ubin dan kemudian memeriksa penyadapan garis namun itu tidak berhasil (mungkin karena formula yang salah)
Setelah melihat ke dalam untuk sementara waktu hari ini, saya yakin saya terlalu memikirkannya dan pasti ada cara yang lebih mudah.
Saya tidak mencari kode hanya beberapa saran tentang cara terbaik untuk mencapai deteksi tumpang tindih
xna
c#
collision-detection
Chris Crew
sumber
sumber
Jawaban:
Saya akan langsung mengatakan bahwa saya tidak tahu bagaimana menyelesaikan masalah yang telah Anda jelaskan dalam pertanyaan (deteksi tabrakan antara persegi panjang berbentuk genteng), tapi saya bisa memberi tahu Anda bagaimana orang lain telah memecahkannya di masa lalu :
Cara itu dilakukan di game lain adalah memisahkan dunia game dari dunia layar . Ketika Anda memulai, adalah umum untuk membayangkan mereka sebagai hal yang sama, tetapi kemudian mengarah ke masalah seperti yang Anda gambarkan.
Gagasan umum adalah bahwa dunia game disimpan sepenuhnya dalam memori, di belakang layar, hanya angka, referensi, dan logika. Fakta bahwa Anda menggambar dunia gim dalam isometrik tidak relevan. Dunia gim Anda seharusnya tidak memiliki konsep isometrik, atau bujur sangkar, atau bahkan jika layar digambarkan sebagai 3D. Semua itu diurus ketika Anda menarik dunia game ke layar (alias dunia layar ). Dunia gim harus disimpan dan dipelihara dengan cara paling sederhana yang masuk akal untuk gim ini, dalam gim isometrik, Anda biasanya benar-benar mengabaikan fakta bahwa itu iso dan bukannya menyimpan posisi seolah-olah Anda menggunakan kisi yang selaras sumbu. Sebagian besar gim akan memiliki metode untuk mengonversi koordinat antara dua dunia, saya sebut milik saya
ScreenToWorld(x, y)
danWorldToScreen(x, y)
. Konversi sering dilakukan dengan Matriks matematika, tetapi dapat dicapai dengan cara lain. Anda akan menggunakan ScreenToWorld saat Anda menggunakan mouse, dan WorldToScreen saat Anda menggambar.Ada beberapa keuntungan untuk memisahkan dunia game dan dunia layar . Salah satu keuntungannya adalah bahwa deteksi tabrakan dan pergerakan semua terjadi di dunia gim, dan karena itu biasanya cukup lurus ke depan karena Anda tidak berurusan dengan kisi miring, atau koordinat miring, atau di mana layar berada, dll. Dalam kasus Anda , Anda akan berhadapan dengan persegi panjang dan kotak yang sejajar sumbu. Setelah dunia game telah diperbarui, maka Anda menggambar representasi dunia game ke layar, kata kunci: representasi. Pada awalnya mungkin terlihat kontra-intuitif, tetapi layar Anda hanyalah representasi dari apa yang terjadi di dunia game. Ini memungkinkan hal-hal seperti dedicated server dan terminal-like clients.
FreeCiv sebenarnya adalah contoh yang bagus dari semua hal ini. Anda dapat melihat dunia yang sama persis seperti: kotak Kotak Utara / Selatan, Isometrik, atau bahkan Hex. Setiap permainan yang Anda jalankan memiliki server khusus yang berjalan di latar belakang, bahkan untuk permainan pemain tunggal, oleh karena itu klien juga hanya port tampilan, tidak lebih.
Singkatnya: Memisahkan dunia game dan logika dari dunia layar menyederhanakan logika game, mengurangi penggabungan tampilan <-> game , dan pada gilirannya, membuat deteksi tabrakan antara ubin "iso" lebih mudah ditangani dan lebih mudah untuk divisualisasikan.
sumber
Jawaban John benar, tetapi saya akan mencoba menjelaskannya dengan cara yang berbeda:
Tidak ada deteksi tabrakan isometrik.
Deteksi tabrakan tidak peduli seperti apa proyeksi matriks / transformasi Anda. Deteksi tabrakan seharusnya tidak menjadi masalah jika Anda merender semuanya (lagipula, objek yang berada di luar layar masih bisa bertabrakan, bukan?)
Ini adalah pertanyaan yang lebih filosofis: Apakah pohon tumbang di hutan masih benar-benar bertabrakan dengan tanah ketika tidak ada orang di sana?
Kebijaksanaan konvensional akan mengatakan: Ya. Tidak masalah bagaimana Anda melihatnya. Benda-benda bertabrakan di ruang-dunia, bukan ruang-pandang.
sumber
Anda dapat mencoba mengalokasikan array piksel yang menyusun bitmap dari setiap nilai getRGB () dari setiap piksel individu. Daripada membandingkan nilai dengan pernyataan if sebagai batas ubin adalah nilai warna yang terpisah dari apa yang mewakili ubin (air, pasir, rumput). Itu untuk kisi isometrik dasar. Atau Anda dapat memiliki dua lapisan peta itu sendiri. Satu lapisan berisi semacam layar hijau yang menggambarkan garis besar setiap perwakilan dari objek bertabrakan dan lapisan lainnya adalah peta itu sendiri.
Anda tidak membuat susunan bitmap dari setiap piksel lapisan peta, alih-alih Anda ingin menghitung sekumpulan warna yang mewakili efek yang dimilikinya ketika sebuah objek bertabrakan / memotong batas nilai warna yang dipertahankan. Entah Anda ingin nilai menurun nilainya atau menambah kecepatan di mana objek bergerak. Setiap objek yang bergerak hanyalah duplikat memori yang disimpan di tempat yang berbeda.
Saya akan melihat tabrakan pixel sempurna dan pemahaman array bitmap. Setiap kotak adalah batas berisi data replikasi, seperti memori yang dicantumkan, setiap peristiwa dipicu tergantung pada di mana objek dirender di lokasi atau vektor. Setiap titik pada layar adalah pada bidang 2D saja bahwa kedalaman bayangan memberikan ilusi bahwa objek itu mewakili dirinya sebagai 3D. Transformasi bentuk dalam kemiringan memberi kesan objek pada sudut. Ada titik pusat di mana kamera menyajikannya melihat semua yang dilakukan di sekitar titik pusat ini bergerak menjauh dari itu mengurangi ukuran atau bergerak lebih dekat ke sana meningkatkan ukuran.
sumber