Java atan2-查找两点之间的角度(360度)
我有一个游戏,里面有一个Java atan2-查找两点之间的角度(360度),java,angle,java-2d,atan2,Java,Angle,Java 2d,Atan2,我有一个游戏,里面有一个玩家和一些敌人。这些敌人,就像玩家本身一样,可以发射子弹。但是子弹的角度并没有像预期的那样改变;新创建的子弹应该找到自己和玩家之间的角度,然后朝那个方向走——这必须在360°中完成 我遵循了,但我相信我做了一些不正确的事情 因为事情就是这样: 应该是这样的: 目前情况如下: 这是处理项目符号X和Y的代码部分: angle = Math.atan2(Game.getPlayerY(), Game.getPlayerX()) - Math.atan2(getY(), g
玩家
和一些敌人
。这些敌人,就像玩家本身一样,可以发射子弹。但是子弹的角度
并没有像预期的那样改变;新创建的子弹应该找到自己和玩家之间的角度,然后朝那个方向走——这必须在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);
angle=Math.atan2(Game.getPlayerY(),Game.getPlayerX())-Math.atan2(getY(),getX());
如果(角度<0)
角度+=2*Math.PI;
setX((getX()+(float)(Math.sin(angle))-Config.BulletSpeed);
setY((getY()+(float)(Math.cos(angle)))-Config.BulletSpeed);
我如何使子弹
进入某个角度?老实说,我认为你使用角度太复杂了。你似乎想做的就是以给定的速度沿着两个物体之间的向量移动一颗子弹
你要做的就是规范化向量。这两件事之间的线的长度由下式给出:
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);
我同意安迪的回答;您实际上只需要两点之间的规格化向量,而不是角度。但如果需要角度,只需在两点之间形成向量,然后使用:
然后,如果需要x或y步长,从源到目标,向量,然后只使用velocity.x
和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
我猜你指的是其中一组的cos(两组都使用sin)。我改为sin&cos,但这没有帮助,它只是以对角线的方式进行,如上图所示,其中一个应该使用cos,一个应该使用sin。但是我也不认为你计算的角度正确,它应该更像是atan2(y2-y1,x2-x1)
。如果你想尽快得到更好的帮助,请贴上一个or。它不应该像火箭一样跟踪目标。如果我在(23,23)处,子弹在(100,53)处产生,子弹应该在这两个位置之间直线移动,并尽可能长时间地持续。想象一支真枪,你把它指向某个地方然后开枪。如果目标移动,子弹就不会跟着移动。@IdontReallywolf那么为什么你的表达式包含Game.getPlayerX()
和getX()
(对于y)?我试图得到两点之间的角度:D,但显然我对这一点没有任何了解。只有两个简短的注释:1)如果震源是移动的,那么必须考虑子弹发射时震源的速度:速度。x=速度。x/量级*速度+速度_震源。x和y类似。这给出了子弹的总恒定速度,例如,当目标和震源以相同速度平行移动时,确保击中目标。2) 此外,normalize链接描述的是“法向量”,而不是规范化。一个更好的链接可能是
velocity.x += source_velocity.x
velocity.y += source_velocity.y