检查两个物体是否彼此面对

时间:2012-04-04 10:03:46

标签: javascript direction

我一直在搜索,并且令人惊讶地找不到这个看似常见的问题的答案。我目前面临的问题是检查玩家是否面对敌人,如果是,则在玩家视线的范围内(可调),如果在该范围内,则在最近的安全方向移动。

这是一张照片:D Example

那么,我该如何做到这一点?我有每个船舶对象的xydirection。这是我最后一次失败的尝试,试图考虑玩家的方向与敌人相对于玩家的方向完全相差180度。

var direction=Math.direction(this.x,this.y,player.x,player.y,1),
    playerview=Math.abs(direction)-Math.abs(player.direction-180)
if(Math.abs(playerview)<10) {
    console.log('in view')
    this.xVelocity+=AI.speed*Math.sin(playerview*Math.PI/180)
    this.xVelocity+=AI.speed*Math.cos(playerview*Math.PI/180)
    }

在此示例中,10将是范围。当然,我只是设法让船只向右旋转,所以除了检测只能在半圈上工作,我也不能让敌人走到右边。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在您的代码中,您正在修改此.VVelocity两次而不是修改this.yVelocity

我猜,Math.direction不在JavaScript / ECMA标准中。你确定,你正确使用它?考虑Math.atan2

此外,您应该提供“面向对方”的定义

如果它“看到对方”,那么您在“视野中”的评论会产生误导。


但主要问题是:

Math.abs(angleInDegrees) 修改角度

建立角度绝对值的正确方法是:

while (angleInDegrees < 0) 
{   
   angleInDegrees += 360;
}

// If necessary, add this too:
while (angleInDegrees >= 360)
{
   angleInDegrees -= 360;
}

-10和350相同,-10和10相隔20度。

有关进一步说明,请拨打normalizeAngle

上方的代码

(注意:对于巨大的值,循环可能会运行很长甚至是永久。如果可能出现这样的值,则应该检查它。)


以下应该可以解决问题:

playerview = normalizeAngle(direction - player.direction - 180)
if (playerview < range || playerview > 360-range) {

顺便说一句:“玩家视角”应该是玩家视野和敌人视野的最小值。