パーティクルエフェクト1

by hacker_tmbt9fl2
画像文字のパーティクルエフェクト。
エフェクト終了の判断がいまいち。。
♥0 | Line 122 | Modified 2011-07-12 18:20:45 | MIT License
play

ActionScript3 source code

/**
 * Copyright hacker_tmbt9fl2 ( http://wonderfl.net/user/hacker_tmbt9fl2 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/AoD1
 */

package {
    import com.flashdynamix.motion.Tweensy;
    import fl.motion.easing.*;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.ColorTransform;
    import flash.net.URLRequest;
    import flash.system.Security;
    import net.hires.debug.Stats;
    
    /**
     * ...
     * @author ccsxw718
     */
    [SWF(width="500", height="500", backgroundColor="0xFFFFFF", frameRate="30")]
    public class ParticleEffect1 extends Sprite {
        
        private var _loader:Loader;
        private var _particleList:Vector.<Particle> = new Vector.<Particle>();
        private var _canvas:BitmapData;
        private var _initX:Number;
        private var _initY:Number;
        private const CTF:ColorTransform = new ColorTransform(1, 1, 1, 1, 15, 15, 15);
        
        private var _finishList:Array = [];
        private var _sourceBmd:BitmapData;
        
        public function ParticleEffect1() {
            _init();
        }
        
        private function _init():void {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.quality = StageQuality.LOW;
            
            Security.loadPolicyFile("http://s-ebata.com/crossdomain.xml");
            
            _loader = new Loader();
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete);
            _loader.load(new URLRequest("http://s-ebata.com/dummy_text.png"));
        }
        
        private function _onComplete(e:Event):void {
            _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, _onComplete);
            
            _initX = Math.floor((stage.stageWidth - _loader.content.width) / 2);
            _initY = Math.floor((stage.stageHeight - _loader.content.height) / 2);
            
            //ビットマップの情報を配列に格納
            _sourceBmd = new BitmapData(_loader.content.width, _loader.content.height, true, 0xFFFFFFFF);
            _sourceBmd.draw(_loader.content);
            var bmp:Bitmap = new Bitmap(_sourceBmd);
            var i:uint, j:uint;
            for (i = 0; i < _loader.content.width; i++) {
                for (j = 0; j < _loader.content.height; j++) {
                    var color:uint = _sourceBmd.getPixel32(i, j);
                    if (color == 0xFFFFFFFF) continue;
                    _particleList.push(new Particle(i, j, color));
                }
            }
            
            //初期座標
            var p:Particle;
            for (i = 0; i < _particleList.length; i++) {
                p = _particleList[i];
                p.x = Math.round(stage.stageWidth * Math.random() + 0.5);
                p.y = Math.round(stage.stageHeight * Math.random() + 0.5);
            }
            
            _canvas = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0xFFFFFFFF);
            addChild(new Bitmap(_canvas));
            
            addEventListener(Event.ENTER_FRAME, _onRender);
            
            addChild(new Stats());
        }
        
        private function _onRender(e:Event):void {
            var p:Particle;
            var diffX:Number, diffY:Number, stepX:Number, stepY:Number;
            var i:uint;
            _canvas.lock();
            for (i = 0; i < _particleList.length; i++) {
                p = _particleList[i];
                
                diffX = (_initX + p.tx) - p.x;
                diffY = (_initY + p.ty) - p.y;
                stepX = diffX * .2;
                stepY = diffY * .2;
                
                if (Math.abs(diffX) < 1 && Math.abs(diffY) < 1) {
                    p.x = (_initX + p.tx);
                    p.y = (_initY + p.ty);
                } else {
                    p.x += stepX;
                    p.y += stepY;
                }
                _canvas.setPixel(p.x, p.y, p.color);
                if (p.x == (_initX + p.tx) && p.y == (_initY + p.ty)) {
                    if (_finishList[i] == null) _finishList.push(i);
                }
            }
            _canvas.unlock();
            _canvas.colorTransform(_canvas.rect, CTF);
            
            if (_finishList.length >= _particleList.length) _onCompleteRender();
        }
        
        private function _onCompleteRender():void {
            removeEventListener(Event.ENTER_FRAME, _onRender);
            
            var bmp:Bitmap = new Bitmap(_sourceBmd);
            addChild(bmp);
            bmp.x = _initX;
            bmp.y = _initY;
            bmp.alpha = 0;
            
            Tweensy.to(getChildAt(0), { alpha: 0 }, 0.5, Sine.easeOut, 0, null, _onCompleteTween1 );
            Tweensy.to(bmp, { alpha: 1 }, 0.5, Sine.easeOut);
            Tweensy.to(bmp, { alpha: 0 }, 0.5, Sine.easeOut, 1);
        }
        
        private function _onCompleteTween1():void {
            removeChildAt(0);
            _canvas.dispose();
            _canvas = null;
        }
        
    }

}


internal class Particle {
    
    public var tx:Number = 0;
    public var ty:Number = 0;
    public var x:Number = 0;
    public var y:Number = 0;
    public var color:Number = 0;
    
    public function Particle(x:Number, y:Number, color:uint) {
        this.tx = x;
        this.ty = y;
        this.x = x;
        this.y = y;
        this.color = color;
    }
    
}