One By One Design

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(); } } }
Posted by