Sparkle Text

by tronster
Sparkle Text
Tronster - http://tronster.com
Inspired from Reebok's "Defy convention" commericals in 2006
♥20 | Line 101 | Modified 2009-12-31 07:06:32 | MIT License
play

Related images

ActionScript3 source code

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

/**
	Sparkle Text
	Tronster - http://tronster.com
	Inspired from Reebok's "Defy convention" commericals in 2006
*/
package 
{
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	import flash.text.*;
	import flash.utils.getTimer;
	import flash.filters.*;
	
    [SWF(backgroundColor="#000000", frameRate=61)]	
	public class SparkleClass extends Sprite 
	{
		/// CHANGE THIS: What do you want to display.
		private const msg:String = "DEFY";


		/// CHANGE THIS: to make the individual sparkles bigger/smaller:
		private const SPARKLE_SIZE 		:int = 16;
		
		/// CHANGE THIS: to increase/decrease space between sparkles.
		private const SPARKLE_PADDING	: int = 2;
		
		/// CHANGE THIS: Amount of a pixel's opacity to be considered a sparkle [0-255].
		private const PIXEL_OPACITY_THRESHOLD: int = 128;
		
		/// CHANGE THIS: Size of font.
		private const sparkleFontHeight	:int = 28;


		/// Computed based on height.
		private	var sparkleFontWidth 	:int;
				
		/// Holds raw sampled data from rasterized text on bitmap.
		private var sparkleData	:Vector.<uint>;
		
		// Holds actual sparkle.
		private var sparkles:Vector.<Shape>;
		
		// Holds an initial random value for sparkle.
		private var sparklesRandom:Vector.<Number>;
		
				
		/// Ctor
		public function SparkleClass() 
		{		
			// Allocate sparkles and their randoms.
			sparkles = new Vector.<Shape>();
			sparklesRandom = new Vector.<Number>();
		
		
			// Holds rasterized text.
			var bitmap:Bitmap;

			var tf:TextField = new TextField();
			var fmt:TextFormat = new TextFormat("Arial", 64, 0xFFFFFF, true);
			tf.defaultTextFormat = fmt;
			tf.autoSize = TextFieldAutoSize.LEFT;
			tf.text = msg;
			//addChild( tf );
			
			var bmpData:BitmapData = new BitmapData(tf.textWidth, tf.textHeight, true, 0x000000);
			bmpData.draw( tf, new Matrix() );
			bitmap = new Bitmap( bmpData );
			//addChild( bitmap );
			bitmap.y = 50;

			var ratio		:Number = sparkleFontHeight / tf.textHeight;

			sparkleFontWidth = int(ratio * tf.width );
			
			trace( " tf.w,tf.h: " + tf.textWidth + " x " + tf.textHeight );
			trace( "       w,h: " + tf.width + " x " + tf.height);
			trace( "     ratio: " + ratio );
			trace( "   sparkle: " + sparkleFontWidth + " x " + sparkleFontHeight ) ;

			// Fill vector with sampling of pixels			
			sparkleData = new Vector.<uint>( sparkleFontWidth * sparkleFontHeight  );			
			for (var iy:int = 0; iy < sparkleFontHeight; iy++ ) {
				for (var ix:int = 0; ix < sparkleFontWidth; ix++ ) {
					sparkleData[ix + (iy * sparkleFontWidth)] = 
						bmpData.getPixel32(ix * (1/ratio),iy * (1/ratio));
				}
			}
						
			addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
        }
		
		/// This is on the stage; wire listeners.
		private function onAddedToStage( e:Event ):void 
		{
			removeEventListener( Event.ADDED_TO_STAGE, onAddedToStage );

			// Holds sampling in a string to send to output.
			var debugSampling:String ="";

			var pixel:uint;
			for (var iy:int = 0; iy < sparkleFontHeight; iy++ ) {
				for (var ix:int = 0; ix < sparkleFontWidth; ix++ ) {
					pixel = sparkleData[ix + (iy * sparkleFontWidth)];

					// Flash bug?: If the last AND is not performed then sometimes
					// the first bit (negative) stays set.
					var pixelA:uint = (( pixel & 0xff000000 ) >> 24) & 0xff;
					
					if ( pixelA > PIXEL_OPACITY_THRESHOLD )
					{
						debugSampling += "#";
						addSparkle(ix, iy);
					}
					else
						debugSampling += "-";
				}
				debugSampling += "\n";
			}
			trace( debugSampling );
			
			// Glow & blur to add organic goodness!
			filters = [ new BlurFilter(1.5,1.5,3), new GlowFilter(0xffffff,0.9,8,8,2,3) ];
			
			addEventListener( Event.ENTER_FRAME, onFrame );
		}
		
		/// Adds a sparkle
		private function addSparkle(ix:int, iy:int) :void
		{
			// Create and add to display list.
			var shape:Shape = new Shape();
			shape.x = ix * (SPARKLE_SIZE + SPARKLE_PADDING);
			shape.y = iy * (SPARKLE_SIZE + SPARKLE_PADDING);
			addChild( shape );
			
			// Add to our own list (for easy updates later).
			sparkles.push( shape );
			
			// Generate a random # to associate with this sparkle.
			sparklesRandom.push( Math.random() * 123 );
		}

		/// Update a sparkle
		private function updateSparkle( offset:int, time:int )
		{
			var intensity:Number;
			intensity = 0.25 + (  ((Math.sin( sparklesRandom[offset] + (time*0.005) ) + 1) * 0.5)  * 0.75 );
			
			var shape:Shape = sparkles[offset];
			shape.graphics.clear();
			shape.graphics.beginFill( 0xd0e0ff, intensity );
			shape.graphics.drawRect(0, 0, SPARKLE_SIZE, SPARKLE_SIZE);
			shape.graphics.endFill();
		}

		/// Called once a frame
		private function onFrame( e:Event ):void {
			var time:int = getTimer();
			var len:int = sparkles.length;
			for(var offset:int = 0; offset < len; ++offset)
				updateSparkle( offset, time );
				
			// ???TMH - This .x is hard coded for a four letter word.
			//this.x = Math.sin( time * 0.001 ) * -1000;
			this.x = -400;
			this.z = 50 - Math.sin( time * 0.001 ) * 700;
		}
		
	}
}

Forked