merry christmas...

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
layout="absolute" creationComplete="init()"
backgroundGradientColors="[#ffffff, #000000]">


<mx:Script>
<![CDATA[


import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.geom.Matrix;
import flash.filters.ColorMatrixFilter;
import flash.filters.GlowFilter;
import flash.filters.DisplacementMapFilter;

private var mov:MovieClip = new MovieClip();

private function doSetFire():void
{
        var outputText:TextField = new TextField();
    outputText.text = "Burn";
    outputText.width = stage.stageWidth;
    outputText.height = outputText.textHeight;
    
    mov.addChild(outputText);
    mov.height = stage.height;
    mov.width = stage.width;
    this.stage.addChild(mov); 
        setFire(mov);
}

private function setFire(mc:MovieClip):MovieClip 
{
// hide the original MC
mc.visible =false;
// calculate the bounds and apply aa padding offset to accomodate the FX
var bounds:Object = mc.getBounds(mc);
var offset_y:Number =30
var offset_x:Number =10
var w:Number = bounds.width +offset_x
var h:Number = bounds.height +offset_y
bounds.x=bounds.x-offset_x/2
bounds.y=bounds.y-offset_y/2
// creat our FX copy
var clip=new MovieClip();
//create a 'holder' so we can math the original clips registration
point exactly
var holder:MovieClip=new MovieClip()
//add 'clip' to the main display object and add 'holder' as a child of
'clip'.
this.stage.addChild(clip);
clip.addChild(holder);
holder.name="fire_holder"+clip.getChildIndex(holder);
// set up our bitmap data
var fireMC:Bitmap=new Bitmap();
var shad:Bitmap=new Bitmap()
var grad:Sprite=new Sprite();;
// set up the flame colouring
var fillType:String = GradientType.LINEAR;
var colors:Array
var glow:GlowFilter
// try some different colour flames out here:
//colors = [0xFF0000, 0xFF6600, 0xFFCC00, 0xFFFFFF]
//colors = [0x33FFFF, 0x3399FF, 0x33FFFF, 0xFFFFFF]
//colors = [0x006600, 0x009900, 0x00CC00, 0xFFFFFF]
//colors = [0xCC0099, 0xFF66FF, 0xFFCCFF, 0xFFFFFF]
colors = [0x9900FF, 0xCC99FF,0xCCCCFF, 0xFFFFFF]
var alphas:Array = [100, 100, 100, 100];
var ratios:Array = [90, 110,130, 255];
var interpolationMethod:String= InterpolationMethod.LINEAR_RGB
var matr:Matrix = new Matrix();
matr.createGradientBox( w, h, -(270/180)*Math.PI,0, h);
var spreadMethod:String = SpreadMethod.REFLECT;
// draw the flame colouring
grad.graphics.beginGradientFill(fillType, colors, alphas, ratios,
matr, spreadMethod, interpolationMethod);
grad.graphics.moveTo(0, 0);
grad.graphics.lineTo(w, 0);
grad.graphics.lineTo(w, h);
grad.graphics.lineTo(0, h);
grad.graphics.lineTo(0, 0);
grad.graphics.endFill();
//holder.addChild(grad);//uncomment this to see that your gradientis
working properly
// create a glow filter
glow = new GlowFilter(colors[1], 1, 13, 13, 2, 1, false, false);
// set up our bitmap data
var gradBmp:BitmapData = new BitmapData(w, h, true, 0x00000000);
gradBmp.draw(grad);
var bitmap:BitmapData = new BitmapData(w, h, true, 0x00000000);
var fireBitmap:BitmapData = new BitmapData(w, h, true, 0x00000000);
// copy the original MC
bitmap.draw(mc, new Matrix(1,0,0,1,bounds.x*-1,bounds.y*-1));
// set x and y positions
holder.x=bounds.x
holder.y=bounds.y
clip.x=mc.x;
clip.y=mc.y;
// combine the gradient colours with the non alpha'd area of the MC
bitmap.copyPixels(gradBmp, gradBmp.rect, new Point(0,0), bitmap,
new Point(0, 0), true);
// create a silhouette to sit on top
var shadowMap:BitmapData = bitmap.clone();
// add the fire mc to the display object
fireMC.bitmapData=fireBitmap
holder.addChild(fireMC)
var matrix:Array = new Array();
matrix = matrix.concat([-1, 0, 0, 0, 0]);
matrix = matrix.concat([0, -1, 0, 0, 0]);
matrix = matrix.concat([0, 0, -1, 0, 0]);
matrix = matrix.concat([0, 0, 0, 1, 0]);
var darken = new ColorMatrixFilter(matrix);
var offset = new Point(0, 0);
var yOff = 4;
// create our displacement map bitmap data
var disp:BitmapData = new BitmapData(w, h);
// create our offsets
var offsets = new Array();
// create a blur filter
var blur1 = new flash.filters.BlurFilter(3,20, 1);
offsets.push(new flash.geom.Point());
//create a random seed
var seed= Math.round(Math.random()*300);
var p = new Point()
// apply static FX to the shadow map
shadowMap.applyFilter(shadowMap,shadowMap.rect,p,darken)
shadowMap.applyFilter(shadowMap,shadowMap.rect,p,glow)
// redraw loop
var redraw = function():void {
//increment offset
offsets[0].y += yOff;
// create perlin noise for displacement filter
disp.perlinNoise(20, 30, 1, seed, true, true, 1, false, offsets);
// create displacement filter
var displaceFilter:DisplacementMapFilter = new
DisplacementMapFilter(disp, offset, 1, 1, 50, 50, 'color');
// apply filters to bitmap datat
fireBitmap.applyFilter(bitmap, bitmap.rect, p,blur1)
fireBitmap.applyFilter(fireBitmap, bitmap.rect,p,displaceFilter)
//copy the shadow map
var fireshadowMap=fireBitmap.clone();
// combine the bitmap data
fireBitmap.copyPixels(shadowMap, shadowMap.rect, p, shadowMap,p,true);
fireBitmap.copyPixels(fireshadowMap, shadowMap.rect, p,
fireshadowMap,p, true);
};
// add loop
clip.addEventListener("enterFrame",redraw);
// swap depths with original mc (comment out mc.visible=false to use)
this.stage.swapChildren(clip, mc)
//create kill datat
clip.bitmap1=bitmap
clip.bitmap2=gradBmp
clip.bitmap3=shadowMap
clip.bitmap4=disp
clip.listener=redraw
clip.original=mc;
// return a reference to the new FX MC
return clip;
}

private function removeFX(clip:MovieClip):void {
clip.removeEventListener("enterFrame", clip.listener);
clip.original.visible=true;
clip.bitmap1.dispose();
clip.bitmap2.dispose();
clip.bitmap3.dispose();
clip.bitmap4.dispose();
this.removeChild(clip);
}

private function init():void
{
// to call the fx
//fxClip:MovieClip=setFire(mc:MovieClip):MovieClip;
//var flamingText = setFire(bb as MovieClip)//
// to get rid of the FX:
//removeFX(flamingText)
}



]]>
</mx:Script>
<mx:Button x="140" y="118" label="Button" id="bb"
click="{doSetFire()}"/>


</mx:Application>

Reply via email to