Как бы мне исправить этот сбой в моей (TweenMax) анимации?

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

У меня этот дурацкий сбой в линейной анимации, когда птицы летят слева направо (т. Е. Иногда они зависают).

Live :http://tli-temp.heroku.com /
Код :

 package tli {

  import flash.events.TimerEvent;
  import flash.utils.Timer;
  import com.greensock.TweenMax;
  import com.greensock.easing.Linear;

public class Birds {

    private var birds:Array;

    public function Birds():void {
      birds = TLI.birds as Array;
      var i:uint = 4;
      while (i > 0) { new_bird(i); --i; }
    }

    private function new_bird(nr:uint):void {
      var b:Bird = new Bird();
      b.name = 'Bird nr.'   nr;
      b.scaleX = 0.23;
      b.scaleY = 0.23;
      b.x = -100;

      TLI.stage.addChild(b);

      birds.push(b);

      setTimeout(function():void {  tween_bird( birds[0] ); birds.shift()  }, rndm(5500, 500));
    }

    private function tween_bird(bird:Bird):void {
      bird.x = -100;
      bird.y = rndm(TLI.stage.stageHeight - TLI.sea.height - 80, 50);

      TweenMax.to( bird, rndm(55,35), {
        x: TLI.stage.stageWidth   100, ease: Linear.easeNone,
        onComplete: tween_bird, onCompleteParams: [bird]
      });
    }

    private function rndm(max:uint, min:uint=0):uint {  return Math.floor( Math.random() * (max-min) )   min }
}}
  

У кого-нибудь есть идея, как я мог бы это исправить?

Комментарии:

1. на самом деле у меня была ошибка до появления каких-либо сбоев: Ошибка # 2015: объект BitmapData недействителен. во flash.display::BitmapData / ctor() во flash.display::BitmapData() в tli::Sky() в TLI / init ()

2. Хм, странно, у меня не было этой ошибки, и я тоже использую проигрыватель debugger. Но спасибо, я разберусь с этим!

3. В чем может быть сбой? На первый взгляд, я бы сказал, что таймер плюс TweenMax — это перебор. Может быть, использовать один или другой.

4. Почему это перебор? И да, мне, вероятно, следует использовать свойство delay теперь, когда я думаю об этом.

5. @igor-milla Итак, я немного изменил свой код, вы все еще получаете эту ошибку?

Ответ №1:

Это:

  var t:Timer = new Timer(wait_time, 1);
  

Создает таймер в области действия функции. Когда функция выходит из области видимости, таймер становится кандидатом на сборку мусора. Возможно, что таймер собирает мусор, и полное событие никогда не срабатывает.

Вызов setTimeout () безопасен и, вероятно, выполняет то, что вам нужно.

Не уверен, что это проблема, которую вы видите, но это проблема, которую вы, вероятно, хотите исправить.

Комментарии:

1. Я предпочитаю использовать delayedCall от TweenMax, а не setTimeout. Это дает вам немного больше гибкости и делает его чище.

2. Я не верю, что запущенный таймер со ссылающимися на него событиями является собранным мусором.