2011-09-01 74 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