Flash as3 做的烟花效果

这一回,我仔细观察了烟花的爆炸视频,仔细分析,然后程序中,将烟花的烟火分成三类,个人感觉效果还是很不错哈,呵呵~这个也是答应要帮朋友网站做的效果,不过到时候要给朋友网站的成品可不止这个flash而已,我还会为这个flash加上后台用以设置烟花爆炸的日期,爆炸的秒数等,到时候正式使用了,以后每到节日,我这个flash就是蹦出来吓大家喽。呵呵~~~

有空的时候把源代码传上来供大家观赏~

这个Flash的链接方式:

http://www.hoverlees.com/diy/fireworks/fireworks.swf?num=10&time=3
&colors=0xff0000,0x00ff00,0xff,0xffff00,0x00ffff,0xff00ff,0x990000,0x0

其中,参数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);
				}
			}
		}
	}
}

Join the Conversation

2 Comments

Your email address will not be published. Required fields are marked *