CellRenderer tutorial

Today I commit a new version of the Serializer Class.
What is Serializer Class?
This Class enable you to pass and receive complex data type from and to PHP using the native PHP functions serialize and unserialize (this means that you can receive an array directly from PHP without making any kind of split to obtain your original array).

After committing I also wrote a little tutorial on how to pass a PHP Class Object to Flash and how to bind the received value into a datagrid component using the cellRenderer api in order to customize its fields, adding checkboxes, numeric stepper and images to it…

You can find the tutorial here:
http://www.sephiroth.it/tutorials/flashPHP/cellRenderer/
More info about the cellRenderer APIs can be found here:
http://livedocs.macromedia.com/…/Documentation&file=16_cell4.htm

XML2Object

This class, that is just a translation of a simple set of function written for Flash MX, translates any kind of XML document into a readable Flash Object. This could be the core for projects XML oriented..
in fact i work often on xml based projects…

/**
* @class it.sephiroth.XML2Object
* @author Alessandro Crugnola
* @version 1.0
* @description return an object with the content of the XML translated
* NOTE: a node name with "-" will be replaced with "_" for flash compatibility.
* for example  will become FIRST_NAME
* If a node has more than 1 child with the same name, an array is created with the children contents
* The object created will have this structure:

* 	- obj {

*		nodeName : {

*			attributes : an object containing the node attributes

*			data : an object containing the node contents

*	}

* @usage data = new XML2Object().parseXML( anXML);
*/
//import utils.string

class it.sephiroth.XML2Object extends XML {
	private var oResult:Object = new Object ();
	private var oXML:XML;
	/**
	* @method get xml
	* @description return the xml passed in the parseXML method
	* @usage theXML = XML2Object.xml
	*/
	public function get xml():XML{
		return oXML
	}
	/**
	* @method public parseXML
	* @description return the parsed Object
	* @usage XML2Object.parseXML( theXMLtoParse );
	* @param sFile XML
	* @returns an Object with the contents of the passed XML
	*/
	public function parseXML (sFile:XML):Object {
		this.oResult = new Object ();
		this.oXML = sFile;
		this.oResult = this.translateXML();
		return this.oResult;
	}
	/**
	* @method private translateXML
	* @description core of the XML2Object class
	*/
	private function translateXML (from, path, name, position) {
		var xmlName:String;
		var nodes, node, old_path;
		if (path == undefined) {
			path = this;
			name = "oResult";
		}
		path = path[name];
		if (from == undefined) {
			from = new XML (this.xml);
			from.ignoreWhite = true;
		}
		if (from.hasChildNodes ()) {
			nodes = from.childNodes;
			if (position != undefined) {
				var old_path = path;
				path = path[position];
			}
			while (nodes.length > 0) {
				node = nodes.shift ();
				xmlName = node.nodeName.split("-").join("_");
				if (xmlName != undefined) {
					var __obj__ = new Object ();
					__obj__.attributes = node.attributes;
					__obj__.data = node.firstChild.nodeValue;
					if (position != undefined) {
						var old_path = path;
					}
					if (path[xmlName] != undefined) {
						if (path[xmlName].__proto__ == Array.prototype) {
							path[xmlName].push (__obj__);
							name = node.nodeName;
							position = path[xmlName].length - 1;
						} else {
							var copyObj = path[xmlName];
							path[xmlName] = new Array ();
							path[xmlName].push (copyObj);
							path[xmlName].push (__obj__);
							name = xmlName;
							position = path[xmlName].length - 1;
						}
					} else {
						path[xmlName] = __obj__;
						name = xmlName;
						position = undefined;
					}
				}
				if (node.hasChildNodes ()) {
					this.translateXML (node, path, name, position);
				}
			}
		}
		return this.oResult;
	}
}

An Example usage with this file:
http://www.sephiroth.it/tutorials/flashPHP/indice.xml

import it.sephiroth.XML2Object;
var oXML:XML = new XML ();
var sXML:String = "indice.xml";
oXML.ignoreWhite = true;
function xmlLoaded (success:Boolean) {
        if (success) {
                trace (success);
                _root.ObjFromXML = new XML2Object ().parseXML (this);
                delete this
        }
}
oXML.onLoad = xmlLoaded;
oXML.load (sXML);

undefined toString??

One of the things that it has always made me laugh on the new Flash AS2 is the translation of the undefined value (mmhh.. not a value, it’s undefined!).

a = undefined;trace(a.toString()) // undefined

b = a + " is not a string"trace(b) // "undefined is not a string"

???
Probably I don’t yet understand the strict data typing concept (quite sure), but undefined CAN’T be converted to "undefined".
It’s so Stupid for me!

A* PathFinder for Flash

Use the A* algorithm to create a path finder for your flash games.
The A* can be summarized as:

    setup the openlist (an array)
    setup the closedlist (an array)
    push the starting node to the open list (node is a square in our grid)
    while the openlist is not empty
        Look for the lowest 'f' cost node on the open list and pop from the openlist and name it 'current'
        if the current node is the goal then we found the solution, exit the while loop
        for each of the node adjacent to the current node (8 is we allow diagonal movement)
        set the parent of this adjacent to 'current'
                if a node with the same position as the adjacent node is in the open list /
                and its 'f' is lower than the node adjacent
                        then skip current adjacent node
                if a node with the same position is in closedlist /
                and its 'f' is lower
                        then skip current adjacent node
                otherwise push the current node to the open list
                remove occurences of adjacent node from OPEN and CLOSED list
                Add adjacent node to the OPEN list
        end for
        add the current node to the closed list
    end while

Read the article on my wiki
View the working example