ОК, поэтому у меня есть игровое поле 512x512
, которое округляется, -32
становится 512
для x
и y
.
Теперь мне нужно вычислить угол между двумя объектами, у меня есть следующий код в качестве своего рода обходного пути, он работает в большинстве случаев времени, но иногда все равно не получается:
Shooter.getAngle = function(a, b) {
var ax = a.x;
var bx = b.x;
if (a.x < this.width / 4 && b.x > this.width - this.width / 4) {
ax += this.width;
} else if (a.x > this.width - this.width / 4 && b.x < this.width / 4) {
bx += this.width;
}
var ay = a.y;
var by = b.y;
if (a.y < this.height / 4 && b.x > this.height - this.height / 4) {
ay += this.height;
} else if (a.y > this.height - this.height / 4 && b.y < this.height / 4) {
by += this.height;
}
return this.wrapAngle(Math.atan2(ax - bx, ay - by) + Math.PI);
};
Я просто не могу понять, как проецировать a
на b
так, чтобы упаковка учитывалась правильно.
Если бы кто-то мог помочь, это было бы здорово, поскольку самонаводящиеся ракеты, которые летят на расстоянии от своей цели, не так уж и интересны.
Для пояснения, если игрок движется вправо, ракета должна следовать за ним по краю поля к левой стороне, как это сделал бы другой игрок.
РЕДАКТИРОВАТЬ:
Вот тестовая версия, примеры показывают, что она переносится правильно, но в случаях, когда ей не нужно переносить, она ломается:
function getAngle(a, b) {
var tx = a.x - b.x;
var ty = a.y - b.y;
// actual area goes from -16 to 512 due to the border space that's out of screen
tx = ((tx + 16) % (480 + 32)) - 16;
ty = ((ty + 16) % (480 + 32)) - 16;
var r = Math.atan2(ty, tx) * (180 / Math.PI);
// example
// |> b a >|
// a.x = 460
// b.x = 60
// missile should go over the right border
// tx = 400
// r = 0
// missile goes right, OK
// example2
// |< a b <|
// a.x = 60
// b.x = 460
// missile should go over the left border
// tx = -400
// r = 180
// missile goes left, OK
// example3
// | a >>>> b |
// a.x = 60
// b.x = 280
// missile should go right
// tx = -220
// r = 180
// missile goes left, WRONG
// example4
// | b <<<< a |
// a.x = 280
// b.x = 60
// missile should go left
// tx = 220
// r = 0
// missile goes right, WRONG
console.log(ty, tx);
console.log(r);
}
function Point(x, y) {
this.x = x;
this.y = y;
}
getAngle(new Point(460, 240), new Point(60, 240));
getAngle(new Point(60, 240), new Point(460, 240));
getAngle(new Point(60, 240), new Point(280, 240));
getAngle(new Point(280, 240), new Point(60, 240));
Кажется, единственный способ заставить его работать, это проверять случаи, когда a.x < width * 0.25
и b.x > width * 0.75
и т. Д., Но это глючит, по крайней мере в версии, которую я выложил выше: /