[转]粒子效果浅析

[url]http://bbs.9ria.com/viewthread.php?tid=77135&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000[/url]


package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.ColorTransform;
import flash.geom.Rectangle;
import flash.net.URLRequest;

/**
* @author FLASH023
* @date 2011-3-27 14:07
**/
public class ParticleExmaple extends Sprite
{
private var bmd:BitmapData;
private var bitmap:Bitmap;
private var particleArray:Array;
private var moveIndex:int;
public function ParticleExmaple():void {
bmd = new BitmapData (pic.width , pic.height , true, 0x00);
bmd.draw (pic );//得到图片数据
bitmap=new Bitmap(bmd);
addChild (bitmap);
particleInit();
}
private function particleInit():void {
moveIndex = 0;
particleArray = [];
var _h:int = bmd.height;
var _cx:int = int(_h * .5);
var _cy:int = int(bmd.height * .5);
while (_h--) {
var _w:int = bmd.width;
while (_w--) {
particleArray.unshift(new Particle(_w, _h, bmd.getPixel32(_w, _h)));//把每个像素的值让一个粒子对象记录下来
//粒子是不加入到显示列表中的,但它有x y color 三个属性(显示列表中的对象发生属性改变,就会导致系统开销增加).
}
}
addEventListener (Event.ENTER_FRAME, moveParticle );
}
private function moveParticle(e:Event ):void {
bmd.lock ();//给BitmapData对象加锁,加锁的目的就是让bmd对象中的像素发生改变时,不刷新显示(因为刷新显示也要占用系统开销)
bmd.fillRect (bmd.rect, 0x00);
var _l:int = particleArray.length;
while(_l--){
var _p:Particle = particleArray[_l];
if(_l<moveIndex){
_p.move();
if (_p.x < 0 || _p.x > bmd.width || _p.y < 0 || _p.y > bmd.height ) {
//particleArray.splice (particleArray.indexOf(_p), 1);
continue;
}
}
bmd.setPixel32(_p.x, _p.y, _p.c);//改变bmd中的像素,这里是循环内部,每个粒子都会让它执行一次。前面之所以要加锁就是因为粒子太多,如果不锁,每个粒子都会刷新一次显示,占用的开销就大了。
}
bmd.unlock ();//这里解锁,让显示刷新。
//以上整个过程,就是让成千上万个粒子的改变,只刷新显示一次。 那么刷新显示(也是消耗系统开销的主要因素之一)占用的开销就不受粒子的多少影响了。
moveIndex += bmd.width;
}
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值