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.