2011-11-03 86 views
1

我有这个问题:有这个敌人旋转到我的玩家。当用我的玩家“围绕”敌人时,我可以看到敌人正朝着我的玩家旋转。 然后敌人突然转过360度,再次面对我的玩家。我不知道为什么它会发生这种奇怪的360度转弯,但是每当我绕过敌人几秒时就会发生。请 - 有人可以帮我解决这个问题吗?我很欣赏我能得到的每一个提示,因为我不知道问题出在哪里。敌人旋转很奇怪

tempEnemy.dX = tempEnemy.x - player.x; 
tempEnemy.dY = tempEnemy.y - player.y; 

tempEnemy.rotateTo = toDegrees(getRadians(tempEnemy.dX, tempEnemy.dY)); 



if(tempEnemy.frame < 0) tempEnemy.frame += 360; 
if(tempEnemy.frame > 359) tempEnemy.frame -= 360; 


tempEnemy.trueRotation = int((tempEnemy.rotateTo - tempEnemy.frame)/tempEnemy.rotateSpeed); 

tempEnemy.vX += (player.x - tempEnemy.x)/tempEnemy._speed; 
tempEnemy.vY += (player.y - tempEnemy.y)/tempEnemy._speed; 

tempEnemy.vX *= tempEnemy.decay; 
tempEnemy.vY *= tempEnemy.decay; 

更新:

private function toDegrees(radians:Number):Number 
    { 
     var degrees:Number = Math.floor(radians * 180/Math.PI); 
     //trace (degrees); 
     return degrees; 
    } 

private function getRadians(deltaX:Number, deltaY:Number):Number 
    { 
     var radian:Number = Math.atan2(deltaY, deltaX); 

     if (deltaY < 0) 
     { 
      radian += (2 * Math.PI); 
     } 
     return(radian); 
    } 
+0

你可以发布你的getRadians函数吗? –

+0

我更新了我的代码。我插入ToDegrees和getRadians。希望这可以帮助。 – drpelz

回答

1

没有看到你的getRadians功能,也许你传递360°计算反射角度?

也许是这样的:

var degrees:Number = Math.atan2(tempEnemy.y - player.y, tempEnemy.x - player.x) * 180/Math.PI; 
var delta:Number = degrees - tempEnemy.rotation; 

while (delta <= -180) 
    delta += 360; 
while (delta > 180) 
    delta -= 360; 

补偿degrees与你的敌人显示对象设计的休息角。

+0

谢谢 - 我会检查一下。我更新了我的代码并插入到了代码并获取了Radians。 – drpelz

1

这听起来像你已经使用时间线补间。使用补间代码,或者抓住我在这里使用的补间http://flexdiary.blogspot.com/2010/04/sample-code-for-oop-timeline-insideria.html。我不记得我做了什么来使时间线变成完整的循环,而不是在重新启动之前扭回来,但是您应该能够导出并重新使用补间。

如果要使用补间代码,可以使用Flash的内置补间类或使用像Tweensy这样的库。

+0

谢谢!:)我会检查一下! – drpelz