2011-09-01 42 views
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循环一次中途(从一个降到零),但永远不会返回。我明白它与中端值(0和1之间)有关,但我想不出一个优雅的解决方案。即使使用两个时间(一个用于零以上,另一个用于以下),它仍然只是半途而行。我该如何解决这个问题。辉光过滤器alpha不会循环

回答

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。所以阿尔法现在在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}}); 

的你只需要交替做补间。你甚至可以使用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]; 
} 
0

您从阿尔法下降0.05当它大于(或等于)比1。当它是0和1之间,你还在减少(最后的其他)。当它小于(或等于)0时,你增加0.05。但是,看,当它再次为0时,你会减少,然后它会小于0,所以你会增加。此时你再也看不到这个元素了。 :P

尝试使用TweenMax库。你可以用一行代码或者两个代码来得到这个效果。如果你仍然想这样做,使用一个布尔变量,当它为0时,将该布尔变为真。由于这个布尔值是真的,你增加了alpha值。当alpha值为1时,您将布尔值设为false,并将alpha减少为false。:)

+0

这几乎总结了正是我发布:) – sberry

+0

对不起,我没有看到你的帖子,当我张贴。呵呵 – CrociDB