这一回,我仔细观察了烟花的爆炸视频,仔细分析,然后程序中,将烟花的烟火分成三类,个人感觉效果还是很不错哈,呵呵~这个也是答应要帮朋友网站做的效果,不过到时候要给朋友网站的成品可不止这个flash而已,我还会为这个flash加上后台用以设置烟花爆炸的日期,爆炸的秒数等,到时候正式使用了,以后每到节日,我这个flash就是蹦出来吓大家喽。呵呵~~~
有空的时候把源代码传上来供大家观赏~
其中,参数num表示烟花个数,time表示烟花爆炸秒数,colors表示允许随机产选择的烟花颜色。有兴趣的和对自己电脑有信心的人,可以把num改到很大,包爽!
烟花,火焰之类的特效实现,被称为粒子系统,即是用大量的按一定方式变化的粒子组合成的组合效果,还有兴趣的朋友可以用HTML5浏览器来看看HTML5实现的火焰效果示例。
下面是烟花效果的源代码。
/** * com.hoverlees.fireworks.FireUnit类 烟火基本元素,包括三种形状的烟火,圆形、扁形,星形。 * @author Hoverlees me[at]hoverlees.com http://www.hoverlees.com **/ package com.hoverlees.fireworks{ import flash.display.Sprite; import flash.display.GradientType; public class FireUnit extends Sprite { public static var FIRE_TYPE_BALL:Number=1; public static var FIRE_TYPE_SPLASH:Number=2; public static var FILE_TYPE_STAR:Number=3; private static var INIT_ALPHA=0.5; private var dType:Number; private var dColor:Number; private var dAlpha:Number=0; private var moveX; private var moveY; private var paintX=0; public function FireUnit(type:Number,color:Number) { reinit(type,color); } public function reinit(type:Number,color:Number) { this.dType=type; this.dColor=color; reset(); } public function reset() { this.alpha=1; this.rotation=0; this.visible=false; paintX=0; paint(); } public function startMove(initSpeed:Number=50,angle:Number=0) { this.dAlpha=0.1; this.rotation=angle; var t=Math.PI*angle/180; this.scaleX=this.scaleY=initSpeed/50; moveX=initSpeed*Math.cos(t); moveY=initSpeed*Math.sin(t); } public function loop() { if(dAlpha==0) return; if (this.alpha>0) { var t=this.alpha-dAlpha; if (t<0) { t=0; } this.alpha=t; } if (this.alpha==0) { return; } this.x+=moveX; this.y+=moveY; moveX=moveX*3/4; moveY=moveY*3/4; this.visible=true; } private function paint(){ this.graphics.clear(); switch (dType) { case FIRE_TYPE_BALL : this.graphics.beginGradientFill(GradientType.RADIAL,new Array(dColor,dColor),new Array(INIT_ALPHA,0),new Array(0,30)); this.graphics.drawCircle(5,0,30); this.graphics.endFill(); break; case FIRE_TYPE_SPLASH : this.graphics.beginFill(dColor,INIT_ALPHA); this.graphics.drawEllipse(0,0,25,4); this.graphics.endFill(); break; case FILE_TYPE_STAR : this.graphics.lineStyle(1,dColor,INIT_ALPHA); this.graphics.moveTo(0,-5); this.graphics.lineTo(0,5); this.graphics.moveTo(-5,0); this.graphics.lineTo(5,0); break; } } } } /** * com.hoverlees.fireworks.Fireworks类 烟花类,只要指定颜色和中心位置后,调用bomb方法即可实现烟花效果。 * @author hoverlees me[at]hoverlees.com http://www.hoverlees.com */ package com.hoverlees.fireworks{ import flash.display.Sprite; import flash.events.Event; public class Fireworks extends Sprite { private var snd=new Snd(); private var units:Array=new Array(); private var delayFrame:Number=-1; private var counter=0; public function Fireworks(color:Number){ var i; for(i=0;i<40;i++){ units[i]=new FireUnit(1,color); } for(i=40;i<60;i++){ units[i]=new FireUnit(2,color); } for(i=60;i<85;i++){ units[i]=new FireUnit(3,color); } addEventListener(Event.ENTER_FRAME,this.onEnterFrame3); reset(); } public function bombing(){ return counter>=0; } public function reset(){ for(var i=0;i<units.length;i++){ units[i].x=units[i].y=0; units[i].scaleX=units[i].scaleY=0.6+Math.random()%0.4; addChild(units[i]); units[i].reset(); } counter=10; } private function onEnterFrame3(e){ if(delayFrame>0){ delayFrame--; return; } if(delayFrame==0){ snd.play(); delayFrame--; } for(var i=0;i<units.length;i++){ units[i].loop(); } counter--; } public function bomb(delayFrame:Number=0){ this.delayFrame=delayFrame; for(var i=0;i<units.length;i++){ units[i].startMove(50*Math.random(),Math.random()*360); } } } } /** * com.hoverlees.fireworks.Main类 主类,用于演示,根据传入的烟花数,爆炸秒数,颜色数组放烟花。 * @author hoverlees me[at]hoverlees.com http://www.hoverlees.com */ package com.hoverlees.fireworks{ import flash.utils.Timer; import flash.events.TimerEvent; import flash.display.MovieClip; public class Main{ private var timer:Timer; private var sWidth,sHeight; private var firesArray:Array; private static var colorArray:Array; public function Main(root:MovieClip,fireworksNum:Number,time:Number,colorArray:Array){ sWidth=root.stage.stageWidth; sHeight=root.stage.stageHeight; Main.colorArray=colorArray; firesArray=new Array(); for(var i=0;i<fireworksNum;i++){ var t=Math.floor(Math.random()*(colorArray.length-1)); firesArray[i]=new Fireworks(colorArray[t]); root.addChild(firesArray[i]) } timer=new Timer(1000,time); timer.addEventListener(TimerEvent.TIMER,onEachSecond); timer.start(); } private function onEachSecond(e){ for(var i=0;i<firesArray.length;i++){ if(!firesArray[i].bombing()){ firesArray[i].reset(); firesArray[i].x=Math.random()*sWidth; firesArray[i].y=Math.random()*sHeight; var t=Math.round(Math.random()*12); firesArray[i].bomb(t); } } } } }
这个错误说明你的用法不对
直接复制出现包不能嵌套的错误= =