`

[转]粒子效果浅析

阅读更多
http://bbs.9ria.com/viewthread.php?tid=77135&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000

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;
                }
        }
        
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics