Изображение карты выглядит так:
1 0 0 0 0 0
0 0 1 0 0 1
0 0 ??♀️ 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0
Единицы города, а в нулях ничего нет ??♀️ отмечает игрока.
Вы можете использовать теорему Пифагора , чтобы определить любой тип "столкновения". Допустим, игрок находится недалеко от двух городов (городов), и у каждого города есть своя собственная координата (X, Y), а также игрок. Нарисуйте треугольник в своем уме, где координаты Y для обоих мест создают одну сторону треугольника, а координаты X - другую сторону. Расстояние - это гипотенуза.
Предположим, что расстояние для столкновения (читай: обнаружение) равно 1. Если игрок находится на координате (3, 3), будет ли город с координатой (2, 4) достаточно близким? Одна сторона треугольника будет идти от 3 до 2, а другая от 3 до 4. Что такое гипотенуза, то есть расстояние?
ОК, это математика для детей, потому что вы, вероятно, можете увидеть это сразу, но давайте посмотрим на математику за ней.
let playerXCoordinate = 3;
let playerYCoordinate = 3;
let townXCoordinate = 2;
let townYCoordinate = 4;
let xDifference = playerXCoordinate - townXCoordinate; // 3 - 2
let yDifference = playerYCoordinate - townYCoordinate; // 3 - 4
// Pythagorean theorem
let hypotenuseAsDistance = Math.sqr( Math.pow(xDifference, 2) + Math.pow(yDifference, 2))
// √(1^2 + 1^2) = √1 = 1
let isWithinDistance = hypotenuseAsDistance <= 1 // true
Давайте возьмем другой пример. На этот раз с городом, расположенным по адресу (5, 4).
let xDifference = 3 - 5;
let yDifference = 3 - 4
let hypotenuseAsDistance = Math.sqr( Math.pow(xDifference, 2) + Math.pow(yDifference, 2))
// √((3-5)^2 + (3-4)^2) = √(2^2+1^2) = √(4+1) = √5 = 2.23606797749979
let isWithinDistance = hypotenuseAsDistance <= 1 // false
Однако более короткая версия доступна как часть объекта Math.
let xDifference = 3 - 5;
let yDifference = 3 - 4;
let hypotenuseAsDistance = Math.hypot(xDifference, yDifference);
Итак, что касается вашего примера, это будет что-то вроде этого.
let playerXPos = 3; // just an example
let playerXPos = 4; // just an example
let townArrLength = townLocations.x;
let detectionRange = 10;
let townXPos = 0;
let townYPos = 0;
let distance = 0;
for (let i = 0; i < townArrLength; i++) {
townXPos = townLocations.x[i];
townYPos = townLocations.y[i];
distance = Math.hypot(playerXPos - townXPos, playerYPos - townYPos);
if (distance <= detectionRange) {
// do something
}
}
Для получения дополнительной информации:
https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection