0

在下面的函数中,我尝试将随机项目(由函数 generateItem() 生成)扔到舞台上,并让它们从舞台右侧外侧移动到左侧外侧。这很好用,但唯一的问题是 TweenLite.to 函数中的 ease:Linear.easeNone 不起作用。项目在动画开始时保持快速,在动画结束时保持缓慢。这是代码:

private function timerHandler(event:TimerEvent):void{
    //item handling
    if(gameTimer.currentCount % 4 === 0){
    var item:MovieClip = generateItem();
    arrItems.push(item);

    for each(item in arrItems){
        TweenLite.to(item,5,{x:-(item.width - 1), ease:Linear.easeNone});
        trace(item + " ----- " + item.x);
        if(item.x < -(item.width)){
            arrItems.splice(arrItems.indexOf(item),1);
            stage.removeChild(item);
        }
    }
}
4

1 回答 1

0

for each这里发生的是你在循环中一次又一次地覆盖你的补间。一旦你为一个对象设置了补间动画,TweenLite.to你就不需要为同一个对象再次设置它,除非你想用一个新的 tween覆盖它。

您看到动画结束变慢的原因是因为对象必须移动到补间动画的最后一点的距离更短(因为它已经覆盖了其中的一部分),但动画的总持续时间仍然是5秒。速度 = 距离/时间,所以相同的时间但更短的距离 = 更慢的补间。

您可以通过将TweenLite.to调用移到外部来解决此问题loop,因此每个项目只会设置一个补间。我为您的代码推荐的另一项改进是使用onCompleteTweenLite 的回调函数来避免for eachtimeHandler 函数中的昂贵循环,并且仅在补间完成后删除该项目,除非您出于其他原因需要遍历所有项目而不是只需检查补间是否已结束。

例如:

private function timerHandler(event:TimerEvent):void
{
  //item handling
  if(gameTimer.currentCount % 4 === 0)
  {
    var item:MovieClip = generateItem();

    arrItems.push(item);

    //only call once for each item
    TweenLite.to(item,5,{ x:-(item.width - 1), 
                          ease:Linear.easeNone,
                          onComplete: removeItem,
                          onCompleteParams:[item]
                         });

  }

}

private function removeItem(item:MovieClip):void
{
  arrItems.splice(arrItems.indexOf(item),1);
  stage.removeChild(item);
}

希望这可以帮助!

于 2012-11-13T16:52:32.137 回答