Я знайшов простий, альтернативний підхід, який використовує ту саму логіку, що і звичайний контрольний борт. Це створює ефект оснащення сітки з точками в центрі кожної плитки та в кожній вершині (шляхом створення більш жорсткої сітки та ігнорування чергувань).
Цей підхід добре підходить для таких ігор, як Catan, де гравці взаємодіють з плитками і вершинами, але не підходять для ігор, де гравці взаємодіють лише з плитками, оскільки він повертає, якій центральній точці або вершині координати є найближчими, а не якій шестикутній плитці координати знаходяться в межах.
Геометрія
Якщо розмістити точки в сітці зі стовпцями, що чверть ширини плитки, та рядками, які наполовину перевищують висоту плитки, ви отримаєте такий візерунок:
Якщо ви модифікуєте код, щоб пропустити кожну другу крапку у шаблоні шахи (пропустити if column % 2 + row % 2 == 1
), ви закінчите цей шаблон:
Впровадження
Маючи на увазі цю геометрію, ви можете створити 2D масив (так само, як і з квадратною сіткою), зберігаючи x, y
координати для кожної точки в сітці (з першої діаграми) - приблизно так:
points = []
for x in numberOfColumns
points.push([])
for y in numberOfRows
points[x].push({x: x * widthOfColumn, y: y * heightOfRow})
Примітка. Як правило, коли ви створюєте сітку навколо точок (а не розміщуєте крапки в самих точках), вам потрібно зрушити початок (віднявши половину ширини стовпця від x
і половину висоти рядка від y
).
Тепер, коли у вас є 2D масив (points
ініціалізований ), ви можете знайти найближчу точку до миші так само, як і на квадратній сітці, лише ігноруючи кожну іншу точку, щоб створити візерунок у другій схемі:
column, row = floor(mouse.x / columnWidth), floor(mouse.y / rowHeight)
point = null if column % 2 + row % 2 != 1 else points[column][row]
Це спрацює, але координати округляються до найближчої точки (або немає точки), на основі якої невидимий прямокутник знаходиться вказівнику. Вам дуже хочеться кругової зони навколо точки (тому діапазон оснащення рівний у кожному напрямку). Тепер, коли ви знаєте, який пункт перевірити, ви можете легко знайти відстань (використовуючи теорему Піфагора). Коло, що мається на увазі, все-таки повинен було б поміститися всередині оригінального обмежувального прямокутника, обмеживши його максимальний діаметр шириною стовпця (чверть ширини плитки), але це все ще досить велике, щоб добре працювати на практиці.