我正在開發一款2D戰鬥機,試圖設計敵方AI。人工智能非常簡單:將敵人轉向玩家,並向前飛行。我已成立了一個函數,則玩家的位置,並返回旋轉值的敵人應該儘量做到直接在他們飛行,如下:Actionscript 3 - 向另一個對象旋轉一個對象
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-360,旋轉返回-180到180.嘗試轉換'角度'到那個,這裏是超好的[解釋](http://gamedev.michaeljameswilliams.com/2009/ 4月25日/角度-在閃光/) – kaarto