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