我一直在搜索,并且令人惊讶地找不到这个看似常见的问题的答案。我目前面临的问题是检查玩家是否面对敌人,如果是,则在玩家视线的范围内(可调),如果在该范围内,则在最近的安全方向移动。
这是一张照片:D
那么,我该如何做到这一点?我有每个船舶对象的x
,y
和direction
。这是我最后一次失败的尝试,试图考虑玩家的方向与敌人相对于玩家的方向完全相差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 :(得分: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) {
顺便说一句:“玩家视角”应该是玩家视野和敌人视野的最小值。