一个as3.0实现的烟花效果,很有思想
2010年05月13日
CDocFirework.as:
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.geom.ColorTransform;
import flash.filters.BlurFilter;
import flash.geom.Point;
import flash.filters.BitmapFilterQuality;
import flash.media.Sound;
import flash.net.URLRequest;
public class CDocFirework extends Sprite
{
private var bgm:Sound;//爆炸声
private var bf:BlurFilter;//模糊滤镜
private var bitmap:BitmapData;//画布
private var firework:Firework;
public function CDocFirework():void
{
bgm=new Sound();
bgm.load(new URLRequest('sound.mp3'));
bgm.addEventListener(Event.COMPLETE,whenComplete);
bf=new BlurFilter(2,2,BitmapFilterQuality.HIGH)
bitmap=new BitmapData(550,400,false,0);
addChild(new Bitmap(bitmap));
}
private function whenComplete(evt:Event):void
{
stage.addEventListener(MouseEvent.MOUSE_DOWN,whenMouseDown);//定义鼠标点击事件
stage.addEventListener(Event.ENTER_FRAME,whenEnterFrame);//定义帧循环事件
}
private function whenEnterFrame(evt:Event):void
{
bitmap.draw(this);//bitmap每帧都把舞台上的内容绘制到自己上面
bitmap.applyFilter(bitmap,bitmap.rect,new Point(),bf);//并每帧都加一个模糊滤镜效果
}
private function whenMouseDown(evt:MouseEvent):void
{
bgm.play();//鼠标点击时就放声音
firework=new Firework();//生成一个新的烟花
firework.x=stage.mouseX;
firework.y=stage.mouseY;
addChild(firework);//显示
}
}
}
复制代码Firework.as:
/* ---------------------------------------
|Firework.as |
|这个类表示每一个烟花 |
---------------------------------------*/
package
{
import FireworkData;
import flash.events.Event;
import flash.display.Sprite;
import flash.display.Graphics;
public class Firework extends Sprite
{
private var m_data:FireworkData;
private var m_canvas:Graphics;
public function Firework():void
{
m_data=new FireworkData();
m_canvas=this.graphics;
addEventListener(Event.ENTER_FRAME,whenEnterFrame);
}
private function whenEnterFrame(evt:Event):void
{
m_canvas.clear();
m_canvas.beginFill(m_data.color);
for (var i=0; i<100; i++)
{
m_canvas.drawCircle(m_data.data.sx,m_data.data.sy,m_data.data.r);
//根据FireworkData类里面数组记录的每个元素的数值绘出各个粒子
}
m_canvas.endFill();
m_data.next();//让FireworkData类把它自身记录的数据更新到下一帧
alpha-=0.01;//每一帧都让自己的alpha减0.01
if (alpha<=0)
{
removeEventListener(Event.ENTER_FRAME,whenEnterFrame);
//如果自身的alpha数值小于等于0就把自身的帧循环事件去掉
}
}
}
}
复制代码FireworkData.as:
/* ----------------------------------------------------
|FireworkData.as |
|这个类的作用是记录每个烟花相关的数据 |
----------------------------------------------------*/
package
{
public class FireworkData
{
private var m_ary:Array;//数组存放这个烟花各个粒子的数据
private var m_color:uint;//这个烟花的颜色
public function FireworkData():void
{
m_color=Math.random()*0xffffff;//随机决定这个烟花的颜色
m_ary=new Array();//初始化数组
for (var i=0; i<100; i++)
{
m_ary.push(
{sx:0
,sy:0
,vx:Math.random()*15*(Math.random()-Math.random())
,vy:Math.random()*15*(Math.random()-Math.random())
,r:Math.random()*3}
);
//每个元素以Object为类型,sx,sy表示粒子当前的位置,都初始化为0,vx,vy分别为粒子在x轴,y轴方向的加速度
//vx,vy的数值随机生成,Math.random()*15规定了数值的范围,后面再*(Math.random()-Math.random())则是
//决定数值的正负符号,也就决定了粒子往正半轴运动还是负半轴运动,r变量决定了每个粒子的半径
}
}
public function get color():uint
{
return m_color;
}
public function get data():Array
{
return m_ary;
}
public function next():void//这个函数会把m_ary的各个元素的数值处理成下一帧的
{
for (var i=0; i<100; i++)
{
m_ary.sx+=m_ary.vx;
m_ary.sy+=m_ary.vy;
}
}
}
}
复制代码
2010年05月13日
CDocFirework.as:
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.geom.ColorTransform;
import flash.filters.BlurFilter;
import flash.geom.Point;
import flash.filters.BitmapFilterQuality;
import flash.media.Sound;
import flash.net.URLRequest;
public class CDocFirework extends Sprite
{
private var bgm:Sound;//爆炸声
private var bf:BlurFilter;//模糊滤镜
private var bitmap:BitmapData;//画布
private var firework:Firework;
public function CDocFirework():void
{
bgm=new Sound();
bgm.load(new URLRequest('sound.mp3'));
bgm.addEventListener(Event.COMPLETE,whenComplete);
bf=new BlurFilter(2,2,BitmapFilterQuality.HIGH)
bitmap=new BitmapData(550,400,false,0);
addChild(new Bitmap(bitmap));
}
private function whenComplete(evt:Event):void
{
stage.addEventListener(MouseEvent.MOUSE_DOWN,whenMouseDown);//定义鼠标点击事件
stage.addEventListener(Event.ENTER_FRAME,whenEnterFrame);//定义帧循环事件
}
private function whenEnterFrame(evt:Event):void
{
bitmap.draw(this);//bitmap每帧都把舞台上的内容绘制到自己上面
bitmap.applyFilter(bitmap,bitmap.rect,new Point(),bf);//并每帧都加一个模糊滤镜效果
}
private function whenMouseDown(evt:MouseEvent):void
{
bgm.play();//鼠标点击时就放声音
firework=new Firework();//生成一个新的烟花
firework.x=stage.mouseX;
firework.y=stage.mouseY;
addChild(firework);//显示
}
}
}
复制代码Firework.as:
/* ---------------------------------------
|Firework.as |
|这个类表示每一个烟花 |
---------------------------------------*/
package
{
import FireworkData;
import flash.events.Event;
import flash.display.Sprite;
import flash.display.Graphics;
public class Firework extends Sprite
{
private var m_data:FireworkData;
private var m_canvas:Graphics;
public function Firework():void
{
m_data=new FireworkData();
m_canvas=this.graphics;
addEventListener(Event.ENTER_FRAME,whenEnterFrame);
}
private function whenEnterFrame(evt:Event):void
{
m_canvas.clear();
m_canvas.beginFill(m_data.color);
for (var i=0; i<100; i++)
{
m_canvas.drawCircle(m_data.data.sx,m_data.data.sy,m_data.data.r);
//根据FireworkData类里面数组记录的每个元素的数值绘出各个粒子
}
m_canvas.endFill();
m_data.next();//让FireworkData类把它自身记录的数据更新到下一帧
alpha-=0.01;//每一帧都让自己的alpha减0.01
if (alpha<=0)
{
removeEventListener(Event.ENTER_FRAME,whenEnterFrame);
//如果自身的alpha数值小于等于0就把自身的帧循环事件去掉
}
}
}
}
复制代码FireworkData.as:
/* ----------------------------------------------------
|FireworkData.as |
|这个类的作用是记录每个烟花相关的数据 |
----------------------------------------------------*/
package
{
public class FireworkData
{
private var m_ary:Array;//数组存放这个烟花各个粒子的数据
private var m_color:uint;//这个烟花的颜色
public function FireworkData():void
{
m_color=Math.random()*0xffffff;//随机决定这个烟花的颜色
m_ary=new Array();//初始化数组
for (var i=0; i<100; i++)
{
m_ary.push(
{sx:0
,sy:0
,vx:Math.random()*15*(Math.random()-Math.random())
,vy:Math.random()*15*(Math.random()-Math.random())
,r:Math.random()*3}
);
//每个元素以Object为类型,sx,sy表示粒子当前的位置,都初始化为0,vx,vy分别为粒子在x轴,y轴方向的加速度
//vx,vy的数值随机生成,Math.random()*15规定了数值的范围,后面再*(Math.random()-Math.random())则是
//决定数值的正负符号,也就决定了粒子往正半轴运动还是负半轴运动,r变量决定了每个粒子的半径
}
}
public function get color():uint
{
return m_color;
}
public function get data():Array
{
return m_ary;
}
public function next():void//这个函数会把m_ary的各个元素的数值处理成下一帧的
{
for (var i=0; i<100; i++)
{
m_ary.sx+=m_ary.vx;
m_ary.sy+=m_ary.vy;
}
}
}
}
复制代码