Фильтр свечения альфа не зацикливается - PullRequest
0 голосов
/ 01 сентября 2011
    public function pulse(obj:DisplayObject, glow:GlowFilter):void
    {
        obj.filters = [glow];
        obj.addEventListener(Event.ENTER_FRAME, function():void { 
            if(glow.alpha >= 1)
                glow.alpha -= 0.05;
            else if(glow.alpha <= 0)
                glow.alpha += 0.05;
            else
                glow.alpha -= 0.5;
            obj.filters = [glow];
        });
    }

Свечение фильтрует альфа-циклы один раз на полпути (падает с одного до нуля), но никогда не возвращается обратно. Я понимаю, что это связано со средними значениями (между 0 и 1), но я не могу придумать элегантного решения. Даже при использовании двух типов while (один для значения выше нуля, другой - для значения ниже), он все равно будет повторяться только наполовину. Как я могу решить это.

Ответы [ 2 ]

2 голосов
/ 01 сентября 2011

Подумайте о том, что здесь происходит ...

В первый раз, когда свет появляется, я предполагаю, что альфа равен 1. Если нет, мое объяснение немного неверно, но довольно близко.

  1. Итак, альфа равен 1. Ваше первое утверждение if, if(glow.alpha >= 1) верно. Итак, отнимите 0,05, примените фильтр и повторите.
  2. альфа теперь 0,95. Это не> = 1, и это не <= 0. Таким образом, запускается финал else, <code>glow.alpha -= 0.5. И цикл повторяется.
  3. альфа теперь 0,45. Та же ситуация, что и в номере 2 выше. Итак, glow.alpha -= 0.5 снова запускается. И повтори.
  4. альфа теперь -0,05. Теперь ваш else if работает, добавив 0,05. Итак, альфа теперь на 0. Повторите.
  5. То же самое происходит, что и в номере 4. Теперь альфа равен 0,05.
  6. Теперь мы вернулись к else. Вычитая 0,5. Оставив нас на -0,45.
  7. Цикл теперь находится в состоянии, где он будет продолжать прибавлять 0,05, пока не достигнет +0,05, затем вернется к -0,45.

Делая это по-своему, я бы выбрал немного другой подход.

Создайте новый .fla, сделайте этот DocumentClass и запустите его.

package  {

    import flash.display.MovieClip;
    import flash.display.DisplayObject;
    import flash.filters.GlowFilter;
    import flash.events.Event;
    import flash.display.Sprite;

    public class GlowTest extends MovieClip {

        public var filter:GlowFilter;
        public var target:Sprite;
        public var pulseDown:Boolean = true;
        private var _glowTarget:DisplayObject;

        public function GlowTest() {

            target = new Sprite();
            target.graphics.beginFill(int(Math.random() * 0xFFFFFF), 1);
            target.graphics.drawCircle(0, 0, int(Math.random() * 200));
            target.graphics.endFill();
            target.x = int(Math.random() * stage.stageWidth);
            target.y = int(Math.random() * stage.stageHeight);
            addChild(target);

            // constructor code
            var color:Number = 0x33CCFF;
            var alpha:Number = 0.8;
            var blurX:Number = 35;
            var blurY:Number = 35;
            var strength:Number = 2;
            var inner:Boolean = false;
            var knockout:Boolean = false;
            var quality = 1;
            //var quality:Number = BitmapFilterQuality.HIGH;

            filter = new GlowFilter(color, alpha, blurX, blurY, strength, quality, inner, knockout);
            startPulse(target, filter);

        }

        public function startPulse(obj:DisplayObject, glow:GlowFilter):void {
            _glowTarget = obj;
            _glowTarget.filters = [glow];
            _glowTarget.addEventListener(Event.ENTER_FRAME, pulse);
        }

        public function pulse($evt:Event):void {
            if (pulseDown) {
                filter.alpha -= 0.05;
            } else {
                filter.alpha += 0.05;
            }
            if (filter.alpha >= 1) {
                filter.alpha = 1;
                pulseDown = true;
            } else if (filter.alpha <= 0) {
                filter.alpha = 0;
                pulseDown = false;
            }
            _glowTarget.filters = [filter];
        }
    }
}

Однако я бы даже так не поступил. Я бы предложил использовать библиотеку для этого Tween, такую ​​как TweenLite / TweenMax. http://www.greensock.com/tweenmax/

Код для выполнения в одном направлении будет выглядеть примерно так:

import com.greensock.*;
import com.greensock.plugins.*;
TweenPlugin.activate([TintPlugin]);

var glowEffect:TweenMax = new TweenMax(mc,0,{glowFilter:{color:0x330000,alpha:1,blurX:5,blurY:5,str ength:2,quality:2,overwrite:5}});

Тебе просто нужно чередоваться, выполняя анимацию. Вы даже можете использовать onComplete Твин ElowElow, чтобы вызвать его в противоположном направлении.

Если вы хотите получить более краткий код, вы можете изменить функцию импульса следующим образом:

public function pulse($evt:Event):void {
    filter.alpha += pulseDown ? -0.05 : 0.05;
    if (filter.alpha >= 1 || filter.alpha <= 0) {
        filter.alpha = Math.round(filter.alpha);
        pulseDown = !pulseDown;
    }
    _glowTarget.filters = [filter];
}
0 голосов
/ 01 сентября 2011

Вы уменьшаете 0,05 от альфы, когда она больше (или равна), чем 1. Когда она находится в диапазоне от 0 до 1, вы все еще уменьшаете (последний вариант). Когда оно меньше (или равно) 0, вы увеличиваете 0,05. Но посмотрите, когда снова будет 0, вы уменьшитесь, и тогда оно будет меньше 0, поэтому вы увеличите. В этот момент вы больше не увидите элемент. : P

Попробуйте использовать библиотеку TweenMax. Вы можете получить этот эффект с помощью одной строки кода или, может быть, двух. Если вы все еще хотите сделать это таким образом, используйте логическое значение var, когда оно равно 0, установите для этого логического значения значение true. Поскольку это логическое значение истинно, вы увеличиваете альфа-значение. Когда значение альфа равно 1, вы устанавливаете логическое значение false и уменьшаете альфа как ложное. :)

...