Flash Actionscript 3 & Альфа-анимация с колеблющимся объектом - PullRequest
0 голосов
/ 09 апреля 2009

Как мне анимировать через ActionScript во Flash что-то вроде следующего:

У меня на сцене разбросано несколько квадратов со случайными значениями альфа. Когда фильм загружается, я бы хотел, чтобы каждый квадрат плавно анимировался с любым текущим альфа-значением, равным нулю, затем равным 1, и повторял цикл бесконечно.

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

Из онлайнового учебного пособия я понял, что я должен настроить свой квадрат (ImageTile) как объект:

package {

    import flash.display.*;
    import flash.events.*;

    public class ImageTile extends MovieClip {

        var tileAlpha = this.alpha;

        public function ImageTile() {
            // construct here
            this.addEventListener(Event.ENTER_FRAME, AnimateTile);
        }

        function AnimateTile(e:Event) {
            // animation to go here
        }

    }

}

... но математика для того, что я хочу сделать, ускользает от меня. Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

1 голос
/ 09 апреля 2009

Возможно, эффект Dissolve или Fade (оба имеют образец и код внизу страницы). Я полагаю, что вы хотите, чтобы эти эффекты воспроизводились последовательно (возможно, нет необходимости кодировать их в ActionScript). Затем, чтобы заставить его оставаться в альфа = 1, я бы добавил событие к эффекту и проверил его альфа-значение и либо установил задержку, либо временно приостановил анимацию. Я провел простые тесты, просто анимируя альфа-значения, и это похоже на работу.

Вы можете установить для repeatCount значение 0, чтобы бесконечно воспроизводить эффект, и repeatDelay, чтобы оно оставалось на конечных альфа-значениях (тогда, возможно, вам не потребуется добавлять дополнительные обработчики событий).

var eff : Dissolve = new Dissolve();
eff.alphaFrom = ...;
eff.alphaTo = 0;
// set repeatCount & repeatDelay if necessary
eff.play([list of targets]);
0 голосов
/ 10 апреля 2009

Вы, вероятно, могли бы избавиться от таймера, но это, честно говоря, не сильно его изменит.

import fl.motion.easing.*;

import flash.display.MovieClip;
import flash.events.*;
import flash.utils.Timer;
import flash.utils.setInterval;
import flash.utils.setTimeout;

public class ImageTile extends MovieClip {              

    public function ImageTile() 
    {
        flash.utils.setTimeout(initSquares, Math.floor(Math.random()*20*1000);
    }

    function initSquares() 
    {
            flash.utils.setInterval(fade, 10000);
    }

    function fade() 
    {
            TweenLite.to(this, 2, {alpha:Math.random()});
    }

}
0 голосов
/ 09 апреля 2009

Хорошо, поэтому мне удалось приблизительно определить, что я хотел, используя два таймера:

package {

import flash.display.MovieClip;
import flash.events.*;
import gs.TweenLite;
import fl.motion.easing.*;
import flash.utils.Timer;

public class ImageTile extends MovieClip {      

    public function ImageTile() {
        var atimer:Timer = new Timer(Math.floor(Math.random()*20*1000),1);
        atimer.addEventListener(TimerEvent.TIMER, initSquares);
        atimer.start();
    }

    function initSquares(e:Event) {
        //trace("should be 15 of these, no more!");
        var timer:Timer = new Timer(10000);
        timer.addEventListener(TimerEvent.TIMER, fade);
        timer.start();
    }

    function fade(e:Event) {
        TweenLite.to(this, 2, {alpha:Math.random()});
    }

}

}

По сути, мое главное требование состояло в том, чтобы каждый квадрат делал анимацию постепенного изменения с фиксированным интервалом между ними, и чтобы все они не делали это на одном и том же интервале. Я уверен, что это не так чисто, как могло бы быть, поэтому любой рефакторинг был бы признателен.

Также отмечу, что я использую библиотеку TweenLite для своего затухания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...