topical media & game development
actionscript-book-ASCIIArt-com-example-programmingas3-asciiArt-AsciiArtBuilder.ax
actionscript-book-ASCIIArt-com-example-programmingas3-asciiArt-AsciiArtBuilder.ax
[swf]
flex
package
{
//import mx.core.Application;
import mx.controls.Label;
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
//import com.example.programmingas3.asciiArt.BitmapToAsciiConverter;
//import com.example.programmingas3.asciiArt.Image;
//import com.example.programmingas3.asciiArt.ImageInfo;
Provides appication-level functionality for the AsciiArt sample.
public class @ax-actionscript-book-ASCIIArt-com-example-programmingas3-asciiArt-AsciiArtBuilder extends EventDispatcher
{
// ------- Private vars -------
private const DATA_TARGET:String = "actionscript-book-ASCIIArt-txt-ImageData.txt";
private var _imageInfoLoader:URLLoader;
private var _imageStack:Array;
private var _currentImageIndex:uint;
// ------- Constructor -------
public function @ax-actionscript-book-ASCIIArt-com-example-programmingas3-asciiArt-AsciiArtBuilder(x:DisplayObject)
{
status = x as Label;
trace("construct");
_imageStack = new Array();
var request:URLRequest = new URLRequest(DATA_TARGET);
_imageInfoLoader = new URLLoader();
_imageInfoLoader.addEventListener(Event.COMPLETE, imageInfoCompleteHandler);
_imageInfoLoader.load(request);
}
// ------- Public Properties -------
public static const IMAGE_PATH:String = "actionscript-book-ASCIIArt-img-";
public var asciiArtText:String = "";
public function get currentImage():actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_Image
{
return _imageStack [currentImageIndex];
}
// -- my trace
public var status:Label;
private function trace( txt:String ):void {
status.text += txt + " ";
}
// ------- Event Handlers -------
Called when the image info text file is loaded.
private function imageInfoCompleteHandler(event:Event):void
{
var allImageInfo:Array = parseImageInfo();
trace("building");
buildImageStack(allImageInfo);
}
Called when the first image is loaded.
private function imageCompleteHandler(event:Event):void
{
// move to the first image in the stack
next();
// notify any listeners that the application has finished its initial loading
var readyEvent:Event = new Event("ready");
dispatchEvent(readyEvent);
}
// ------- Public Methods -------
Advances the image stack to the next image, and populates the asciiArtText property
with that image's ASCII Art representation.
public function next():void
{
// Advance the "current image" index (or set it back to 0 if we're on the last one)
_currentImageIndex++;
if (_currentImageIndex == _imageStack.length)
{
_currentImageIndex = 0;
}
// generate the ASCII version of the new "current" image
var imageConverter:actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_BitmapToAsciiConverter = new actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_BitmapToAsciiConverter(this.currentImage);
this.asciiArtText = imageConverter.parseBitmapData();
}
// ------- Private Methods -------
Parses the contents of the loaded text file which contains information about the images
to load, and creates an Array of ImageInfo instances from that data.
@return An Array of ImageInfo instances.
private function parseImageInfo():Array
{
var result:Array = new Array();
/* Parse the contents of the text file, and put its contents into an Array of ImageInfo
* instances.
* Each line of text contains info about one image, separated by tab (\t) characters,
* in this order:
* - file name
* - title
* - white threshold
* - black threshold
*
* Loop through the individual lines in the text file.
* Note that we skip the first line, since it only contains column headers.
*/
var lines:Array = _imageInfoLoader.data.split("\n");
var numLines:uint = lines.length;
for (var i:uint = 1; i < numLines; i++)
{
var imageInfoRaw:String = lines[i];
// trim leading or trailing white space from the current line
imageInfoRaw = imageInfoRaw.replace(/^ *(.*) *
Capitalizes the first letter of each word in a String, unless the word
is one of the English words which are not commonly capitalized
parameter: str The String to "normalize"
returns: The String with the words capitalized
private function normalizeTitle(title:String):String
{
var words:Array = title.split(" ");
var len:uint = words.length;
for(var i:uint; i < len; i++)
{
words[i] = capitalizeFirstLetter(words[i]);
}
return words.join(" ");
}
Capitalizes the first letter of a single word, unless it's one of
a set of words which are normally not capitalized in English.
parameter: word The word to capitalize
returns: The capitalized word
private function capitalizeFirstLetter(word:String):String
{
switch (word)
{
case "and":
case "the":
case "in":
case "an":
case "or":
case "at":
case "of":
case "a":
// don't do anything to these words
break;
default:
// for any other word, capitalize the first character
var firstLetter:String = word.substr(0, 1);
firstLetter = firstLetter.toUpperCase();
var otherLetters:String = word.substring(1);
word = firstLetter + otherLetters;
}
return word;
}
Using an Array of ImageInfo instances, populates the image stack with Image instances.
parameter: imageInfo An array of ImageInfo instances, containing the data about the
image files to be loaded into the image stack.
private function buildImageStack(imageInfo:Array):void
{
var image:actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_Image;
var oneImageInfo:actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_ImageInfo;
var listenerAdded:Boolean = false;
var numImages:uint = imageInfo.length;
for (var i:uint = 0; i < numImages; i++)
{
_currentImageIndex = 0;
oneImageInfo = imageInfo[i];
image = new actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_Image(oneImageInfo);
_imageStack.push(image);
if(!listenerAdded)
{
image.addEventListener(Event.COMPLETE, imageCompleteHandler);
listenerAdded = true;
}
image.load();
}
}
}
}
(C) Æliens
27/08/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.