首页 > 解决方案 > atan2 - 找到两点之间的角度(360度)

问题描述

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

我遵循了这个答案,但我相信我做错了什么。

因为这就是发生的事情:
在此处输入图像描述

这应该是这样的:
在此处输入图像描述

目前它只是这样:
在此处输入图像描述

这是处理项目符号 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从某个角度出发?

标签: javaanglejava-2datan2

解决方案


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

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

然后,如果您需要 x 或 y 步骤,从源到目标,对向量进行归一化,然后只需使用velocity.xand velocity.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;

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

编辑:正如 Topaco 在评论中指出的那样,要添加逼真的触感,请将源速度添加到最终速度:

velocity.x += source_velocity.x
velocity.y += source_velocity.y

推荐阅读