atan2 - 找到两点之间的角度(360度)

问题描述 投票:1回答:2

我有一个游戏,有一个Player和一些enemies。这些敌人,就像玩家本身一样,可以射击bullets。但子弹的angle并没有像预期的那样改变;新创建的子弹应该找到自己和玩家之间的角度,然后朝这个方向前进 - 这必须在360°完成。

我跟着this answer,但我相信我做错了什么。

因为这是发生的事情: enter image description here

这应该是这样的: enter image description here

目前它只是这样: enter image description here

这是负责子弹X&Y的代码部分:

angle = Math.atan2(Game.getPlayerY(), Game.getPlayerX()) - Math.atan2(getY(), getX());
if (angle < 0) 
    angle += 2 * Math.PI;
setX((getX()+(float)(Math.sin(angle)))-Config.BulletSpeed);
setY((getY()+(float)(Math.cos(angle)))-Config.BulletSpeed);

如何使Bullets以某个角度前进?

java angle java-2d atan2
2个回答
1
投票

老实说,我认为你使用角度过于复杂。您似乎想要做的就是以给定的速度沿着两个对象之间的向量移动子弹。

您需要做的就是标准化矢量。两件事之间的界限长度由下式给出:

double dx = Game.getPlayerX() - getX();
double dy = Game.getPlayerY() - getY();
double len = Math.hypot(dx, dy);

因此,您可以使用它来计算子弹速度的比例因子:

double s = Config.BulletSpeed / len;

然后在表达式中使用它来更新x和y:

setX((getX()+dx*s);
setY((getY()+dy*s);

1
投票

我同意安迪的回答;你真的只需要两点之间的归一化向量,而不是角度。但是如果你需要一个角度,你只需在两点之间形成向量,然后使用Math.atan2

let velocity = new Vector(target.x - source.x, target.y - source.y);
let angle = Math.atan2(velocity.y, velocity.x);

然后,如果你需要x或y步骤,从源到目标,normalize向量,然后只需使用velocity.xvelocity.y

// normalize
let magnitude = Math.sqrt(velocity.x*velocity.x + velocity.y*velocity.y);  // distance formula for length of vector
velocity.x /= magnitude;
velocity.y /= magnitude;

// scaled to speed you want
velocity.x *= SPEED;
velocity.y *= SPEED;

您不需要从向量派生的角度派生向量。

编辑:正如烟草在评论中指出的,要添加逼真的触摸,请将源速度添加到最终速度:

velocity.x += source_velocity.x
velocity.y += source_velocity.y
© www.soinside.com 2019 - 2024. All rights reserved.