forked from: [INFINITY TANK BATTLE] FIRE BULLET

by tezzutezzu forked from [INFINITY TANK BATTLE] FIRE BULLET (diff: 203)
♥0 | Line 102 | Modified 2010-03-03 19:35:42 | MIT License
play

ActionScript3 source code

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


package {

	import flash.display.*;
	import flash.events.*;
	import flash.filters.*;
	import flash.geom.*;
	[SWF(backgroundColor='0')]
	
	public class Fire extends Sprite {
		private const FADE:Number = 0.1;
		private const SCALE:Number = 0.35;
		private const DISTORTION:Number = 1;
		private const AMOUNT:Number = 0.2;
		private const SPREAD:Number = 0.2;
		private const SMOKE:Number = 0.5;

		private var src:*;
		private var canvas:Bitmap;
		private var main_bmp:BitmapData;
		private var tmp_bmp:BitmapData;
		private var perlin_bmp:BitmapData;

		private var _matrix:Matrix;
		private var _Pt:Point;
		private var _ctf:ColorTransform;
		private var _cmf:ColorMatrixFilter;
		private var _dmf:DisplacementMapFilter;
		private var _blur:BlurFilter;

		private var _target:DisplayObject;

		private var originalW:Number;
		private var originalH:Number;

		private var translate:Matrix = new Matrix();
		private var gf:GlowFilter;
		
		private var t:Number = 0;
		
		public function Fire( _src:DisplayObject = null ) {
			if ( !_src ) {
				src = new Sprite();
				src.graphics.beginFill( 0xFFFFFF, 1 );
				src.graphics.drawEllipse( 0, 0, 80, 100 );
				src.graphics.endFill();
			} else {
				src = _src;
			}

			canvas = new Bitmap();
			_target = src;

			//canvas.x = stage.stageWidth / 2;
			//canvas.y = stage.stageHeight / 2;
			addChildAt( canvas, numChildren-2);
			
			//canvas.visible = false;
			
			_matrix = new Matrix();
			_Pt = new Point();

			init();
			start();
		}

		public function getBMD():BitmapData {
			return this.canvas.bitmapData;
		}

		private function start():void {
			addEventListener( Event.ENTER_FRAME, burn );
		}
		
		
		private function init():void {
			if ( main_bmp ) {
				main_bmp.dispose();
				main_bmp = null;
				tmp_bmp.dispose();
				tmp_bmp = null;
				perlin_bmp.dispose();
				perlin_bmp = null;
			}

			originalW = _target.width;
			originalH = _target.height;

			var w:Number = originalW * 6;
			var h:Number = originalH * 6;

			main_bmp = new BitmapData( w, h, true, 0 );
			tmp_bmp = main_bmp.clone();
			perlin_bmp = new BitmapData( w * 3, h * 3, false, 0 );
			canvas.bitmapData = main_bmp;
			
			perlin_bmp.perlinNoise( 30 * SCALE, 20 * SCALE, 1, -Math.random() * 100 | 0, false, true, 1 | 2, false );
			perlin_bmp.colorTransform( perlin_bmp.rect, new ColorTransform( 1, 1 - AMOUNT * 0.5, 1, 1, 0, 0, 0, 0 ));
			_cmf = new ColorMatrixFilter([1-0.65*FADE,0.2,0,0,-10,
										  0,1-0.65*FADE,0,0,0,   
										  0,0,0.8-0.55*FADE,0,0,   
										  0,0.1,0,1,-25+SMOKE*24 ]);
			
			_ctf = new ColorTransform( 0, 0,0, 1, 255, 255, 220, 0 );
			_dmf = new DisplacementMapFilter( perlin_bmp, _Pt, 1, 2, 14 * DISTORTION, -30, DisplacementMapFilterMode.CLAMP );
			_blur = new BlurFilter( 32 * SPREAD, 32 * SPREAD, 1 );
		}

		private function burn( e:Event ):void {
			var size:Number = Math.cos(t+=0.2)
			
			
			src.graphics.clear();
			src.graphics.beginFill( 0xFFFFFF, 1 );
			src.graphics.drawEllipse( 0, 0, 80, size * 100);
			src.graphics.endFill();
			
			
			_matrix.tx = stage.mouseX - originalW*.5
			_matrix.ty = stage.mouseY - originalH*.5
			
			 _target.transform.matrix.tx =_matrix.tx;
			 _target.transform.matrix.ty =_matrix.ty;
			var dM:Matrix = _target.transform.matrix;
			
			tmp_bmp.fillRect( tmp_bmp.rect, 0 );
			_ctf.alphaOffset = -Math.random() * 200 | 0;
			tmp_bmp.draw( _target, dM, _ctf,  "add" );
			tmp_bmp.applyFilter( tmp_bmp, tmp_bmp.rect, _Pt, _blur );
			main_bmp.draw( tmp_bmp, _matrix, null,  "add");

			_dmf.mapPoint = new Point( -Math.random() * ( perlin_bmp.width - main_bmp.width ) | 0, -Math.random() * ( perlin_bmp.height - main_bmp.height ) | 0 );
			main_bmp.applyFilter( main_bmp, main_bmp.rect, _Pt, _dmf );
			main_bmp.applyFilter( main_bmp, main_bmp.rect, _Pt, _cmf );

			
		}
	}
}