Saya sedang menulis sebuah game 2D isometrik dan saya mengalami kesulitan mencari di mana ubin kursornya. Ini gambarnya:
di mana xs dan ys adalah koordinat layar (piksel), xt dan yt adalah koordinat ubin, W dan H masing-masing adalah lebar ubin dan tinggi ubin dalam piksel. Notasi saya untuk koordinat adalah (y, x) yang mungkin membingungkan, maaf soal itu.
Sejauh ini yang terbaik yang bisa saya pikirkan adalah:
int xtemp = xs / (W / 2);
int ytemp = ys / (H / 2);
int xt = (xs - ys) / 2;
int yt = ytemp + xt;
Ini tampaknya hampir benar tetapi memberi saya hasil yang sangat tidak tepat, membuatnya sulit untuk memilih ubin tertentu, atau kadang-kadang memilih ubin di sebelah yang saya coba klik. Saya tidak mengerti mengapa dan saya ingin jika seseorang dapat membantu saya memahami logika di balik ini.
Terima kasih!
Saya memiliki masalah yang sama untuk permainan yang saya tulis. Saya membayangkan bahwa masalah ini akan berbeda berdasarkan pada bagaimana tepatnya Anda menerapkan sistem isometrik Anda, tetapi saya akan menjelaskan bagaimana saya memecahkan masalah tersebut.
Saya pertama kali mulai dengan fungsi tile_to_screen saya. (Saya berasumsi itulah bagaimana Anda menempatkan ubin di lokasi yang tepat di tempat pertama.) Fungsi ini memiliki persamaan untuk menghitung screen_x dan screen_y. Milik saya terlihat seperti ini (python):
Saya mengambil dua persamaan itu dan membuatnya menjadi sistem persamaan linear. Selesaikan sistem persamaan ini dalam metode apa pun yang Anda pilih. (Saya menggunakan metode rref. Juga, beberapa kalkulator grafik dapat menyelesaikan masalah ini.)
Persamaan akhir terlihat seperti ini:
Seperti yang Anda lihat, ini tidak sederhana seperti persamaan awal. Tapi itu bekerja dengan baik untuk game yang saya buat. Syukurlah untuk aljabar linier!
Memperbarui
Setelah menulis kelas Point sederhana dengan berbagai operator, saya menyederhanakan jawaban ini sebagai berikut:
sumber
Anda menggunakan sistem koordinat yang baik. Hal-hal menjadi jauh lebih rumit jika Anda menggunakan kolom terhuyung.
Salah satu cara untuk memikirkan masalah ini adalah Anda memiliki fungsi untuk mengubah (xt, yt) menjadi (xs, ys). Saya akan mengikuti jawaban Thane dan menyebutnya
map_to_screen
.Anda ingin kebalikan dari fungsi ini. Kita bisa menyebutnya
screen_to_map
. Fungsi inverses memiliki properti ini:Keduanya adalah hal yang baik untuk unit test setelah Anda memiliki kedua fungsi tertulis Bagaimana Anda menulis kebalikannya? Tidak semua fungsi memiliki invers tetapi dalam kasus ini:
Pastikan untuk menguji bahwa fungsi terbalik + asli memberikan jawaban yang Anda mulai. Thane's melewati kedua tes, jika Anda mengambil
+ TILE_HEIGHT/2
render offset. Ketika saya memecahkan aljabar, saya menemukan:yang saya yakini sama dengan milik Thane
screen_to_map
.Fungsi ini akan mengubah koordinat mouse menjadi float; gunakan
floor
untuk mengubahnya menjadi koordinat ubin integer.sumber