发光滤波器alpha不循环

时间:2011-09-01 16:55:03

标签: flash actionscript-3 adobe glow

    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中途循环一次(从一个减少到零),但永远不会重新上升。我知道它与中间值(0到1之间)有关,但我想不出一个优雅的解决方案。即使使用两个while(一个用于零以上,另一个用于下面),它仍然只是中途循环。我该怎么解决这个问题呢。

2 个答案:

答案 0 :(得分:2)

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

第一次发光时,我认为alpha是1.如果没有,我的解释有点偏,但非常接近。

  1. 所以,alpha是1.你的第一个if语句,if(glow.alpha >= 1)是真的。因此,减去0.05,应用过滤器并重复。
  2. alpha现在是0.95。这不是&gt; = 1,并且它不是&lt; = 0.所以最后的其他运行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。
  8. 按照自己的方式行事,我会采取稍微不同的方法。

    创建一个新的.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];
    }
    

答案 1 :(得分:0)

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

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