代码之家  ›  专栏  ›  技术社区  ›  Feelsbadman

ATAN2-查找两点之间的角度(360度)

  •  1
  • Feelsbadman  · 技术社区  · 8 年前

    我有一个游戏 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 从某个角度出发?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Andy Turner    8 年前

    老实说,我觉得你用角度太复杂了。你似乎想做的就是以给定的速度沿着两个物体之间的矢量移动一个子弹。

    你要做的就是规范化向量。这两件事之间的直线长度由下式给出:

    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);
    
        2
  •  1
  •   clabe45    8 年前

    我同意安迪的回答;你实际上只需要两点之间的标准化向量,而不是角度。但是如果你 需要 一个角度,你只需要在两点之间形成向量,然后使用 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.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
    
    推荐文章