İlk olarak, kod İşte. Bir açıklama gelecektir:
/*
* 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
};
}
};
Bu kodun sorunuzda gösterilen harita için kutudan çıkmayacağını unutmayın. Bunun nedeni, tek kiremitleri sola kaydırmış olmanızdır, oysa tek kiremit daha çok sağa kaydırılır ( Döşemeli harita düzenleyicide olduğu gibi ). Tek-çini durumunda döndürülen x değerini değiştirerek bunu kolayca çözebilmelisiniz.
açıklama
Bu, bu görevi yerine getirmek için biraz daha kaba kuvvetli bir yöntem gibi görünebilir, ancak en azından piksel mükemmel ve biraz daha esnek olma avantajına sahiptir.
Hile, haritayı tek bir aşamalı ızgara olarak değil, iki ızgara birbirinin üzerine bindirilmiş olarak görüntülemektedir. Tek sıra ızgara ve çift sıra ızgara var, ancak güzel bir diyagram oluşturabilmemiz için onlara kırmızı ve yeşil diyelim ...
Bu görüntünün sağında mor noktayla bir nokta işaretledim. Orijinal döşeme alanımızda bulmaya çalışacağımız örnek nokta budur.
Dünyadaki herhangi bir nokta hakkında fark edilmesi gereken şey, her zaman tam olarak iki bölgede - kırmızı bir ve yeşil bir - (Bir kenarda değilse, ancak muhtemelen pürüzlü kenar sınırında kırpılacaksınız) yatmasıdır. Bu bölgeleri bulalım ...
Şimdi iki bölgeden hangisinin doğru olduğunu seçmek için. Her zaman tam olarak bir cevap olacaktır.
Buradan biraz daha basit bir aritmetik yapabilir ve örnek noktamızdan iki bölgenin her merkez noktasına olan kare mesafesini hesaplayabiliriz. En yakın olan hangisi cevabımız olacak.
Ancak alternatif bir yol var. Her test bölgesi için karolarımızın tam şekliyle eşleşen bir bitmap örnekliyoruz. Bunu tek bir karo için yerel koordinatlara çevrilmiş bir noktada örnekliyoruz. Örneğimiz için şöyle görünecektir:
Soldaki yeşil bölgeyi kontrol edip bir vuruş (Siyah piksel) alıyoruz. Sağda kırmızı bölgeyi test edip bir özledik (Beyaz piksel). İkinci test elbette gereksizdir çünkü her zaman tam olarak biri veya diğeri olacaktır, asla ikisi de olmayacaktır.
Daha sonra tek kiremitte 1,1'de bir isabet aldığımız sonucuna varıyoruz. Bu koordinat, tek ve çift satırlar için farklı bir dönüşüm kullanarak orijinal döşeme koordinatlarına eşlemek için basit olmalıdır.
Bu yöntem ayrıca piksel testi bitmap'lerinde basit piksel başına özelliklere sahip olmanızı sağlar. Örneğin, beyaz fayans dışı, siyah bir hit, mavi su, kırmızı katı.