Sine Language

Not sure exactly how useful this effect may be, but here’s a little something I was playing around with and thought I’d share.

Example:
[kml_flashembed movie=”../wp-content/uploads/2008/01/sinewriterexample.swf” height=”400″ width=”500″ fversion=”9″ /]

The Working Class:

/** 
* SineWriter class writes out messages in a sine wave pattern. 
* @author Devon O. 
* @date 1/28/2008 9:05 PM 
*/       

package com.onebyonedesign.extras {       

	import flash.display.Sprite; 
	import flash.events.Event; 
	import flash.events.TimerEvent; 
	import flash.text.AntiAliasType; 
	import flash.text.TextField; 
	import flash.text.TextFieldAutoSize; 
	import flash.text.TextFormat; 
	import flash.utils.Timer;       

	public class SineWriter extends Sprite {       

		private var _format:TextFormat; 
		private var _angle:Number = 0; 
		private var _peak:Number; 
		private var _letterArray:Array; 
		private var _letters:Array; 
		private var _message:String; 
		private var _freq:Number; 
		private var _speed:int; 
		private var _isWriting:Boolean = false;       

		/** 
		 * 
		 * @param	message		String that will be written 
		 * @param	format		TextFormat of written message. Font used by format *must* be embedded in .swf 
		 * @param	speed		int number of milliseconds before each letter appears (higher = slower). 
		 * @param	frequency	Number of sine wave frequency. Should be > 0 and < 1, but play around. 
		 * @param	peak		int height of sine waves. 
		 */ 
		public function SineWriter(message:String, format:TextFormat, speed:int = 25, frequency:Number = .25, peak:int = 45) { 
			_message = message; 
			_format = format; 
			_freq = frequency; 
			_peak = peak; 
			_speed = speed; 
		}       

		public function writeMessage() { 
			_isWriting = true; 
			_letterArray = _message.split(""); 
			_letters = new Array(); 
			var numLetters:int = _letterArray.length; 
			var t:Timer = new Timer(_speed, numLetters); 
			t.addEventListener(TimerEvent.TIMER, addLetter); 
			t.addEventListener(TimerEvent.TIMER_COMPLETE, onMessageComplete); 
			t.start(); 
		}       

		public function removeMessage():void { 
			if (!_isWriting && _letters && _letters.length) { 
				var len:Number = _letterArray.length; 
				while (len--) { 
					removeChild(_letters[len]); 
				} 
			} 
		}       

		//	Getters/Setters 
		public function get peak():Number { 
			return _peak; 
		}		       

		public function set peak( value:Number ):void { 
			_peak = value; 
		}		       

		public function get frequency():Number { 
			return _freq; 
		}		       

		public function set frequency( value:Number ):void { 
			_freq = value; 
		}		       

		public function get speed():int { 
			return _speed; 
		}		       

		public function set speed( value:int ):void { 
			_speed = value; 
		}		       

		public function get message():String { 
			return _message; 
		}		       

		public function set message( value:String ):void { 
			_message = value; 
		}       

		//	Private 
		private function addLetter(te:TimerEvent):void { 
			var i:int = te.currentTarget.currentCount - 1;       

			var letter:Sprite = new Sprite(); 
			var tf:TextField = new TextField(); 
			tf.autoSize = TextFieldAutoSize.LEFT; 
			tf.embedFonts = true; 
			tf.antiAliasType = AntiAliasType.ADVANCED; 
			tf.defaultTextFormat = _format; 
			tf.selectable = false;       

			// get a good width 
			tf.text = "O"; 
			var _hspacing:Number = tf.textWidth;       

			// get a good height 
			tf.text = "y"; 
			var _vspacing:Number = tf.getLineMetrics(0).descent;       

			tf.text = _letterArray[i]; 
			tf.x -= Math.round(tf.width * .5); 
			tf.y -= Math.round(_vspacing); 
			letter.addChild(tf); 
			letter.rotation = (Math.cos(_angle)) * (180 / Math.PI);       

			letter.x = (i * _hspacing) + _hspacing; 
			letter.y = ((Math.sin(_angle)) * _peak) + _vspacing; 
			_angle += _freq; 
			_letters.push(letter); 
			addChild(letter); 
		}       

		private function onMessageComplete(te:TimerEvent):void { 
			_isWriting = false; 
			te.currentTarget.removeEventListener(TimerEvent.TIMER, addLetter); 
			te.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, onMessageComplete); 
			dispatchEvent(new Event(Event.COMPLETE)); 
		} 
	} 
}

And a little document class example:

package {      

	import com.onebyonedesign.extras.SineWriter; 
	import fl.accessibility.ButtonAccImpl; 
	import fl.controls.Button; 
	import flash.display.Sprite; 
	import flash.events.Event; 
	import flash.events.MouseEvent; 
	import flash.text.FontStyle; 
	import flash.text.TextField; 
	import flash.text.TextFieldType; 
	import flash.text.TextFormat;      

	public class Main extends Sprite {      

		private var _goButton:Button; 
		private var _sineWriter:SineWriter; 
		private var _inputField:TextField;      

		public function Main():void { 
			init(); 
		}      

		private function init():void { 
			addWriter(); 
			addInputField(); 
			addButton(); 
		}      

		private function addWriter():void { 
			_sineWriter = new SineWriter("Default message.", new TextFormat(new HypatiaFont().fontName, 17)); 
			_sineWriter.y = 80; 
			_sineWriter.addEventListener(Event.COMPLETE, enableButton); 
			addChild(_sineWriter); 
		}      

		private function addInputField():void { 
			_inputField = new TextField(); 
			_inputField.type = TextFieldType.INPUT; 
			_inputField.defaultTextFormat = new TextFormat("_sans", 12); 
			_inputField.x = 10; 
			_inputField.y = 360; 
			_inputField.width = 250; 
			_inputField.height = 20; 
			_inputField.border = true; 
			_inputField.text = "Type a message here and hit GO."; 
			addChild(_inputField); 
		}      

		private function addButton():void { 
			_goButton = new Button(); 
			_goButton.label = "GO"; 
			_goButton.y = 359; 
			_goButton.x = 265; 
			_goButton.addEventListener(MouseEvent.CLICK, showText); 
			addChild(_goButton); 
		}      

		private function enableButton(e:Event):void { 
			_goButton.enabled = true; 
		}      

		private function showText(me:MouseEvent):void { 
			_goButton.enabled = false; 
			_sineWriter.removeMessage(); 
			_sineWriter.message = _inputField.text; 
			_sineWriter.writeMessage(); 
		} 
	} 
}
Date: