По-перше, ось код. Далі буде пояснення:
/*
* 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
};
}
};
Зауважте, що цей код не працюватиме з поля, яке відображається у вашому запитанні. Це відбувається тому, що у вас зсув непарних плиток ліворуч, тоді як непарна плитка зазвичай зміщена праворуч (Як це відбувається в редакторі кахельних карт ). Ви зможете легко виправити це, налаштувавши значення x, повернене у корпусі непарної плитки.
Пояснення
Це може здатися трохи більш жорстоким методом виконання цього завдання, але, принаймні, має перевагу бути піксельним ідеальним та трохи більш гнучким.
Хитрість полягає в тому, щоб переглядати карту не як одну шарувату сітку, а як дві сітки, накладені одна на одну. Є сітка непарних рядків і сітка парних рядків, але давайте назвемо їх червоно-зеленими, щоб ми могли створити гарну діаграму ...
Зверніть увагу, що праворуч від цього зображення я помітив крапку фіолетовою крапкою. Це приклад, який ми спробуємо знайти в нашому оригінальному просторі плитки.
Що варто помітити в будь-якій точці світу, це те, що вона завжди буде лежати в точно двох регіонах - червоній та зеленій (Якщо тільки вона не знаходиться на краю, але ви, швидше за все, будете вирізатись в межах зубчастої межі). Давайте знайдемо ці регіони ...
Тепер вибрати, який із двох регіонів є правильним. Завжди буде рівно одна відповідь.
Звідси ми могли б зробити кілька простіших арифметичних і проробити відстань у квадраті від нашої вибіркової точки до кожної центральної точки двох областей. Хто буде найближчим, буде нашою відповіддю.
Однак існує альтернативний спосіб. Для кожного тестового регіону ми робимо вибірку растрової карти, яка відповідає точній формі нашої плитки. Ми відбираємо його в точці, переведеній на локальні координати для цієї єдиної плитки. Для нашого прикладу це виглядало б приблизно так:
Ліворуч перевіряємо зелену область і отримуємо хіт (Чорний піксель). Праворуч ми перевіряємо червону область і отримуємо промах (Білий піксель). Другий тест, звичайно, є зайвим, оскільки завжди буде точно те чи інше, ніколи і те і інше.
Тоді ми приходимо до висновку, що ми потрапили в непарну плитку на рівні 1,1. Ця координата повинна бути простою для відображення вихідних координат плитки, використовуючи різні перетворення для непарних і парних рядків.
Цей метод також дозволяє мати прості властивості на піксель у растрових (іх) тестових пікселях. Напр. Білий - це плитка, чорний - хіт, синій - вода, червоний - твердий.