Actionscript 3 为指向某个点的精灵设置动画

Actionscript 3 为指向某个点的精灵设置动画,actionscript-3,Actionscript 3,我正在尝试做一些非常简单的事情:设置一组精灵的动画,这样,无论它们在舞台上的什么位置,它们都会朝着一个点移动(在本例中,就是舞台的中心) 这只对其中一些人有效。有些人只是坐在那里。我不明白为什么。我认为这与atan2和我使用它的方式有关,但我不确定是什么。有人能看见吗 谢谢 大卫 包 { 进口球; 导入flash.display.Sprite; 导入flash.display.StageAlign; 导入flash.display.StageScaleMode; 导入flash.events.E

我正在尝试做一些非常简单的事情:设置一组精灵的动画,这样,无论它们在舞台上的什么位置,它们都会朝着一个点移动(在本例中,就是舞台的中心)

这只对其中一些人有效。有些人只是坐在那里。我不明白为什么。我认为这与atan2和我使用它的方式有关,但我不确定是什么。有人能看见吗

谢谢

大卫

包
{
进口球;
导入flash.display.Sprite;
导入flash.display.StageAlign;
导入flash.display.StageScaleMode;
导入flash.events.Event;
公共类MoveBalls扩展了Sprite{
私有变量:数组=新数组();
专用var速度:编号=新编号(10);
公共职能(){
init();
}
私有函数init():void{
stage.align=StageAlign.TOP\u左;
stage.scaleMode=StageScaleMode.NO_SCALE;
对于(变量i:int=0;i stage.stageWidth)ball.x=stage.stageWidth-10;
如果(ball.x<0)ball.x=10;
轨迹(ball.x);
ball.y=getRandomNumber();
如果(ball.y>stage.stageHeight)ball.y=stage.stageHeight-10;
如果(ball.y<0)ball.y=10;
addChild(ball);
推(球);
}
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
私有函数getRandomNumber():Number{
变量决策器:Number=Math.random();
如果(分界值<0.5){
返回Math.random()*1000;
}否则{
返回Math.random()*-1000;
}
}
公共函数OnInterFrame(事件:事件):无效{
var targetX:Number=stage.stageWidth/2;
var targetY:Number=stage.stageHeight/2;
对于(变量i:int=0;i.1)//当它离中心足够近时停止
{
变量ang:Number=Math.atan2(atanY,atanX);
var xSpeed:Number=Math.cos(ang)*速度;
var ySpeed:Number=Math.sin(ang)*速度;
球[i].x+=x速度;
球[i].y+=y速度;
}
}
}
}
}
//球类
包装{
导入flash.display.Sprite;
公共类舞会延伸雪碧{
私有变量半径:数字;
私有变量颜色:uint;
公共功能球(半径:数字=40,颜色:uint=0xff0000){
这个半径=半径;
这个颜色=颜色;
init();
}
公共函数init():void{
图形填充(彩色);
图形绘制圆(0,0,半径);
graphics.endFill();
}
}
} 

我不同意这句话:

if(atanX > .1)
因为如果球要到达舞台的中心,就像在X轴和Y轴上一样,那么这个条件对于中心正下方或正上方的球就不成立了

就这样吧

 if (atanX > .1 || atanY > .1)
=如果其中一个差值大于.1,则继续使用atan2

编辑: 还有一个更明显的错误——atanX或atanY变量在50%的情况下可能是负数。因此,请使用以下任一方法:

if (Math.abs(atanX) > .1 || Math.abs(atanY) > .1)
或者,这是相同的,但更快(但更难阅读):


是的(doh!)说得好。但是,即使我做了这样的更改,有时一些球还是会停在那里。更新:问题似乎在于该条件,要么是在其原始状态,要么是修改后的:if(atanX>.1 | | atanY>.1)。一旦我移除了条件,球就不再挂起。但我不知道为什么。
if (Math.abs(atanX) > .1 || Math.abs(atanY) > .1)
if ((atanX > 0 ? atanX : -atanX) > .1 || (atanY > 0 ? atanY : -atanY) > .1)