2012-04-04 67 views
1

我已经遍寻搜索,并且无法找到这个看似常见的问题的答案,令人惊讶。我目前面临的问题是检查球员是否面对敌人,如果是球员的视野范围(可调整),并且如果它在该范围内,则以最近的安全方向移动。检查两个物体是否面临海誓山盟

这里有一个画面: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就是范围。当然,我只是设法让船只向右转,所以除了检测只工作半圈之外,我也不能让敌人向右转。有任何想法吗?

回答

0

在您的代码中,您正在修改this.xVelocity两次而不是修改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) { 

顺便说一句:“playerview”应该从视图和ENEM球员场上的的最小值y的视野。

+0

谢谢,复制xVelocity是一个平庸的错误^^;然而,问题并不在于移动船,它正在得到正确的检测。 我确定Math.direction的工作原理是我用它来处理所有其他事情。我自己添加了原型;我知道这不是标准。 而且,在昏昏欲睡的状态中,我做了我想要的不好的话。我想要的是检查玩家是否面对敌人,给出一个小范围,如图中所示。你知道我会怎样做到吗?或者,如果为了保持角度在360度内而额外采取措施,还是会增加180个工作吗? – Ruffy 2012-04-04 11:48:45

+0

我编辑答案来绘制解决方案。 – Black 2012-04-04 12:38:54