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ループ内でトゥイーンを何度もオーバーライドしていることです。を使用してオブジェクトのトゥイーン アニメーションを設定したら、新しい tweenTweenLite.toでオーバーライドする場合を除き、同じオブジェクトに対して再度設定する必要はありません。

アニメーションの終了が遅くなる理由は、オブジェクトがトゥイーン アニメーションの最終ポイントまで移動しなければならない距離が短いためです (すでに一部をカバーしているため)。 5秒。速度 = 距離/時間なので、同じ時間で距離が短い = トゥイーンが遅くなります。

TweenLite.to呼び出しを の外に移動するだけでこれを修正できるため、アイテムごとに 1 つのトゥイーンloopのみが設定されます。コードに推奨するもう 1 つの改善点は、TweenLite のコールバック関数を使用して timeHandler 関数内のonCompleteコストのかかるループを回避し、トゥイーンが完了した後にのみアイテムを削除することです。for eachトゥイーンが終了したかどうかを確認してください。

例えば:

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 に答える