1

令人惊讶的是,我已经搜索了所有内容,但找不到这个看似常见问题的答案。我目前面临的问题是检查玩家是否面对敌人,如果是在玩家视野的范围内(可调节),如果在该范围内,则朝最近的安全方向移动。

这是一张图片:D 例子

那么,我将如何做到这一点?我有每个船对象的x,ydirection, 。这是我最后一次失败的尝试,试图认为玩家的方向将与敌人相对于玩家的方向正好成 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将是范围。当然,我只是设法让船只向右旋转,所以除了探测只工作半圈外,我也无法让敌人向右转。有任何想法吗?

4

1 回答 1

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) {

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

于 2012-04-04T11:29:21.820 回答