我目前正在为我的APCS年终项目编写网络游戏。我正在尝试在充满城镇坐标的数组中找到最接近的数字。由于它是坐标,因此我需要对X和Y数组执行此操作。例如,x = [10,20,30],y = [20,10,23],第一个城镇将位于[10,20]。但是由于要精确找到这个确切位置非常困难,因此您可以进入周围有10个坐标的区域,以发现城镇。
这是我当前的代码:
function setTowns() {
for(i = 0; i < 9000; i++){
townLocations.x.push(random(-1000, 1000));
townLocations.y.push(random(-1000, 1000));
}
}
function checkTown() {
var townX = townLocations.x;
var townY = townLocations.y;
for(i = 0; i < townX.length; i++){
if((Math.abs(townX[i]) - Math.abs(bb.location.x)) < 10){
console.log(townX[i]);
for(i = 0; i < townY.length; i++){
if((Math.abs(townY[i]) - Math.abs(bb.location.y)) < 10){
console.log(townY[i]);
return true;
}
else {
return false;
}
}
}
}
}
每次玩家移动时都会调用checkTown()。
答案 0 :(得分:0)
想象这样的地图:
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