Pertama, ini kodenya. Penjelasan akan mengikuti:
/*
* tw, th contain the tile width and height.
*
* hitTest contains a single channel taken from a tile-shaped hit-test
* image. Data was extracted with getImageData()
*/
worldToTilePos = function(x, y) {
var eventilex = Math.floor(x%tw);
var eventiley = Math.floor(y%th);
if (hitTest[eventilex + eventiley * tw] !== 255) {
/* On even tile */
return {
x: Math.floor((x + tw) / tw) - 1,
y: 2 * (Math.floor((y + th) / th) - 1)
};
} else {
/* On odd tile */
return {
x: Math.floor((x + tw / 2) / tw) - 1,
y: 2 * (Math.floor((y + th / 2) / th)) - 1
};
}
};
Perhatikan bahwa kode ini tidak akan berfungsi di luar kotak untuk peta yang ditunjukkan dalam pertanyaan Anda. Ini karena Anda memiliki ubin aneh diimbangi ke kiri, sedangkan ubin aneh lebih sering diimbangi ke kanan (Seperti halnya di editor peta ubin ). Anda harus dapat dengan mudah memperbaiki ini dengan mengubah nilai x yang dikembalikan dalam kasus odd-tile.
Penjelasan
Ini mungkin tampaknya menjadi metode yang sedikit lebih kasar dalam menyelesaikan tugas ini, tetapi setidaknya memiliki keuntungan menjadi pixel sempurna dan sedikit lebih fleksibel.
Kuncinya adalah dalam melihat peta bukan sebagai satu grid terhuyung-huyung, tetapi sebagai dua grid overlay satu sama lain. Ada grid baris ganjil dan grid genap, tapi mari kita sebut itu merah dan hijau sehingga kita bisa membuat diagram yang cantik ...
Perhatikan di sebelah kanan gambar itu saya telah menandai titik dengan titik ungu. Ini adalah titik contoh yang akan kami coba temukan di ruang ubin asli kami.
Hal yang perlu diperhatikan tentang titik mana pun di dunia adalah bahwa ia akan selalu terletak tepat di dua wilayah - yang merah dan yang hijau (Kecuali jika berada di tepi, tetapi Anda mungkin akan tetap berada di dalam batas tepi bergerigi pula). Ayo cari daerah itu ...
Sekarang untuk memilih yang mana dari dua daerah yang benar. Akan selalu ada satu jawaban.
Dari sini kita bisa melakukan aritmatika yang lebih sederhana dan menghitung jarak kuadrat dari titik sampel kami ke setiap titik pusat dari dua wilayah. Apapun yang terdekat adalah jawaban kami.
Namun ada cara alternatif. Untuk setiap wilayah pengujian, kami mencicipi bitmap yang cocok dengan bentuk persis ubin kami. Kami mencicipi pada titik yang diterjemahkan ke dalam koordinat lokal untuk ubin tunggal itu. Sebagai contoh kita akan terlihat seperti ini:
Di sebelah kiri kita periksa wilayah hijau dan mendapatkan hit (Black pixel). Di sebelah kanan kami menguji wilayah merah dan mendapatkan miss (White pixel). Tes kedua tentu saja berlebihan karena akan selalu tepat satu atau yang lain, tidak pernah keduanya.
Kami kemudian sampai pada kesimpulan bahwa kami memiliki hit di ubin aneh di 1,1. Koordinat ini harus sederhana untuk memetakan ke koordinat ubin asli menggunakan transformasi berbeda untuk baris ganjil dan genap.
Metode ini juga memungkinkan Anda untuk memiliki properti per-piksel sederhana pada bitmap pengujian piksel. Misal putih off-tile, hitam hit, biru air, merah solid.