[转载]actionscript3.0简单粒子效果

[转载]actionscript3.0简单粒子效果 – 火星人 – 博客园.

从天地会论坛的MoonSpirit师兄那里学来了用actionscript3.0中的BitmapData粒子实现一个简单的图片演示效果。

particleVO.as:

   1:  package com.helloshp.vo
   2:  {
   3:      import flash.display.BitmapData;
   4:  
   5:      //粒子对象属性
   6:      public class ParticleVO
   7:      {
   8:          public var bmd:BitmapData;//用来装载切图
   9:          public var crtPosX:Number;//该粒子对象当前出现在舞台的X位置
  10:          public var crtPosY:Number;//该粒子对象当前出现在舞台的Y位置
  11:          public var tragetX:Number;//该粒子最后要运动到的舞台的X位置
  12:          public var tragetY:Number;//该粒子最后要运动到的舞台的Y位置
  13:      }
  14:  }

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas,”Courier New”,courier,monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); }

Main.as:

   1:  package
   2:  {
   3:      import com.helloshp.vo.ParticleVO;
   4:  
   5:      import flash.display.Bitmap;
   6:      import flash.display.BitmapData;
   7:      import flash.display.Sprite;
   8:      import flash.events.Event;
   9:      import flash.events.MouseEvent;
  10:      import flash.events.TimerEvent;
  11:      import flash.geom.Point;
  12:      import flash.geom.Rectangle;
  13:      import flash.utils.Timer;
  14:  
  15:      [SWF(width="800",height="600")]
  16:      public class Main extends Sprite
  17:      {
  18:          [Embed(source="assets/imgTest0.jpg")]
  19:          private var imgTest0:Class;
  20:          [Embed(source="assets/imgTest1.jpg")]
  21:          private var imgTest1:Class;
  22:          [Embed(source="assets/imgTest2.jpg")]
  23:          private var imgTest2:Class;
  24:          [Embed(source="assets/imgTest3.jpg")]
  25:          private var imgTest3:Class;
  26:          [Embed(source="assets/imgTest4.jpg")]
  27:          private var imgTest4:Class;
  28:  
  29:          private var bmpimgTest:Bitmap;
  30:          private var bmp:Bitmap;
  31:          private var bmd:BitmapData;
  32:          private var particleVOList:Array;
  33:          private var currentIndex:int;
  34:          private var isStop:Boolean;
  35:          private var timer:Timer;
  36:  
  37:          public function Main()
  38:          {
  39:              init();
  40:          }
  41:  
  42:          private function init():void{
  43:              initData();
  44:              addEventListener(Event.ENTER_FRAME,efHandler);
  45:              stage.addEventListener(MouseEvent.CLICK,clickHandler);
  46:              timer = new Timer(3500);
  47:              timer.addEventListener(TimerEvent.TIMER,timerHandler);
  48:              timer.start();
  49:          }
  50:  
  51:          private function initData():void{
  52:              //清除舞台所以的可视对象
  53:              for(;this.numChildren>0;){
  54:                  this.removeChildAt(0);
  55:              }
  56:  
  57:              //实例化用于创建粒子对象的数组
  58:              particleVOList = new Array();
  59:              //把即将要切片的imgTest.jpg图片装载到一个Bitmap视图容器里面
  60:              bmpimgTest = getImg( currentIndex );
  61:              //实例化待加载切图的画布
  62:              bmd = new BitmapData(800,600,true,0);
  63:              //把画布加载到显示容器里面去,等哈儿显示所有的粒子对象用
  64:              bmp = new Bitmap( bmd );
  65:              //把显示容器加载到舞台
  66:              addChild(bmp);
  67:              //初始化粒子对象
  68:              initParticleVO();
  69:          }
  70:  
  71:          private function getImg(crtIndex:int):Bitmap{
  72:              switch(crtIndex){
  73:                  case 0:
  74:                      return new imgTest0();
  75:                      break;
  76:                  case 1:
  77:                      return new imgTest1();
  78:                      break;
  79:                  case 2:
  80:                      return new imgTest2();
  81:                      break;
  82:                  case 3:
  83:                      return new imgTest3();
  84:                      break;
  85:                  case 4:
  86:                      return new imgTest4();
  87:                      break;
  88:                  default:
  89:                      return new imgTest0();
  90:                      break;
  91:              }
  92:  
  93:          }
  94:  
  95:          //当鼠标点击后,暂停或者继续播放
  96:          private function clickHandler(e:MouseEvent):void{
  97:              isStop = isStop?false:true;
  98:              if(isStop){
  99:                  timer.stop();
 100:              }
 101:              else{
 102:                  timer.reset();
 103:                  timer.start();
 104:              }
 105:  
 106:          }
 107:  
 108:          //初始化所有的粒子对象,每个粒子对象其实就是把加载的testImg图片,通过2重循环切成一个一个的bitmapData,
 109:          //并设置每个粒子对象的当前坐标(待会儿舞台显示出现的位置),目标坐标(就是粒子对象要移动到的位置),并存放到数组。
 110:          //通过2重循环切testImg图的时候关键是,新建立一个尺寸10 X 10 大小的bitmapData对象,然后通过它的copyPixels()方法去切加载的图片。
 111:          //copyPixels(),的参数1: 就是要切的图片对象的bitmapData,参数2: 创建一个要切的那一个方块对象,该方块对象的x,y坐标就是该方块最终要放置到舞台上的坐标
 112:          //参数3:切图的坐标点,默认设置为原点。        
 113:          private function initParticleVO():void{
 114:              //行数为50行,因为每次切图的高就是10像素,60*10=600,刚好就是我的图片的高            
 115:              for( var row:int=0;row<60;row++ ){
 116:                  //宽度为80行,因为每次切图的宽就是10像素,80*10=800,刚好就是我的图片的宽
 117:                  for(var col:int=0;col<80;col++){
 118:                      //初始化每一个粒子VO
 119:                      var pvo:ParticleVO = new ParticleVO();
 120:                      pvo.tragetX = col * 10;//粒子目标X坐标(就是粒子对象最终要移动到的X位置)
 121:                      pvo.tragetY = row * 10;//粒子目标Y坐标(就是粒子对象最终要移动到的Y位置)                    
 122:                      pvo.crtPosX = col * 10 + Math.random() * 1000; //粒子在舞台显示的X位置.通过随机数打乱初始位置
 123:                      pvo.crtPosY = row * 10 + Math.random() * 1000;//粒子在舞台显示的Y位置,通过随机数打乱初始位置
 124:                      pvo.bmd = new BitmapData(10,10,true,0);//创建一个空白的画布
 125:                      //关键代码,就是切图操作
 126:                      pvo.bmd.copyPixels( bmpimgTest.bitmapData,new Rectangle(pvo.tragetX,pvo.tragetY,10,10),new Point() );
 127:                      //把每个切出来的图,装载到一个数组里面(等哈儿再渲染到舞台上出来)
 128:                      particleVOList.push( pvo );
 129:                  }
 130:              }
 131:          }
 132:  
 133:          private function efHandler(e:Event):void{
 134:              if(isStop) return;
 135:              //bmd.lock()
 136:              //创建一个800 X 600 的空白的画布
 137:              bmd = new BitmapData(800,600,true,0);
 138:              //循环取出每一个刚刚切好的图片,然后再转载到画布里面
 139:              for(var i:int=0;i<particleVOList.length;i++){
 140:                  var pvo:ParticleVO = particleVOList[i];
 141:                  pvo.crtPosX += ( pvo.tragetX - pvo.crtPosX ) / ( 2 + Math.random() * 20 );//X轴缓动效果
 142:                  pvo.crtPosY += ( pvo.tragetY - pvo.crtPosY ) / ( 2 + Math.random() * 20) ;//Y轴缓动效果
 143:                  //关键代码,把数组里面装的每一个小的切图,装载到800 X 600 的大的画布里面去。装载的时候,都是按照粒子对象对应的X,Y坐标装载的。
 144:                  bmd.copyPixels( pvo.bmd, new Rectangle(0,0,10,10 ),new Point(pvo.crtPosX,pvo.crtPosY) );
 145:              }
 146:              //把装载好的画布,赋值给显示对象,让可视对象bmp在舞台上渲染出图片出来
 147:              bmp.bitmapData = bmd;
 148:              //bmd.unlock();
 149:          }
 150:  
 151:          private function timerHandler(e:TimerEvent):void{
 152:              currentIndex++;
 153:              if(currentIndex > 4 ){
 154:                  currentIndex = 0;
 155:              }
 156:              initData();
 157:          }
 158:      }
 159:  }
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas,”Courier New”,courier,monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); }代码下载:http://files.cnblogs.com/bigbigdotnet/particle.rar

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏