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