java - 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
从某个角度出发?
解决方案
我同意安迪的回答;你真的只需要两点之间的归一化向量,而不是角度。但是如果你需要一个角度,你只需在两点之间形成向量,然后使用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.x
and 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
推荐阅读
- javascript - 过滤具有多个startWith和endsWith参数的数组
- php - 来自swift的JSON请求在php中显示空数组
- pandas - 在具有 MultiIndex 的 pandas 数据框中,如何使用组均值有条件地填充缺失值?
- python - Pandas apply() 在多处理中具有多个参数
- firefox - 如何使 Firefox 配置文件文件夹中的数据可用于扩展
- typescript - 将泛型与索引类型相结合
- javascript - 检查对象数组中的值匹配
- ios - Xamarin iOS 应用程序仅在发布模式下启动时崩溃。xamarin_initialize EXC_BAD_ACCESS
- python - Python FFmpeg:设置 VBR 和 BT.709
- azure-devops - Azure DevOps 托管代理 NuGet 依赖项版本行为