向点动画精灵

问题描述:

我正在尝试做一些非常简单的动画:使一组精灵动画,以便无论他们在舞台上的哪个位置,他们都朝着单点(在这种情况下,舞台)。向点动画精灵

它只适用于其中的一些。他们中有些人就坐在那里。我无法弄清楚为什么。我认为它与atan2以及我使用它的方式有关,但我不确定是什么。有人能看到吗?

感谢,

大卫

package 
{ 

import Ball; 

import flash.display.Sprite; 
import flash.display.StageAlign; 
import flash.display.StageScaleMode; 
import flash.events.Event; 

public class MoveBalls extends Sprite { 

    private var balls:Array = new Array(); 
    private var speed:Number = new Number(10); 

    public function MoveBalls() { 
     init(); 
    } 

    private function init():void { 
     stage.align = StageAlign.TOP_LEFT; 
     stage.scaleMode = StageScaleMode.NO_SCALE; 

     for(var i:int = 0; i<30; i++) 
     { 
      var ball:Ball = new Ball(20); 
      ball.x = getRandomNumber(); 
      if(ball.x > stage.stageWidth) ball.x = stage.stageWidth -10; 
      if(ball.x < 0) ball.x = 10; 
      trace(ball.x); 
      ball.y = getRandomNumber(); 
      if(ball.y >stage.stageHeight) ball.y = stage.stageHeight - 10; 
      if(ball.y < 0) ball.y = 10; 
      addChild(ball); 
      balls.push(ball); 
     } 

     addEventListener(Event.ENTER_FRAME, onEnterFrame); 
    } 

    private function getRandomNumber():Number { 
     var decider:Number = Math.random(); 
     if (decider < 0.5) { 
      return Math.random()*1000; 
     } else { 
      return Math.random()*-1000; 
     } 
    } 

    public function onEnterFrame(event:Event):void { 

     var targetX:Number = stage.stageWidth/2; 
     var targetY:Number = stage.stageHeight/2; 
     for(var i:int=0; i < balls.length; i++) 
     { 
      var startX:Number = balls[i].x; 
      var startY:Number = balls[i].y; 
      var atanX:Number = (targetX - startX); 
      var atanY:Number = (targetY - startY); 
      if(atanX > .1) //just stop when it's close enough to the center 
      { 
       var ang:Number = Math.atan2(atanY, atanX); 
       var xSpeed:Number = Math.cos(ang)*speed; 
       var ySpeed:Number = Math.sin(ang)*speed; 
       balls[i].x += xSpeed; 
       balls[i].y += ySpeed; 
      } 
     } 

    } 
} 
} 

//ball class 
package { 
import flash.display.Sprite; 

public class Ball extends Sprite { 
    private var radius:Number; 
    private var color:uint; 

    public function Ball(radius:Number=40, color:uint=0xff0000) { 
     this.radius = radius; 
     this.color = color; 
     init(); 
    } 
    public function init():void { 
     graphics.beginFill(color); 
     graphics.drawCircle(0, 0, radius); 
     graphics.endFill(); 
    } 
} 
} 

我不同意这个行同意:

if(atanX > .1) 

因为如果球是去舞台的中心,既像在X轴和Y轴上,那么这个条件对于直接在中心之下或之上的球是失败的。

使它像这样

if (atanX > .1 || atanY > .1) 

=如果任何的差异比0.1大,去与ATAN2 ...

编辑: 一个比较明显的错误 - 在atanX或atanY变量可以在50%为负值。因此,使用这样的:

if (Math.abs(atanX) > .1 || Math.abs(atanY) > .1) 

还是这个,这是相同的,但速度更快(难读,虽然):

if ((atanX > 0 ? atanX : -atanX) > .1 || (atanY > 0 ? atanY : -atanY) > .1) 
+0

是(卫生署!)好点。但即使我做出这样的改变,有时候有些球会坐在那里。 – David 2010-11-06 00:52:22

+0

更新:问题似乎与该条件有关,无论是在其原始状态还是作为修改:if(atanX> .1 || atanY> .1)。一旦我删除条件,球不再挂。不过,我不知道为什么。 – David 2010-11-06 13:13:42

+0

现在它应该可以工作。 – 2010-11-06 18:21:55