0
    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];
        });
    }

辉光过滤器 alpha 循环中途一次(从 1 下降到 0),但永远不会返回。我知道它与中值(0 到 1 之间)有关,但我想不出一个优雅的解决方案。即使使用两个while(一个用于高于零,另一个用于低于),它仍然只循环到一半。我该如何解决这个问题。

4

2 回答 2

2

想想这里发生了什么......

第一次发光时,我假设 alpha 为 1。如果不是,我的解释有点偏离,但非常接近。

  1. 所以,alpha 是 1。你的第一个 if 语句if(glow.alpha >= 1)是真的。因此,减去 0.05,应用过滤器并重复。
  2. alpha 现在是 0.95。那不是 >= 1,也不是 <= 0。所以最后的 else 运行,glow.alpha -= 0.5. 循环重复。
  3. alpha 现在是 0.45。与上面第 2 条相同的情况。于是glow.alpha -= 0.5又跑了。并重复。
  4. alpha 现在是 -0.05。现在你的else if运行,添加 0.05。所以 alpha 现在为 0。重复。
  5. 与数字 4 中的情况相同。现在 alpha 为 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}});

你只需要交替进行补间。您甚至可以使用glowEffect Tween 的onComplete 以相反的方向触发它。

如果您想要更简洁的代码,可以将脉冲函数更改为:

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];
}
于 2011-09-01T17:50:48.297 回答
0

当它大于(或等于)1 时,你从 alpha 中减少 0.05。当它在 0 和 1 之间时,你仍然减少(最后的 else)。当它小于(或等于)0 时,增加 0.05。但是,你看,当它再次为0时,你会减少,然后它会小于0,所以你会增加。此时您将不再看到该元素。:P

尝试使用 TweenMax 库。您可以使用一行代码或两行代码来获得这种效果。如果您仍然想这样做,请使用布尔变量,当它为 0 时,将该布尔变量设置为 true。由于此布尔值为真,因此您增加了 alpha 值。当 alpha 值为 1 时,您将布尔值设为 false 并在 alpha 为 false 时减小它。:)

于 2011-09-01T17:51:31.867 回答