我正在开发一款二维飞机格斗游戏,试图设计敌人的AI。 AI非常简单:将敌人朝向玩家旋转,然后向前飞。我已经设置了一个函数来获取玩家的位置并返回敌人应该试图直接飞向他们的旋转值,如下所示:
public function getFlyAngle( player:PlaneGeneric ):Number
{
var playerX:Number = player.x;
var playerY:Number = player.y;
var xDistance:Number = playerX - x;
var yDistance:Number = playerY - y;
var slope:Number = yDistance/xDistance;
var angle:Number = 180/Math.PI * Math.atan(slope);
if(slope < 0 && yDistance < 0 ||
slope > 0 && yDistance > 0)
angle += 90;
else if(slope < 0 && yDistance > 0 ||
slope > 0 && yDistance < 0)
angle += 270;
return angle;
}
返回介于0(含)和360(独占)之间的值,表示直接在玩家平面飞行时rotateReference对象的旋转。
问题出在转向它的函数中:我只是将当前旋转与它需要飞行的角度进行比较,然后加上或减去我想要的固定量(9)以便带来当前的旋转旋转更接近所需的旋转。
public function turnTowardsPlayer( player:PlaneGeneric ):void
{
var angleToPlayer:Number = getFlyAngle( player );
var rotation360:Number = rotateReference.rotation;
if(rotateReference.rotation < 0)
rotation360 = (360 - (rotateReference.rotation * -1) );
trace("angleToPlayer: " + angleToPlayer + ", rotation360: " + rotation360);
if(angleToPlayer - 9 < rotation360 && rotation360 < angleToPlayer + 9);
else if(rotation360 > angleToPlayer)
{
rotateReference.rotation -= 9;
if(currentFrame == 1)
gotoAndStop (totalFrames);
else
prevFrame();
}
else if(rotation360 < angleToPlayer)
{
rotateReference.rotation += 9;
if(currentFrame == totalFrames)
gotoAndStop(1);
else
nextFrame();
}
当玩家从敌机飞过头顶时,问题出现了,并且angleToPlayer值突然从360跳到~0。因为0比平面的300°旋转值小得多,所以它开始旋转很长的路,试图再次匹配角度。
这似乎是一个简单的问题,但是我长期以来一直在抨击它,我觉得我需要一双新的眼睛来帮助我解决问题。
感谢您的时间。
答案 0 :(得分:0)
如果角度差大于180,则从中减去360.
示例...... 350 - 10 = 340(你知道超过半圈)所以减去... 340 - 360 = -20(你想要的实际差异)
希望有所帮助。请记住,您总是可以在最终位于相同位置的圆圈上添加或减去360 b / c!