[转]粒子效果浅析
http://bbs.9ria.com/viewthread.php?tid=77135&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000package { 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 ycolor 三个属性(显示列表中的对象发生属性改变,就会导致系统开销增加). } } 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; 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; } } }
页:
[1]