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.