打印

[AS3] 求助,AS3写的火花效果,透明度渐变如何实现?

刚做的AS3的火花,其他都好了,就差火花的透明度渐变,麻烦各位大大帮忙看看怎么实现。谢谢。
第一,单个火花:
复制内容到剪贴板
代码:
package {
    import flash.display.Sprite;
    import flash.display.GradientType;
    import flash.geom.Matrix;
    public class gradientBall extends Sprite {
        public var radius:Number;
        public var beginAlpha:Number=0;
        private var color:uint;
        public var vx:Number=0;
        public var vy:Number=0;
        public function gradientBall(radius:Number=10,beginAlpha:Number=1) {
            this.radius=radius;
            this.beginAlpha=beginAlpha;
            init();
        }
        public function init():void {
            var colors:Array = [0xffff00, 0xffff00];
            var alphas:Array = [beginAlpha, 0];
            var ratios:Array = [0, 255];
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(20, 20, 0, 0, 0);
            graphics.beginGradientFill(GradientType.RADIAL, colors, alphas, ratios, matrix);
            graphics.drawCircle(10,10,radius);
            graphics.endFill();
        }
    }
}
第二,整个火花代码:
复制内容到剪贴板
代码:
package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    
    public class gradientFountain extends Sprite
    {
        private var count:int = 100;
        private var balls:Array;
        private var gravity:Number = 0.5;
        private var alphaDecrease:Number = 0.1;
        
        public function gradientFountain()
        {
            init();
        }
        
        private function init():void
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align=StageAlign.TOP_LEFT;
            balls = new Array();
            for(var i:int = 0; i < count; i++)
            {
                var ball:gradientBall = new gradientBall(10,Math.random());
                ball.x = stage.stageWidth / 2;
                ball.y = stage.stageHeight / 2;
                ball.vx = Math.random() * 10 - 5;
                ball.vy = Math.random() * 10 - 5;
                addChild(ball);
                balls.push(ball);
            }
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(event:Event):void
        {
            for(var i:Number = 0; i < balls.length; i++)
            {
                var ball:gradientBall = gradientBall(balls[i]);
                ball.beginAlpha -= 0.1;
                ball.vy += gravity;
                ball.x += ball.vx;
                ball.y += ball.vy;
                if(ball.x - ball.radius > stage.stageWidth ||
                   ball.x + ball.radius < 0 ||
                   ball.y - ball.radius > stage.stageHeight ||
                   ball.y + ball.radius < 0)
                {
                    ball.x = stage.stageWidth / 2;
                    ball.y = stage.stageHeight / 2;
                    ball.vx = Math.random() * 10 - 5;
                    ball.vy = Math.random() * 10 - 5;
                }
            }
            ball.beginAlpha -= 0.1;
        }
    }
}
就是这样,透明度渐变实现我是用"ball.beginAlpha -= 0.1;"实现的,请问这样做有没有错。我试过运行后透明度没变化,请问问题出在哪?

[ 本帖最后由 NTTDoCoMo 于 2008-6-9 00:55 编辑 ]
贴个教程上面的给你看看AS3粒子系统:
Particle.aspackage com.lynda.particles
{
       import flash.display.*;
       
       public class Particle extends Sprite
       {
              public var xVelocity:Number;
              public var yVelocity:Number;
              public var gravity:Number;
              public var friction:Number;
              public var growX:Number;
              public var growY:Number;
              public var fade:Number;
              public var autoRotate:Boolean;
              
              public function Particle()
              {
                     xVelocity = 0;
                     yVelocity = 0;
                     gravity = 0;
                     friction = 1;
                     growX = 1;
                     growY = 1;
                     fade = 1;
                     autoRotate = false;
              }
              
              public function update():void
              {
                     xVelocity *= friction;
                     yVelocity *= friction;
                     yVelocity += gravity;
                     this.x += xVelocity;
                     this.y += yVelocity;
                     this.scaleX *= growX;
                     this.scaleY *= growY;
                     this.alpha *= fade;
                     if(autoRotate)
                     {
                            this.rotation = Math.atan2(yVelocity,xVelocity)*180/Math.PI;
                     }
              }
       }
}
firework.fla:import com.lynda.particles.Particle;
import flash.geom.ColorTransform;

var numOfParticles:uint = 20;
var particleClass:Class = Firework;
var particles:Array = [];
var container:Sprite = new Sprite();
var timer:Timer = new Timer(2000);
var colorTrans:ColorTransform = new ColorTransform();

function makeParticles(event:TimerEvent):void
{
       colorTrans.color = Math.random() * 0xFFFFFF;
       while(particles.length > 0)
       {
              container.removeChild(particles.shift());
       }
       for(var i:uint = 0; i < numOfParticles; i++)
       {
              var particle:* = new particleClass();
              container.addChild(particle);
              particle.x = this.mouseX;
              particle.y = this.mouseY;
              particle.yVelocity = Math.random() * 15 - 15;
              particle.xVelocity = Math.random() * 20 - 10;
              particle.autoRotate = true;
              particle.fade = Math.random() * .2 + .9;
              particle.growX = .98;
              particle.growY = 1.02;
              particle.gravity = Math.random() + .5;
              particle.glow_mc.transform.colorTransform = colorTrans;
              particles.push(particle);
       }
}

function updateParticles(event:Event):void
{
       for(var i:uint = 0; i < particles.length; i++)
       {
              particles[i].update();
       }
}

addChild(container);
timer.addEventListener(TimerEvent.TIMER, makeParticles);
timer.start();
addEventListener(Event.ENTER_FRAME, updateParticles);
我可不是在灌水哦!
难道没人能帮我吗?
试过用enterframe改变alpha实现吗?
从标题看我直接想到的就是这个。
紫色的風.net
迷一样打不开的地址

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
我就是用enterframe做,但播放起来没效果!

TOP


gradientBall
加上这个试一下看。
override public function set alpha ( value:Number ):void {
beginAlpha = value;
var colors:Array = [0xffff00, 0xffff00];
            var alphas:Array = [beginAlpha, 0];
            var ratios:Array = [0, 255];
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(20, 20, 0, 0, 0);
            graphics.beginGradientFill(GradientType.RADIAL, colors, alphas, ratios, matrix);
            graphics.drawCircle(10,10,radius);
            graphics.endFill();
}
紫色的風.net
迷一样打不开的地址

TOP

对于版主的回复,提出几个问题。
第一:value定义了,但没赋值,为什么?
第二:我讲版主的那段加上去了,但没见效果。
第三:override应该是重写吧,也就是说这个覆盖了“public function init():”?那相对应“gradientFountain.as”也应该做相应的调整。但我在“gradientFountain.as”里的“private function onEnterFrame(event:Event)”中加上"value -= 0.1;"后,提示“1020: 标记为 override 的方法必须覆盖另一方法。”
不好意思初学AS3,问题多了版主别介意!

TOP

这3个问题我可以一起说

这个并不是用来使用value-=0.1操作的
而是说操作alpha=什么的时候就不是以前的操作了。
而是自定义的这些步奏,至于为什么没出来我还是不太清楚,这里没FLASH。这两天我装上帮你测试一下。

也许其他朋友已经知道哪里出问题了,欢迎帖上意见。


补充
比如写上
override public function set alpha ( value:Number ):void {
   trace ("set alpha value:" + value);
}

那么以后修改alpha的时候就可以看到输出。

[ 本帖最后由 enc0717 于 2008-6-12 15:38 编辑 ]
紫色的風.net
迷一样打不开的地址

TOP

ball 的init可是只执行一次哦
你的beginAlpha再怎么变又有什么用
裸奔也是一种美

TOP

首先是这个代码有问题:

private function onEnterFrame(event:Event):void
        {
            for(var i:Number = 0; i < balls.length; i++)
            {
                var ball:gradientBall = gradientBall(balls[i]);
                ball.beginAlpha -= 0.1;
                ball.vy += gravity;
                ball.x += ball.vx;
                ball.y += ball.vy;
                if(ball.x - ball.radius > stage.stageWidth ||
                   ball.x + ball.radius < 0 ||
                   ball.y - ball.radius > stage.stageHeight ||
                   ball.y + ball.radius < 0)
                {
                    ball.x = stage.stageWidth / 2;
                    ball.y = stage.stageHeight / 2;
                    ball.vx = Math.random() * 10 - 5;
                    ball.vy = Math.random() * 10 - 5;
                }
            }
            ball.beginAlpha -= 0.1;
        }

最后的
ball.beginAlpha -= 0.1;
这个ball在for循环里面定义的,在外面调用超出了作用范围.

TOP

谢谢各位耐心回答,我再根据版主说的再尝试一下!

TOP

在你的基出上加了颜色变化,也可以渐变到透明,不好的是,第一次在出界后重画会有个空白时间.

package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
   
    public class gradientFountain extends Sprite
    {
        private var count:int = 100;
        private var balls:Array;
        private var gravity:Number = 0.5;
        private var alphaDecrease:Number = 0.1;
        
        public function gradientFountain()
        {
            init();
        }
        
        private function init():void
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align=StageAlign.TOP_LEFT;
            balls = new Array();
            for(var i:int = 0; i < count; i++)
            {
                var ball:gradientBall = new       gradientBall(Math.random()*0xffffff,10,Math.random());
                ball.x = stage.stageWidth / 2;
                ball.y = stage.stageHeight / 2;
                ball.vx = Math.random() * 10 - 5;
                ball.vy = Math.random() * 10 - 5;
                addChild(ball);
                balls.push(ball);
            }
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(event:Event):void
        {
            for(var i:Number = 0; i < balls.length; i++)
            {
                var ball:gradientBall = gradientBall(balls[i]);
                //ball.beginAlpha -= 0.1;
                ball.vy += gravity;
                ball.x += ball.vx;
                ball.y += ball.vy;
                if(ball.x - ball.radius > stage.stageWidth ||
                   ball.x + ball.radius < 0 ||
                   ball.y - ball.radius > stage.stageHeight ||
                   ball.y + ball.radius < 0)
                {
                    ball.alpha = 1;
                    ball.x = stage.stageWidth / 2;
                    ball.y = stage.stageHeight / 2;
                    ball.vx = Math.random() * 10 - 5;
                    ball.vy = Math.random() * 10 - 5;
                }
                ball.addEventListener(Event.ENTER_FRAME, onAlpha);
            }
        }
        
        private function onAlpha(event : Event) : void
        {
               var ball : gradientBall = event.target as gradientBall;
               ball.alpha -= 0.05;
        }

    }
}


package
{
    import flash.display.GradientType;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Matrix;
   
    public class gradientBall extends Sprite
    {
        public var radius:Number;
        public var beginAlpha:Number=0;
        private var color:uint;
        public var vx:Number=0;
        public var vy:Number=0;
        
        public function gradientBall(color:uint,radius:Number=10,beginAlpha:Number=1)
        {
            this.radius=radius;
            this.beginAlpha=beginAlpha;
            this.color = color;
            init();
        }
        
        public function init():void
        {
            var colors:Array = [color, 0xffffff];
            var alphas:Array = [beginAlpha, 0];
            var ratios:Array = [0, 255];
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(20, 20, 0, 0, 0);
            graphics.beginGradientFill(GradientType.RADIAL, colors, alphas, ratios, matrix);
            graphics.drawCircle(10,10,radius);
            graphics.endFill();
        }
    }
}

[ 本帖最后由 wwk501 于 2008-6-12 18:04 编辑 ]

TOP

我刚学as3两个月...
以前是只做过java和c

TOP