【问题标题】:atan2 - find angle between two points (360deg)atan2 - 找到两点之间的角度(360度)
【发布时间】:2018-09-15 11:02:58
【问题描述】:

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

我关注了this answer,但我认为我做错了什么。

因为会发生这种情况:

应该是这样的:

目前只有这样:

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

【问题讨论】:

  • 我猜你的意思是 cos 用于其中一组(你对两个都使用 sin)。
  • 我改成了 sin & cos 但这并没有帮助,它只是以对角线的方式进行,如上图所示
  • 其中一个应该使用cos,一个应该使用sin。但我认为你也没有正确计算角度,它应该更像atan2(y2-y1, x2-x1)
  • 运气不好
  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example

标签: java angle java-2d atan2


【解决方案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);

【讨论】:

  • 它不应该像火箭一样跟随玩家跟随目标。如果我在 (23, 23) 并且子弹是在 (100, 53) 创建的,子弹应该在这两者之间直线行进,并尽可能长时间地继续。想象一把真正的枪,你将它指向某个地方并射击它。如果目标移动,子弹不会跟随它。
  • @IdontReallywolf 那么为什么你的表达涉及Game.getPlayerX()getX()(和y)?
  • 我试图在两点之间获得那个角度:D 但显然我对此知之甚少
【解决方案2】:

我同意安迪的回答;你真的只需要两点之间的归一化向量,而不是角度。但是如果你需要一个角度,你只需在两点之间形成向量,然后使用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;

您不需要从从向量导出的角度导出向量。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多