[转载]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