`
hzmg88hzmg
  • 浏览: 12755 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

一个as3.0实现的烟花效果,很有思想

 
阅读更多

一个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;
  }
  }
  }
  }
  复制代码
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics