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

グロー フィルターのアルファ サイクルは途中で 1 回 (1 から 0 に低下)、元に戻ることはありません。中間値 (0 から 1 の間) に関係していることは理解していますが、エレガントな解決策は考えられません。while を 2 つ (ゼロより上に 1 つ、ゼロより下に 1 つ) 使用しても、途中までしか循環しません。どうすればこれを解決できますか。

4

2 に答える 2

2

ここで何が起こっているのか考えてみてください....

グローが初めて入ったとき、アルファは 1 であると仮定します。そうでない場合、私の説明は少しずれていますが、かなり近いものです。

  1. したがって、アルファは 1 です。最初の if ステートメントif(glow.alpha >= 1)は true です。したがって、0.05 を減算し、フィルターを適用して繰り返します。
  2. アルファは 0.95 になりました。これは >= 1 ではなく、<= 0 でもありません。したがって、最後の else が実行されglow.alpha -= 0.5ます。そして、ループが繰り返されます。
  3. アルファは 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 を使用することもできます。

もっと簡潔なコードが必要な場合は、pulse 関数を次のように変更できます。

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 より大きい (または等しい) 場合は、アルファから 0.05 減少します。アルファが 0 と 1 の間にある場合は、依然として減少します (最終の else)。0 より小さい (または等しい) 場合は、0.05 を増やします。でもほら、また0になると減って、0未満になるから増える。この時点で、要素は表示されなくなります。:P

TweenMax ライブラリを使用してみてください。この効果は、1 行または 2 行のコードで実現できます。それでもこの方法でやりたい場合は、ブール値の var を使用します。0 の場合は、そのブール値を true にします。このブール値が true であるため、アルファ値を増やします。アルファ値が 1 の場合、ブール値を false にして、false であるためアルファを減らします。:)

于 2011-09-01T17:51:31.867 に答える