<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkMCR3w_eSp7ImA9WhRUFEw.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877</id><updated>2012-01-24T05:07:46.241-08:00</updated><category term="DAE" /><category term="ModelLoader" /><category term="TransformElement" /><category term="AIR 3.0" /><category term="UNION" /><category term="JAVA" /><category term="loadLanguageXML.Locale" /><category term="Proscenium" /><category term="Bitmap" /><category term="Motion" /><category term="Multiplayer server" /><category term="Flash" /><category term="Games" /><category term="Packing" /><category term="MD2" /><category term="SkinController" /><category term="AnimationTrack" /><category term="Biovision" /><category term="Bone" /><category term="Viewer" /><category term="Events" /><category term="Action Script" /><category term="MeshElementDataPolylist" /><category term="JSON" /><category term="Molehil" /><category term="Flash 11" /><category term="MeshDataElement" /><category term="Array of Arrays" /><category term="Zip" /><category term="Custom MovieClip" /><category term="Localization" /><category term="AS3" /><category term="Collada" /><category term="BlaseDS" /><category term="addSources" /><category term="Matrix" /><category term="Stage3D" /><category term="Stage 3D" /><category term="Multidimensional" /><category term="Multilanguage" /><category term="Character Animation" /><category term="String.Format" /><category term="BVH" /><category term="Vector" /><category term="AMF" /><category term="Optimization" /><category term="ScenMeshData" /><category term="AnimationController" /><category term="Serialization" /><title>Action Script Top Notch</title><subtitle type="html">Flash, Flex, Action Script, Games, Tutorials, libraries,frameworks, mobile, social network systems, virtual worlds, AI, Fuzzy logic</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://winxalex.blogspot.com/" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/AyfFy" /><feedburner:info uri="blogspot/ayffy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DU8ESXg9cSp7ImA9WhRQE0s.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-8915387644719893685</id><published>2011-11-24T12:36:00.001-08:00</published><updated>2011-12-08T10:10:08.669-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-08T10:10:08.669-08:00</app:edited><title>Facebook Application Development with Graph API Cookbook</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5YCbF5O2xlmDdV1dW5HXDUAwZjM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5YCbF5O2xlmDdV1dW5HXDUAwZjM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5YCbF5O2xlmDdV1dW5HXDUAwZjM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5YCbF5O2xlmDdV1dW5HXDUAwZjM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-q6yQ9MBXEWk/Ts6r9XhAsJI/AAAAAAAAAGU/6olq4V-pVtg/s1600/0928EXP_Facebook+Application+Development+with+Graph+API+Cookbook.jpg.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/news/moodle-festive-month" target="_blank"&gt;Find good discounts on this and other books.&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-8915387644719893685?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/Y8LXXW93iS8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/8915387644719893685/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/11/facebook-application-development-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8915387644719893685?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8915387644719893685?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/Y8LXXW93iS8/facebook-application-development-with.html" title="Facebook Application Development with Graph API Cookbook" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-q6yQ9MBXEWk/Ts6r9XhAsJI/AAAAAAAAAGU/6olq4V-pVtg/s72-c/0928EXP_Facebook+Application+Development+with+Graph+API+Cookbook.jpg.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/11/facebook-application-development-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GRnk9fip7ImA9WhRWF0Q.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-230091843619219080</id><published>2011-11-05T10:12:00.000-07:00</published><updated>2012-01-05T12:20:27.766-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-05T12:20:27.766-08:00</app:edited><title>How to Morph (manipulate vertices) Proscenium Stage3D Molehil</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_Dru3imvfbsXHLacf0WfLq5REuk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_Dru3imvfbsXHLacf0WfLq5REuk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_Dru3imvfbsXHLacf0WfLq5REuk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_Dru3imvfbsXHLacf0WfLq5REuk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&amp;nbsp;In Procenium you can't do something like this&lt;br /&gt;
&lt;div style="color: #274e13; text-align: center;"&gt;
(i-th v-vertex of some mesh)&lt;/div&gt;
&lt;div style="color: #274e13; text-align: center;"&gt;
v[i].x=0.5&lt;/div&gt;
&lt;div style="color: #274e13; text-align: center;"&gt;
v[i].y=0.5&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="color: #274e13;"&gt;v[i].z=0.3&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
as you would do in some others frameworks.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The above code in basic tough would mean creation of buffer for one vertex and upload modification into GPU. What about you need to modify many vertices (or all) of the mesh as you will do in the morphing???&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/bin/TestVertices.html" target="_blank"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-jtM-E0JfOxY/TrVswDU9h4I/AAAAAAAAAF8/irYjY_4gG3o/s400/Clipboard01.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
After creation of the &lt;i&gt;MeshElement&lt;/i&gt; from &lt;i&gt;MeshData&lt;/i&gt; local buffer with 3 sets of data is created and uploaded &lt;i&gt;VertexBuffer3DHandle.uploadFromVector&lt;/i&gt;(I couln't understand why is internal when &lt;i&gt;uploadFromByteArray &lt;/i&gt;is public)&lt;i&gt; and&amp;nbsp;&lt;/i&gt;&lt;i&gt; &lt;/i&gt;to GPU. &lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;i&gt;Indices Set&lt;/i&gt; - contains indices of the vertex info in vertices setset&amp;nbsp; &lt;span style="color: #274e13;"&gt;ex. index[0,1,2...]=30,10,12 ...&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
inx ex. 30 means 30-th group of vertices set actually vertexSet[30 * stride]&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;i&gt;Vertices Set&lt;/i&gt; -contains vertex info for every primitive in successive order as defined&lt;br /&gt;
in &lt;a href="http://winxalex.blogspot.com/2011/10/md2-model-loader-proscenium-3d.html" target="_blank"&gt;primitive's index vector&lt;/a&gt;&lt;br /&gt;
&lt;span style="color: #274e13;"&gt;.... v30posX,v30posY, v30posZ u30,v30,v30normXv30normY,v30normZ,...(stride=8)&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;i&gt;Joints Set -...&lt;/i&gt;(think which vertices are connected&lt;i&gt; &lt;/i&gt;to which joint)&lt;br /&gt;
&lt;br /&gt;
Idea was changing the content of the verticesSet and upload to the bufffer. &lt;br /&gt;
&amp;nbsp;You could obtain copy &lt;i&gt;Indices Set &lt;/i&gt;and &lt;i&gt;Vertices Set &lt;/i&gt;thru MeshUtils.getCopy but I didn't find way to change their content. Other problem was there is no information about vector indices inside &lt;i&gt;Vertices Set &lt;/i&gt;used&amp;nbsp; so you know which value inside vertices set belong to which vertex. Luckily I found local structure created during proccesing of MeshData of type &lt;i&gt;IndexHashMap(simple but powerful packing)&lt;/i&gt; which actually contain just that information and expose it to subclasses.&lt;br /&gt;
&lt;span style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v[3]=[0,12,29..] //&lt;/span&gt;&amp;nbsp;&lt;span style="color: #274e13;"&gt; 3-th vertex is involved into face 0,12 and 29...&lt;/span&gt;&lt;br /&gt;
As much Adobe tried go more on speed and make easy for designers (of course no one want to reinvent the wheel), seems framework is very close by my opinion ,especially when you need for example create your custom &lt;i&gt;MeshElement&lt;/i&gt; and &lt;i&gt;MeshElementData&lt;/i&gt; or its super classes like &lt;i&gt;MeshPolylistElementData&lt;/i&gt;, from one side from the other side back to writing assembler to make particles (of course for custom shader but let's write binary for other cases it will be more easy :)) when we have high level languages) &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
Update 05.01.12.&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I found reference of this post on one Japanese blog about better solution by creation and removing MeshElements with every vertex change as cleaner solution. I agree (similar thing is done in my MD2 importer) but influence to performance is very big and sometimes thing must be ugly :)) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestVertices.zip"&gt;Source&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-230091843619219080?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/N95zXJz2iAQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/230091843619219080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/11/how-to-morph-manipulate-vertices.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/230091843619219080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/230091843619219080?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/N95zXJz2iAQ/how-to-morph-manipulate-vertices.html" title="How to Morph (manipulate vertices) Proscenium Stage3D Molehil" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-jtM-E0JfOxY/TrVswDU9h4I/AAAAAAAAAF8/irYjY_4gG3o/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/11/how-to-morph-manipulate-vertices.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQNQnc-eyp7ImA9WhRSFUk.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-6916962570997346822</id><published>2011-11-04T02:00:00.000-07:00</published><updated>2011-11-17T08:29:53.953-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-17T08:29:53.953-08:00</app:edited><title>How to cook Flash Facebook games and social application (Tips and tricks)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/g-Arzvz5esVzF4iBnEVvmetYsbs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/g-Arzvz5esVzF4iBnEVvmetYsbs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/g-Arzvz5esVzF4iBnEVvmetYsbs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/g-Arzvz5esVzF4iBnEVvmetYsbs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;As Facebook lack of good documentation and also support of Adobe is somekind of open project I find useful to write few tips that will save you time and headeches.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tip1:&lt;/b&gt; Avoid using obsolete technologies&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;FBJS&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;RestAPI&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;FBML&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="text-align: justify;"&gt;
and tones of google trashy old tutorials. This is very hard as Facebook changes are very often (lately I found that have changed &lt;i&gt;auth.statusChange&lt;/i&gt; event status from &lt;b&gt;not_connected&lt;/b&gt; to &lt;b&gt;not_authorized&lt;/b&gt;) but investing in legacy technologies in only if you desperate . This tips might be obsolete too so be careful and read what is newest.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Tip2:&amp;nbsp; &lt;/b&gt;HTML container page&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
Its not enough to download and included &lt;a href="http://code.google.com/p/facebook-actionscript-api/" target="_blank"&gt;FlashFacebook&lt;b&gt; &lt;/b&gt;swc API's&lt;/a&gt;&lt;b&gt; . FlashFacebook API's are using ExternalInterface for communication to JS. &lt;/b&gt;If you check Facebook documentation 99% of examples&amp;nbsp; not telling to include JSDK js to your html page:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;lt; script src="http://connect.facebook.net/en_US/all.js" type="text/javascript" &amp;gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
don't forget to put this layer inside body tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; div id="fb-root" &amp;gt;&lt;br /&gt;
&lt;br /&gt;
in you swfobject.js code you should have(one is used by IE and one for FF):&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;var attributes = {};&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; attributes.id = "qol";&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; attributes.name = "qol";&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tip3: &lt;/b&gt;What and where work&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
Most of things work in AIR but not in web application.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;Facebook.init("&lt;b&gt;YOUR_APP_ID&lt;/b&gt;", onFacebookInit);&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;onFacebookInit&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;would not fire local or localhost&amp;nbsp; so you need to upload online host on which your Facebook app settings point to then change DEBUG configuration to debug from online&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected function onFacebookInit(success:Object, fail:Object):void {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (success) {&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Facebook.login(onFacebookLogin);&amp;nbsp;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="color: white;"&gt;
&lt;b&gt;Facebook.login&lt;/b&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&amp;nbsp; if you are logged and authorized app would do nothing&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;nbsp; if you aren't logged would open login dialog (then if you not authorized application would open permission dialog)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;nbsp; if you are logged and not_authorized app would open permission dialog&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;every of above situation if successful&amp;nbsp; would trigger &lt;/b&gt;&lt;i&gt;onFacebookInit&lt;/i&gt; &lt;b&gt;too&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Tip4:&lt;/b&gt; Invite friends&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;span style="color: red;"&gt;&amp;nbsp; Facebook.ui("apprequests",{message:"Join Quest of Legends Game",picture:"http://www.google.com/intl/en_com/images/srpr/logo3w.png",description:"Quest of legends is very addictive...",caption: "Quest of Legends"},onFriendsHandler);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: white;"&gt;
&lt;b&gt;-message&amp;nbsp; (required)&lt;/b&gt;&lt;/div&gt;
&lt;div style="color: white;"&gt;
&lt;b&gt;- to: '499802820,499802852'....users id's&amp;nbsp; (omitting it mean everyone)&lt;/b&gt;&lt;/div&gt;
&lt;b style="color: white;"&gt;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b style="color: white;"&gt;Tip5:&lt;/b&gt;&lt;b&gt;&lt;/b&gt;Buy credits&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt; works only if you access your html page containing swf thru http://apps.facebook.com/YOUR_APP_ID/ as canvas page&lt;br /&gt; &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="color: red;"&gt;Facebook.ui('pay', {credits_purchase: true }, onFacebookCreditsPurchase );&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tip5:&lt;/b&gt;Track user status&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
If you not track if user is still logged or not or something happen your game or app might blow so its good you listen for this event:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;Facebook.addJSEventListener("auth.statusChange", statusChangeHandler);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;protected function statusChangeHandler(result:Object):void {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (result &amp;amp;&amp;amp; result.status) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; switch (result.status) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case "connected":&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; isLoggedOn = true;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; trace ( "User is logged in and authorised our application.");&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case "not_authorized":&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; isLoggedOn = false;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; trace "User is logged in but has not authorised our application.");&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; default:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; Facebook.login(onFacebookLogin);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; isLoggedOn = false;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; trace( "Status Unknown.");&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tip6:&lt;/b&gt;Publish status/feed&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;woudn't work if you aren't logged&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="color: red;"&gt;Facebook.api("/me/feed",submitPostHandler,{message:text},"POST");&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;br /&gt;
&lt;a href="http://www.amazon.co.uk/s/ref=nb_sb_ss_i_0_15/277-4499114-3348816?url=search-alias%3Daps&amp;amp;field-keywords=flash+facebook+cookbook&amp;amp;x=0&amp;amp;y=0&amp;amp;sprefix=Flash+Facebook+" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51Mg8lX0t3L._SL160_PIsitb-sticker-arrow-dp,TopRight,12,-18_SH30_OU02_AA115_.jpg" /&gt;&lt;/a&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Recently I encounter one great book on very hot topic and it was honоr that reviewing is being granted to me . &lt;b&gt;Cooking games and social application of Facebook!!!&lt;/b&gt;.&lt;strike&gt; I'm still reviewing it but&lt;/strike&gt; found very useful for someone want to learn to use of Facebook API's fast and in deep, and what is most important is that realtime situations are covered with example source code.&lt;/div&gt;
&lt;br /&gt;
So I warmly recommend it.&lt;a href="http://www.packtpub.com/flash-facebook-cookbook-for-graph-api-applications/book"&gt;FaceCookbook&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-6916962570997346822?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/X1FI2MfDRWk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/6916962570997346822/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/11/flash-face-cookbook.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6916962570997346822?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6916962570997346822?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/X1FI2MfDRWk/flash-face-cookbook.html" title="How to cook Flash Facebook games and social application (Tips and tricks)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/11/flash-face-cookbook.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQCRnk6eyp7ImA9WhRTEUU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-8347284548905735662</id><published>2011-10-30T13:26:00.000-07:00</published><updated>2011-11-01T13:46:07.713-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-01T13:46:07.713-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Viewer" /><category scheme="http://www.blogger.com/atom/ns#" term="Packing" /><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="Proscenium" /><category scheme="http://www.blogger.com/atom/ns#" term="Stage 3D" /><category scheme="http://www.blogger.com/atom/ns#" term="Zip" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash 11" /><category scheme="http://www.blogger.com/atom/ns#" term="DAE" /><category scheme="http://www.blogger.com/atom/ns#" term="AIR 3.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Collada" /><title>Collada DAE to  Proscenium ActionScript Export Stage3D Flash11</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Kpotm0QncyyaN-xW1q0WMyDR8iI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Kpotm0QncyyaN-xW1q0WMyDR8iI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Kpotm0QncyyaN-xW1q0WMyDR8iI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Kpotm0QncyyaN-xW1q0WMyDR8iI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XML that X stating for exchange is well known format of exchanging files between different systems, programs and worlds. Thru Collada specification and its xml file format .dae&amp;nbsp; users could exchange 3D files created in diffrent 3D environments like Maya, 3D Max, Blender, Daz and so on... and this exchanging file format got supported in Procsenium as well. &lt;br /&gt;
&amp;nbsp;Having simple running animation of woman model having 51777 vertices in my DAZ exported .dae file, file reach 6.5MB (excluding all unnecessary and unsupported things like morphs) + 1.15MB jpg textures. By zipping DAE file I decrease it to 1.19MB (maybe some packing methods like built in Proscenium LZH would return even better results) but also increase the size of main.swf file, now containing the compression libraries and additional time to for unzipping. Also parsing of text file isn't avoided. All in all parsing of such big .dae (text files) takes a lot to time so I couldn't find logic in using DAE files by many developers in production phase. So lets underline again word &lt;u&gt;&lt;b&gt;EXCHANGE&lt;/b&gt;&lt;/u&gt;. By my opinion as clearly stated we should use .dae files for exchange and inside the Flash platform swf,swc as we would use .max files in 3DMAX or .obj files in WAVEFRONT...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Being stubborn myself and want to prove the concept to other developers I built little AIR application that can preview &lt;b&gt;.dae&lt;/b&gt; files and export then as &lt;b&gt;.as&lt;/b&gt; .&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-24u9sdQUEW8/Tq2th4Dg7RI/AAAAAAAAAF0/YcCfEXPUmJ0/s1600/Clipboard01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="388" src="http://2.bp.blogspot.com/-24u9sdQUEW8/Tq2th4Dg7RI/AAAAAAAAAF0/YcCfEXPUmJ0/s640/Clipboard01.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp; with options, texture files to be embed or loaded for external source. By using embed option (model+bones+animation+texture files) I succeed in getting export of 3.44MB &lt;a href="http://www.winx.ws/blog/TestExports.html"&gt;swf&lt;/a&gt; size loading in less then 5s.&lt;br /&gt;
Exporter can create ActionScript files:&lt;br /&gt;
&lt;br /&gt;
-Model.as that is planned for raw inclusion in your project. &lt;br /&gt;
-Model.as that is planned as external swf/swc and then loaded in main.swf. (6.5MB .dae was 4.5MB swf)&lt;br /&gt;
swf doesn't contain Proscenium.swc so duplication of&amp;nbsp; Proscenium.swc requred inclusion in main.swf&amp;nbsp; is avoided with bit loss of creation speed using &lt;i&gt;getDefinitionByName&lt;/i&gt; function.&lt;br /&gt;
Model.as in both cases could have source for loading textures or to embed them&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;There lot of space of improvements and upgrades like using ByteArrays or BinarySerialization to pack model data inside .as.&lt;br /&gt;
Next: &lt;br /&gt;
Option of generation of relative texture urls is in plan and prevention of duplication of embedlinks. (Currently manual fixed)&lt;br /&gt;
Reduce decimals like this 0.35814398527145386 to 6 digits think its enough?&lt;br /&gt;
&amp;nbsp;I wish to hear your toughs or at least support so I can provide more to the community and my 3 weeks day night effort isn't futile.&lt;br /&gt;
Someone said saying great model as this is not show case :))))).&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/Exporter.zip"&gt;Source(+ air installation)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestExporter.zip"&gt;Test project file&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-8347284548905735662?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/uY14278R5So" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/8347284548905735662/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/10/collada-dae-to-proscenium-actionscript.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8347284548905735662?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8347284548905735662?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/uY14278R5So/collada-dae-to-proscenium-actionscript.html" title="Collada DAE to  Proscenium ActionScript Export Stage3D Flash11" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-24u9sdQUEW8/Tq2th4Dg7RI/AAAAAAAAAF0/YcCfEXPUmJ0/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/10/collada-dae-to-proscenium-actionscript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8ER346eip7ImA9WhRTEkk.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-3414201822905706850</id><published>2011-10-24T12:58:00.000-07:00</published><updated>2011-11-02T08:13:26.012-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-02T08:13:26.012-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Bone" /><category scheme="http://www.blogger.com/atom/ns#" term="Molehil" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="AnimationTrack" /><category scheme="http://www.blogger.com/atom/ns#" term="BVH" /><category scheme="http://www.blogger.com/atom/ns#" term="Proscenium" /><category scheme="http://www.blogger.com/atom/ns#" term="TransformElement" /><category scheme="http://www.blogger.com/atom/ns#" term="Motion" /><category scheme="http://www.blogger.com/atom/ns#" term="Stage3D" /><category scheme="http://www.blogger.com/atom/ns#" term="AnimationController" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash 11" /><category scheme="http://www.blogger.com/atom/ns#" term="Biovision" /><category scheme="http://www.blogger.com/atom/ns#" term="SkinController" /><title>Import BVH BioVision motion Proscenium Stage 3D Flash11</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YgdBI6hdbXzqapdo5htjt-rPLKY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YgdBI6hdbXzqapdo5htjt-rPLKY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YgdBI6hdbXzqapdo5htjt-rPLKY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YgdBI6hdbXzqapdo5htjt-rPLKY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
In order to do some custom animation or use external motion(animation) files you need to understand how animation works in Proscenium. &lt;/div&gt;
&lt;div class="separator" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/bin/TestBVH.html"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-3QPfReFdLCI/TqXCwWzm-8I/AAAAAAAAAFk/muDRcfcnsq8/s1600/Clipboard01.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
!!! Click twice on the buttons &amp;lt;-temp solution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;AnimationController - controls animation timeline and contain animation tracks.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; animationController = new AnimationController(name + "AnimationController");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if you do&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt; animationController.time=0.5;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
it will jump to 0.5s in time. &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Sampler&lt;/i&gt;&amp;nbsp; - gives interpolated output value based on sampler function, time(keyframes) and input values. All samplers have times vector with incremental time values in which transformation happen - actually KEYFRAMES.&lt;br /&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;_times=Vector[0,0.5,0.78,..]&lt;/div&gt;
&lt;br /&gt;
and input values in different format depends of type of sampler you use and transform element you plan to target.&lt;br /&gt;
&lt;i&gt;SamplerNumber, &lt;/i&gt;&lt;i&gt;SamplerBezierCurve&lt;/i&gt;&lt;i&gt; &lt;/i&gt;gave single output number value so can be used with trasformations like &lt;i&gt;TransformElementTranslate,TransformElementRotate,TransformElementScale&lt;/i&gt;&lt;br /&gt;
and &lt;i&gt;SamplerNumberMatrix3D &lt;/i&gt;giving matrix as output so should be used with &lt;i&gt;TransformElementMatrix&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;//create Sampler&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt; sampler = new SamplerNumber(_times, inputValuesVector);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warning only &lt;i&gt;SamplerNumber&lt;/i&gt;, &lt;i&gt;SamplerMatrix3D&lt;/i&gt;, &lt;i&gt;SamplerBezierCurve&lt;/i&gt; are functional the others aren't implemented yet. &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;AnimationTrack&lt;/i&gt; - binds sampler output to target source's transformation elements not to scene node transform directly.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;span style="color: #38761d;"&gt;&amp;nbsp; //create Track&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt; track = new AnimationTrack(animationController, sampler, targetSource);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
SceneNode contains transform steak which contains transform elements.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt; node.transformStack = new TransformStack();&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #38761d;"&gt; //bone.transformStack.push(new TransformElementMatrix("&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID&lt;/span&gt;&lt;span style="color: #38761d;"&gt;", matrix));&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bone.transformStack.push(new TransformElementRotate("rotateX"));&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bone.transformStack.push(new TransformElementRotate("rotateY"));&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bone.transformStack.push(new TransformElementRotate("rotateZ"));&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #38761d;"&gt;&amp;nbsp; //targetSource is&amp;nbsp; string in format&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; //&lt;/span&gt;&lt;span style="color: #38761d;"&gt; if transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementMatrix&lt;/i&gt;&lt;span style="color: #38761d;"&gt; "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID"&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if &lt;/span&gt;&lt;span style="color: #38761d;"&gt; transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementRotate&lt;/i&gt;&lt;span style="color: #38761d;"&gt; "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID.ANGLE"&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // if &lt;/span&gt;&lt;span style="color: #38761d;"&gt; transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementTranslate&lt;/i&gt;&lt;span style="color: #38761d;"&gt; planned to translate X "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID.X"&lt;/span&gt;&lt;span style="color: #38761d;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if &lt;/span&gt;&lt;span style="color: #38761d;"&gt; transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementTranslate &lt;/i&gt;&lt;span style="color: #38761d;"&gt;planned to translate Y&lt;/span&gt;&lt;span style="color: #38761d;"&gt; "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID.Y"&lt;/span&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if &lt;/span&gt;&lt;span style="color: #38761d;"&gt; transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementTranslate &lt;/i&gt;&lt;span style="color: #38761d;"&gt;planned to translate Z&lt;/span&gt;&lt;span style="color: #38761d;"&gt; "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID.Z"&lt;/span&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;//Connect transform steak with node transform&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 
&lt;span style="color: red;"&gt;&amp;nbsp;Attribute.connect(bone.transformStack.attribute(Transformer.ATTRIBUTE_TRANSFORM),
 bone.attribute(SceneNode.ATTRIBUTE_TRANSFORM));&lt;/span&gt;&lt;span style="color: #38761d;"&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #38761d;"&gt; //add track to controller &lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt;&amp;nbsp; animationController.addTrack(track); &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In &lt;i&gt;onAnimate&lt;/i&gt; loop (enterframe) playback of time happen (of course calculating interpolated transformation samples, applying of transformations to the targets and re-render)&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; override protected function onAnimate(t:Number, dt:Number):void&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (!_initialized)&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for each (var animationController:AnimationController in animations)&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; animationController.time = (t % animation.length) + animation.start;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/div&gt;
&lt;br /&gt;
You can also animate node by appending translation,rotation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
override protected function onAnimate(t:Number, dt:Number):void{&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp; myNode.appendRotation(angle,arroundWhichAxes);//Vector3D.Y_Axis &amp;lt;--- arround y axis&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp; &amp;nbsp; myNode.appendTranslation(translationx,translationy,transaltionz);&lt;/div&gt;
&lt;div style="color: red;"&gt;
} &lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestBVH.zip"&gt;Source&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-3414201822905706850?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/mkcS3leGom4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/3414201822905706850/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/10/import-bvh-biovision-motion-proscenium.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3414201822905706850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3414201822905706850?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/mkcS3leGom4/import-bvh-biovision-motion-proscenium.html" title="Import BVH BioVision motion Proscenium Stage 3D Flash11" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-3QPfReFdLCI/TqXCwWzm-8I/AAAAAAAAAFk/muDRcfcnsq8/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/10/import-bvh-biovision-motion-proscenium.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04BSX89eCp7ImA9WhRTFE0.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-5275454085635009205</id><published>2011-10-13T16:29:00.001-07:00</published><updated>2011-11-04T03:19:18.160-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-04T03:19:18.160-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MD2" /><category scheme="http://www.blogger.com/atom/ns#" term="addSources" /><category scheme="http://www.blogger.com/atom/ns#" term="MeshDataElement" /><category scheme="http://www.blogger.com/atom/ns#" term="Stage 3D" /><category scheme="http://www.blogger.com/atom/ns#" term="ScenMeshData" /><category scheme="http://www.blogger.com/atom/ns#" term="ModelLoader" /><category scheme="http://www.blogger.com/atom/ns#" term="MeshElementDataPolylist" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash 11" /><title>MD2 Model loader Proscenium framework Stage3D API  (Flash11)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xfetz7SHRywXnan3SXdgeCM-8CE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xfetz7SHRywXnan3SXdgeCM-8CE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xfetz7SHRywXnan3SXdgeCM-8CE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xfetz7SHRywXnan3SXdgeCM-8CE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Proscenium is experimental framework as Adobe says. Used to very user friendly PV3D,Away3D and Alternativa frameworks +plus they are opensource, found Proscenium at least different approach. I expected that black box would be on top of ability of vertex manipulation. Not far far above restricting developer freedom to Adobe's ideas how things should go. Main problem with all big companies and the King is that, they rare walk between people. As a project manager I would listen people's chat/ideas/forums then draw development direction instead thinking that we are the smartest and we are only untouchable politics creators. I could now enter into discussion of clumsy Adobe's tweeners to libraries as Tweener and TweenLite and signals compared to dispatch event system... As is obvious that I don't want restriction (restricted to load DAE,OBJ..) files. I wanted to load Quake2 MD2 as very useful in games, when you don't need complex models with bones and skinning, but cheaper,easy to create, with animation several moves and low number of polygons("low" in past wasn't too low :))&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestMD2Loader.html"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5663123462503848562" src="http://2.bp.blogspot.com/-Yft8j28HQAQ/Tpd0yN242nI/AAAAAAAAAFc/8TDdeEkXoho/s400/Clipboard01.jpg" style="cursohttp: //www.blogger.com/img/blank.gifr:hand; cursor: pointer; display: block; height: 294px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
In short to build loader you need to extend &lt;span style="font-style: italic;"&gt;ModelLoader&lt;/span&gt; class with already binary and text loader helper and event handling mechanism ....&lt;br /&gt;
When item is loaded you use loader.model.addTo(sceneNode) function from &lt;span style="font-style: italic;"&gt;ModelData&lt;/span&gt; and returns &lt;span style="font-style: italic;"&gt;ModelManifest. &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;ModelManifest &lt;/span&gt;is document containing info of loaded bones,meshes,animations,materials...&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Magnificent &lt;i&gt;addTo &lt;/i&gt;function do everything so find out this approach less customizable for example if you want to init &lt;span style="font-style: italic;"&gt;SceneMesh&lt;/span&gt;.userData during creation of the mesh not after adding on scene.&lt;br /&gt;
It create materials,meshes,bones,nodes??? from MaterialData,MeshElementData,BonesData,SceneNodeData create model manifest and add all nodes and subnodes to scene.&lt;br /&gt;
&amp;nbsp;After parsing of data this strucutre should be created&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ModelData&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;SceneNodeData&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;MeshData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First we define types of vertex inputs or properties. Position,Texcoord,Normal&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&lt;span style="font-size: small;"&gt;meshData.addVertexInput(new Input(Input.SEMANTIC_POSITION, "positions", 0));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&amp;nbsp;meshData.addVertexInput(new Input(Input.SEMANTIC_TEXCOORD, "texcoords", 1));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&amp;nbsp;meshData.addVertexInput(new Input(Input.SEMANTIC_NORMAL, "normals", 2));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;//indices 0,1,2 specify&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;how array of primitives would be filled with vertex values( &lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;x1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;y1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;z1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;u1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;v1,w1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt; nx1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,ny1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;nz1&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
add sources to of the Inputs&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;meshData.addSource(new Source("texcoords", new ArrayElementFloat(texcoords), 2));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;// index 2 mean that&amp;nbsp; data in texcoords would be read by pairs texcoords=[u1,v1,u2,v2,u3,v3....num_texcoords pairs&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;meshData.addSource(new Source("positions", &lt;/span&gt;&lt;span style="font-size: small;"&gt;new ArrayElementFloat(&lt;/span&gt;&lt;span style="font-size: small;"&gt;positions), 3));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;// index 3 mean that&amp;nbsp; data in position would be read by tripples texcoords=[x1,y1,z1, next tripple x2,y2,z2...&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;num_vertices&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;meshData.addSource(new Source("normals", &lt;/span&gt;&lt;span style="font-size: small;"&gt;new ArrayElementFloat(normals)&lt;/span&gt;&lt;span style="font-size: small;"&gt;, 3));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: white;"&gt;
&lt;span style="font-size: small;"&gt;Create MeshElementData&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;var polylist:MeshElementDataPolylist = new MeshElementDataPolylist(meshData, meshData.vertexInputs,num_primitives, primitives, null, vcount, "MeshElementDataPolylistDoll", "materialName");&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//primitives array containing vertex position, texcoord, normal, index triples&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//ex primitives=[0,1,2, 0,2,3...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//ex. 0,1,2 =&amp;gt; 0 is index inside vertex position array, 1=&amp;gt; is index inside texture cords array, 2=&amp;gt; index inside vertex normals postion&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//vcount is array showing how many vertices in primitives array make primitive(face/polygon).(index&amp;gt;3)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//ex. vcount=[3,4,3,4,3,5...]&amp;nbsp; so first primitive is formed of 3 groups of &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;( x1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;y1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;z1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;u1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;v1,w1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt; nx1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,ny1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;nz1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;)&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #274e13;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
And workhorse is MeshElementDataSource that extends MeshElement process and puck all data and source of vertices, normals and texcoords to structures and buffers ready for AGAL Compiler.&lt;br /&gt;
How we can access vertices(and structures containing data) so we can apply some transformation???&lt;br /&gt;
To expose them we need to extend &lt;span style="font-style: italic;"&gt;MeshElementDataSource&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;MeshElementDataPolylist &lt;/span&gt;so I can access &lt;i&gt;vertexSources&lt;/i&gt; and &lt;i&gt;vertexIndices&lt;/i&gt;&lt;span style="font-style: italic;"&gt;??? &lt;/span&gt;Ofcourse vetex positions and normals should be calculated before putting inside this structures.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-size: 85%;"&gt;&lt;br /&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;override protected function initModels():void&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;        {&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            //super.initModels();&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            var md2Model:String =&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            //"../res/models/"+&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"doll.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"box.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"spos_body.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"spos_weapon.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"spos_body.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                "tris.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            _md2Loader = new MD2Loader(md2Model );&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-size: 85%;"&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            _md2Loader.addEventListener( Event.COMPLETE, completeEventHandler, false, 0, true );&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;        }&lt;/span&gt;                  &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;protected function completeEventHandler(event:Event):void&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;var loader:MD2Loader = event.target as MD2Loader;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;var manifest:ModelManifest = loader.model.addTo(scene);&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;_mesh = manifest.meshes[0];&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;... &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As half of Proscenium lean towards handling Collada files it is important to check Collada specification.&lt;br /&gt;
&lt;br /&gt;
Many thanks to my friend Tim Knip for quick 3D tips and creator of extraordinary Collada library &amp;nbsp; .&lt;br /&gt;
&lt;br /&gt;
You will also need Proscenium framework from &lt;a href="http://labs.adobe.com/technologies/proscenium/"&gt;Adobe site&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestMD2Loader.zip"&gt;Source&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-5275454085635009205?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/ZtvUmLnWxQw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/5275454085635009205/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/10/md2-model-loader-proscenium-3d.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5275454085635009205?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5275454085635009205?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/ZtvUmLnWxQw/md2-model-loader-proscenium-3d.html" title="MD2 Model loader Proscenium framework Stage3D API  (Flash11)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Yft8j28HQAQ/Tpd0yN242nI/AAAAAAAAAFc/8TDdeEkXoho/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/10/md2-model-loader-proscenium-3d.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4GQXo6fCp7ImA9WhZQFUQ.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-3394220897763110258</id><published>2011-04-23T13:16:00.000-07:00</published><updated>2011-04-23T13:35:20.414-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-23T13:35:20.414-07:00</app:edited><title>Flex4 Custom Validator (Compare and Multifields)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mlFMv0Fl2-kVanYTIfYeF6srTy4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mlFMv0Fl2-kVanYTIfYeF6srTy4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mlFMv0Fl2-kVanYTIfYeF6srTy4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mlFMv0Fl2-kVanYTIfYeF6srTy4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;I've been not satisfied by Adobe example of making custom validators making model object when you need to compare 2 or more fields. For example you want to compare password fields or you want to compare several string fields not duplicating same StringValidators.  I found on net lot of hacking solution but not one clean.&lt;br /&gt;So after spending several hrs exploring how Validators are functioning and found that grail was "listener" parameter. Seal source param by overloading it. Create sources field to accept sources involved in validation.&lt;br /&gt;By switching the listener switch source of error listening.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;span style="font-family:verdana;"&gt;package components&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import flash.events.IEventDispatcher;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.core.mx_internal;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.events.FlexEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.events.ValidationResultEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.validators.IValidatorListener;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.validators.StringValidator;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.validators.ValidationResult;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.validators.Validator;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import spark.components.TextInput;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  public class CompareValidator extends StringValidator&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _sources:Array;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _actualTriggers:Array;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _emptyErrorMessage:String="No value to compare with ";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _compareErrorMessage:String="Comparation equality failed";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _minmaxErrorMessage:String="Length of value should be between min and max";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function CompareValidator()&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          super();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function get actualTriggers():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return _actualTriggers;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      [Bindable]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function set actualTriggers(value:Array):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          _actualTriggers = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      [Bindable]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function get compareErrorMessage():String&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return _compareErrorMessage;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function set compareErrorMessage(value:String):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          _compareErrorMessage = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      [Bindable]&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function set sources(value:Array):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          removeTriggerHandler()&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          _sources = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          _actualTriggers=_sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          listener=_sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          addTriggerHandler();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function get sources():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return _sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      override public function get source():Object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      override public function set source(value:Object):void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      /**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;         &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;       *  @private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;       */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private function addTriggerHandler():void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          if (_actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              for each(var trigger:IEventDispatcher in actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              trigger.addEventListener(FlexEvent.VALUE_COMMIT, triggerHandler);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private function triggerHandler(e:FlexEvent):void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          validate();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      /**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;       *  @private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;       */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private function removeTriggerHandler():void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          if (actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              for each(var trigger:IEventDispatcher in actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              trigger.removeEventListener(FlexEvent.VALUE_COMMIT, triggerHandler);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      override public function validate(value:Object=null, suppressEvents:Boolean=false):ValidationResultEvent&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;         &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          if (required)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                  &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              var errorResults:Array = doValidation(null);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              // Validate if the target is required or our value is non-null.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              return handleResults(errorResults);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              // We assume if value is null and required is false that&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              // validation was successful.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              var resultEvent:ValidationResultEvent =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  new ValidationResultEvent(ValidationResultEvent.VALID);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              if (!suppressEvents &amp;amp;&amp;amp; enabled)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                             &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  dispatchEvent(resultEvent);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              return resultEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      override protected function doValidation(value:Object):Array {&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          // Clear results Array.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          var results:Array = [];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          var comparationValue:String;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          var stringResults:Array;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          if(_sources)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              for(var i:int=0;i&amp;lt;_sources.length;i++){&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  comparationValue=String(_sources[i][property]);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  results=super.doValidation(comparationValue);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  listener=_sources[i];&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  if(results.length){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                      this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.INVALID,false,false,_sources[i].id,results));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  }else if (!compareWithRest(comparationValue)){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                                     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                      results[results.length]=new ValidationResult(true,"","",_compareErrorMessage);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                      this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.INVALID,false,false,_sources[i].id,results));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  }else{&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                      this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.VALID,false,false,_sources[i].id));&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              }     &lt;/span&gt;&lt;/span&gt;                                  &lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return results;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;              &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private function compareWithRest(comparationValue:String):Boolean&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          var result:Boolean=true;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          for(var i:int=0;i&amp;lt;_sources.length;i++){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              if(_sources[i][property]!=comparationValue) return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return result;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                                  &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;package components&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.controls.TextInput;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.events.FlexEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.events.ValidationResultEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.messaging.FlexClient;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.olap.aggregators.MinAggregator;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.validators.CreditCardValidator;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.validators.StringValidator;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.validators.ValidationResult;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.validators.Validator;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    public class MultiStringValidator extends StringValidator&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private var _sources:Array;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private var _actualTriggers:Array;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function MultiStringValidator()&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            super();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function get actualTriggers():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;          &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return _actualTriggers;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        [Bindable]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function set actualTriggers(value:Array):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            _actualTriggers = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        [Bindable]&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function set sources(value:Array):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            removeTriggerHandler()&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            _sources = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            _actualTriggers=_sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            //listener=_sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            addTriggerHandler();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            //this.subFields=["firstNameTextInput","lastNameTextInput"];&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function get sources():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return _sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        override public function get source():Object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        override public function set source(value:Object):void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        /**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;         *  @private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;         */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private function addTriggerHandler():void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if (_actualTriggers) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                for each(var trigger:IEventDispatcher in actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                trigger.addEventListener(FlexEvent.VALUE_COMMIT, triggerHandler);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private function triggerHandler(e:FlexEvent):void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            validate();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        /**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;              &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;         *  @private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;         */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private function removeTriggerHandler():void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if (actualTriggers) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                for each(var trigger:IEventDispatcher in actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                trigger.removeEventListener(FlexEvent.VALUE_COMMIT, triggerHandler);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        override public function validate(value:Object=null, suppressEvents:Boolean=false):ValidationResultEvent&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if (required)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                var errorResults:Array = doValidation(null);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                // Validate if the target is required or our value is non-null.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return handleResults(errorResults);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                // We assume if value is null and required is false that&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                // validation was successful.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                var resultEvent:ValidationResultEvent =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    new ValidationResultEvent(ValidationResultEvent.VALID);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                if (!suppressEvents &amp;amp;&amp;amp; enabled)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                             &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    dispatchEvent(resultEvent);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return resultEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    /*    override protected function get actualListeners():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if(listener &amp;amp;&amp;amp; listener is Array) return listener as Array;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if(_sources)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return _sources;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return [];&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        override protected function doValidation(value:Object):Array {&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            // Clear results Array.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            var results:Array = [];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            var comparationValue:String;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            var stringResults:Array;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if(_sources)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                for(var i:int=0;i&amp;lt;_sources.length;i++){&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    comparationValue=String(_sources[i][property]);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    stringResults=super.doValidation(comparationValue);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    listener=_sources[i];&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    if(stringResults.length){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                            this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.INVALID,false,false,_sources[i].id,stringResults));&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                                &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                              &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    else{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                            this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.VALID,false,false,_sources[i].id));&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    results=results.concat(stringResults);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                              &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                }       &lt;/span&gt;&lt;/span&gt;                                                                                               &lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return results;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private function compareWithRest(comparationValue:String):Boolean&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            var result:Boolean=true;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            for(var i:int=0;i&amp;lt;_sources.length;i++){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                if(_sources[i][property]!=comparationValue) return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return result;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                  &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-3394220897763110258?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/OOcBKadty2I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/3394220897763110258/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/04/flex4-custom-validator-compare-and.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3394220897763110258?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3394220897763110258?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/OOcBKadty2I/flex4-custom-validator-compare-and.html" title="Flex4 Custom Validator (Compare and Multifields)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/04/flex4-custom-validator-compare-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcBQnk4eSp7ImA9WhdaFUk.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-3199544684767692347</id><published>2011-03-23T10:02:00.000-07:00</published><updated>2011-10-25T05:34:13.731-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-25T05:34:13.731-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Array of Arrays" /><category scheme="http://www.blogger.com/atom/ns#" term="Multidimensional" /><category scheme="http://www.blogger.com/atom/ns#" term="Matrix" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Vector" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash" /><title>Multidimesnional Vectors  Arrays</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iqbz1QsPZfdBnRz4S7GCyB5vsxY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iqbz1QsPZfdBnRz4S7GCyB5vsxY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iqbz1QsPZfdBnRz4S7GCyB5vsxY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iqbz1QsPZfdBnRz4S7GCyB5vsxY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Creation of multidimensional vectors(arrays) is painful and slow process.&lt;br /&gt;
1D I - vector (length)&lt;br /&gt;
2D IxJ -matrix (width x height)&lt;br /&gt;
3D IxJxK - quader (width x height x length)&lt;br /&gt;
4D IxJxKxM - quader of quaders (width x height x length x time)&lt;br /&gt;
...&lt;br /&gt;
Especially when you don't have some function like var vector:Vector.&lt;int&gt;=new Vector.&lt;int&gt;(5,3,4) which will create 3D vector 5x3x4; (Matlab has... and some other languages)&lt;br /&gt;In Action script3 you can create for example 3D vector(5x3x4)  width x height x length:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var m:Array=new Array(new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array())),&lt;br /&gt;//&lt;br /&gt;new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array())),&lt;br /&gt;//&lt;br /&gt;new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array()))&lt;br /&gt;//&lt;br /&gt;new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array()))&lt;br /&gt;//&lt;br /&gt;new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array()))&lt;br /&gt;);&lt;br /&gt;//even with shorter m=[[[],[],[]...]&lt;a href="http://www.winx.ws/blog/VectorEx.zip"&gt;&lt;/a&gt;&lt;br /&gt;m[0][0][1]=1;&lt;br /&gt;trace(m[0][0][1]);&lt;/code&gt;&lt;br /&gt;Using auto resizing vectors as Array isn't memory efficient. For example Array reserve 10 memory locations. If you are using 2 you have 8 empty but reserved location. If you start using 11 locations, it will be allocated another 10memory locations.&lt;br /&gt;Restricting Array to fixed size we would manage memory better. But creation of 3D vector of 5x3x4 size would need initialization loops and make creation lengthy. New loop for every dimension on top of the rest. Also  creation of lot of objects with "new" consume even more time and memory.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var i,j,k;&lt;br /&gt;var mainArray:Array=new Array(5);&lt;br /&gt;for(i=0; i&amp;lt;5;i++) { mainArray[i]=new Array(3); for(j=0;j&amp;lt;3;j++) { mainArray[i][j]=new Array(4); for(k=0;k&amp;lt;4;k++) {   //fill } } }&lt;/code&gt;&lt;br /&gt;Using not typed vectors would slow down processing cos AVM need to check type of element with every access. We could use typed Vector instead of Array with defined length and fixed flag set to true.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var d1:Vector.&amp;lt;vector.&amp;lt;int&amp;gt;&amp;gt; = new Vector.&amp;lt;vector.&amp;lt;int&amp;gt;&amp;gt;(5*3*4,true);&lt;br /&gt;//follow loop init&lt;/code&gt;&lt;br /&gt;Access to element of d1[i][j][k] is very clean but it is slow. AVM access d1[i] then search of property of "j" of unnamed vector then k of unnamed vector and so on. Some speed you could obtain by &lt;code&gt;&lt;br /&gt;var d2=d1[i];&lt;br /&gt;var d3=d2[j];&lt;br /&gt;var value=d3[k];&lt;/code&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;VectorEx&lt;/span&gt; class solves all this problems,&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var vector:VectorEx=new VectorEx(int,5,3,4);&lt;/code&gt;&lt;br /&gt;to create 3D(5x3x4) vector with integers. VectorEx use assembler trick of making multidimensional vectors with one-dimensional vector and quick shifting index math to access other dimensions in it.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;                    trace(vector[0][1][2]);//you can use this clean way but&lt;br /&gt;//using getElementAt is much faster   &lt;br /&gt;      trace(vector.getElementAt(0,1,2));&lt;br /&gt;      vector.setElementAt(55,0,1,2);//s&lt;br /&gt;      trace(vector.getElementAt(0,1,2));&lt;/code&gt;&lt;br /&gt;&lt;/int&gt;&lt;/int&gt;&lt;br /&gt;
Source: &lt;a href="http://www.winx.ws/blog/VectorEx.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-3199544684767692347?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/GghdY4kWBvo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/3199544684767692347/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/03/unimatrix-multidimesnional.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3199544684767692347?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3199544684767692347?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/GghdY4kWBvo/unimatrix-multidimesnional.html" title="Multidimesnional Vectors  Arrays" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/03/unimatrix-multidimesnional.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08EQXs-eyp7ImA9Wx9WE0o.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-7471165118719632088</id><published>2010-12-13T16:41:00.001-08:00</published><updated>2011-01-18T11:43:20.553-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-18T11:43:20.553-08:00</app:edited><title>How to make Associative Array using Proxy</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/59a7NvgvLG44dcHEN_k7irHVRpQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/59a7NvgvLG44dcHEN_k7irHVRpQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/59a7NvgvLG44dcHEN_k7irHVRpQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/59a7NvgvLG44dcHEN_k7irHVRpQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Many times you need to access elements thru index as key but sometime thru object or string as key. Here comes Associative Array.&lt;br /&gt;Simplest way of making Associative Array is by using normal Array.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var arr:Array=new Array();&lt;br /&gt;arr['mile']=111;&lt;br /&gt;arr[0]=222;&lt;br /&gt;//you cant var myObject:Object={};  arr[myObject]=333;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;If I do&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;code&gt;trace(arr.join(','));&lt;/code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;would return 222. But where is my element at 'mile' ?;&lt;br /&gt;Above implementation is very slow and have restriction of using objects as keys, join, reverse, slice, splice and other useful function don't work properly.&lt;br /&gt;Even in ActionScript documents you will find recommendation of use of Object for Associative Arrays. &lt;br /&gt;&lt;br /&gt;Lot of problems would be solved if we have internal indexer structure.&lt;br /&gt;We could build something like:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  var arrThruKeys:Array=new Array();&lt;br /&gt; var arrThruIndex:Array=new Array();&lt;br /&gt;  var myElement:int=222;&lt;br /&gt;  arrThruKeys['mile']=myElement;&lt;br /&gt;  arrThruIndex[0]=myElement;&lt;/code&gt;&lt;br /&gt;or as documentation propose:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var objThruKeys:Object=new Object();&lt;br /&gt;var arrThruIndex:Array=new Array();&lt;br /&gt;var myElement:int=222;&lt;br /&gt;objThruKeys['mile']=myElement;&lt;br /&gt;arrThruIndex[0]=myElement;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If we want all Array functions to function same and we could access elements thru key or thru index, we need to use something like this&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class AssociativeArray&lt;br /&gt;{&lt;br /&gt;   var objThruKeys:Object=new Object();&lt;br /&gt;   var arrThruIndex:Array=new Array();&lt;br /&gt;&lt;br /&gt;   public function push(key:*,value:*):void&lt;br /&gt;   {&lt;br /&gt;     var elem:Object={key:key,value:value,inx:arrThruIndex.length};&lt;br /&gt;      objThruKeys.key=elem&lt;br /&gt;      arrThruIndex[arrThruIndex.length]=elem&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function getByKey(key:*):*&lt;br /&gt;   {&lt;br /&gt;      return  objThruKeys[key].value;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function getByInx(key:*):*&lt;br /&gt;   {&lt;br /&gt;      return  arrThruIndex[key].value;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function reverse():void&lt;br /&gt;   {&lt;br /&gt;     arrThruIndex.reverse();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;How we could keep direct speed access thru index that array offer and avoid slow slow operations like unshift, splice (remove,insert), merge ... etc. I decided to use Single Linked List and for direct access I prefer using Dictionary ( until utilizing &lt;a href="http://lab.polygonal.de/2010/11/01/fast-hash-tables/"&gt;HashTable&lt;/a&gt; to this implementation for more speed) . Instead of using dynamic object  {key:key,value:value,inx:arrThruIndex.length} which is much slower then using object from final class &lt;br /&gt;&lt;code&gt;&lt;br /&gt;final class SNode&lt;br /&gt;{&lt;br /&gt;  public var key:*;&lt;br /&gt;  public var value:*;&lt;br /&gt;  public var inx:int;&lt;br /&gt;&lt;br /&gt;  public function SNode(key:*,value:*,inx:int):void&lt;br /&gt;  {&lt;br /&gt;    this.key=key;&lt;br /&gt;    this.value=value;&lt;br /&gt;    this.inx=inx;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In order we use [] operator instead of &lt;span style="font-style:italic;"&gt;getByIndex&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;getByKey&lt;/span&gt; functions, also to use for each and for..in in normal way and easy to replace some older code with just replacing &lt;span style="font-style:italic;"&gt;Array&lt;/span&gt; with &lt;span style="font-style:italic;"&gt;AssociativeArray/AssociativeFastArray&lt;/span&gt;,&lt;br /&gt;we could extended our class from dynamic &lt;span style="font-style: italic;"&gt; Proxy&lt;/span&gt; Class.(maybe little bit slower but clean and fast development).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var assoc:AssociativeFastArray=new AssociativeFastArray();&lt;br /&gt;&lt;br /&gt;//this is tha same as assoc.first='first';&lt;br /&gt;assoc['first']='firstvalue';&lt;br /&gt;assoc[0]='new first value';//element at inx 0 will be overwritten in strict mode&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;NEXT:&lt;br /&gt;- reverse function to be implemented&lt;br /&gt;- sort functions to be implemented&lt;br /&gt;- strict mode test&lt;br /&gt;- bug testing and optimization&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.winx.ws/blog/AssociativeArray.zip"&gt;Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-7471165118719632088?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/q3-621fWw8k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/7471165118719632088/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/12/how-to-make-associative-array-using.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7471165118719632088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7471165118719632088?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/q3-621fWw8k/how-to-make-associative-array-using.html" title="How to make Associative Array using Proxy" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/12/how-to-make-associative-array-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYAQ348fCp7ImA9Wx9REkU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-5941642718881385046</id><published>2010-12-08T12:11:00.000-08:00</published><updated>2010-12-13T16:39:02.074-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-13T16:39:02.074-08:00</app:edited><title>How to make MultInheritance(Multiextends) in Action Script 3</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ayS2YCtJSd3jfu3muGVnPGc8L1A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ayS2YCtJSd3jfu3muGVnPGc8L1A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ayS2YCtJSd3jfu3muGVnPGc8L1A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ayS2YCtJSd3jfu3muGVnPGc8L1A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;If you recall yourself on the movie "Twins" with Arnold Schwarc. and Denny de Vito you probably understand what MultiInheritance mean. Childs from more then one parents.  But In Action Script you could &lt;span style="font-style: italic;"&gt;extends &lt;/span&gt;only one class (child from only one parent). This restrictions solves some problems like &lt;span style="font-style: italic;"&gt;diamond&lt;/span&gt; problem when both parents come from same grandparent or awareness from which parent comes what, in child, when they have same function's or attribute's name. Still in some cases you would need MultInheritance(Multi extends).&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public Class1&lt;br /&gt;{&lt;br /&gt; public var sameVarInAll:int=0;&lt;br /&gt;&lt;br /&gt; public Class1(param1:*):void //whatever constructor arguments or no arguments&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public function sameFunctionIn():void&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public func1():void&lt;br /&gt; {&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public Class3&lt;br /&gt;{&lt;br /&gt; public var sameVarInAll:int=0;&lt;br /&gt; public Class3(param3:*):void //whatever constructor arguments or noarguments&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function sameFunctionIn():void&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public func3():void&lt;br /&gt; {&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public Class2&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; public var sameVarInAll:int=0;&lt;br /&gt;&lt;br /&gt; public Class2(param2:*):void&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function sameFunctionIn():void&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public func2():void&lt;br /&gt; {&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Let make interfaces from classes Class1,Class2,Class3.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;interface IClass1&lt;br /&gt;{&lt;br /&gt; func1():void&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;interface IClass2&lt;br /&gt;{&lt;br /&gt; func2():void&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;interface IClass3&lt;br /&gt;{&lt;br /&gt; func3():void&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Now we can extends interfaces IClass1,IClass2,IClass3&lt;br /&gt;&lt;code&gt;&lt;br /&gt;interface IMulti extends IClass1,IClass2,IClass3&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt; and implements IMulti interface:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class MultiInheretanceClass implements IMulti&lt;br /&gt;{&lt;br /&gt; private _class1:IClass1;&lt;br /&gt; private _class2:IClass2;&lt;br /&gt; private _class3:IClass3;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; public class MultiInheretanceClass(param1:*,param2:*,param3:*):void&lt;br /&gt; {&lt;br /&gt;  _class1=new Class1(param1);&lt;br /&gt;  _class2=new Class2(param2);&lt;br /&gt;  _class2=new Class3(param3);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public function set(value:int):void&lt;br /&gt;{&lt;br /&gt; //here we make decision from which class would be set&lt;br /&gt;_class3.sameVarInAll=value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function get():int&lt;br /&gt;{&lt;br /&gt; //here we make decision from which class would be returned&lt;br /&gt;return _class3.sameVarInAll;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; public function sameFunctionIn():void&lt;br /&gt; {&lt;br /&gt;  //here we make decision from which class would be called&lt;br /&gt;  _class.sameFunctionIn();//ex&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; func1():void&lt;br /&gt; {&lt;br /&gt;  _class1.func1();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; func2():void&lt;br /&gt; {&lt;br /&gt;  _class2.func2();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; func3():void&lt;br /&gt; {&lt;br /&gt;  _class3.func3();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-5941642718881385046?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/9HXs6GUSwdY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/5941642718881385046/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/12/how-to-make-multinheritancemultiextends.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5941642718881385046?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5941642718881385046?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/9HXs6GUSwdY/how-to-make-multinheritancemultiextends.html" title="How to make MultInheritance(Multiextends) in Action Script 3" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/12/how-to-make-multinheritancemultiextends.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMNQnk-fip7ImA9Wx5RF0s.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-444490376742149916</id><published>2010-08-25T12:08:00.000-07:00</published><updated>2010-08-25T12:11:33.756-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-25T12:11:33.756-07:00</app:edited><title>Fuzzy Logic Games library 0.1 in ActionScript 3</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vWjEDug2Rb_J7HqrC_Kz0mcISL0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vWjEDug2Rb_J7HqrC_Kz0mcISL0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vWjEDug2Rb_J7HqrC_Kz0mcISL0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vWjEDug2Rb_J7HqrC_Kz0mcISL0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://code.google.com/p/fuzzylogic-actionscipt3"&gt;Download&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;br /&gt;Soon examples. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-444490376742149916?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/kktwBeQTzOQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/444490376742149916/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/08/fuzzy-logic-games-library-01-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/444490376742149916?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/444490376742149916?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/kktwBeQTzOQ/fuzzy-logic-games-library-01-in.html" title="Fuzzy Logic Games library 0.1 in ActionScript 3" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/08/fuzzy-logic-games-library-01-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUNSXw6eyp7ImA9WhdaFk8.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-8197171445469980440</id><published>2010-07-24T12:20:00.000-07:00</published><updated>2011-10-26T03:18:18.213-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-26T03:18:18.213-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Serialization" /><category scheme="http://www.blogger.com/atom/ns#" term="JSON" /><category scheme="http://www.blogger.com/atom/ns#" term="UNION" /><category scheme="http://www.blogger.com/atom/ns#" term="BlaseDS" /><category scheme="http://www.blogger.com/atom/ns#" term="Multiplayer server" /><category scheme="http://www.blogger.com/atom/ns#" term="AMF" /><category scheme="http://www.blogger.com/atom/ns#" term="JAVA" /><title>How to use AMF and JSON serialization in UNION platform(Multiplayer)AS3, BlazeDS, Java</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aTzkvPaQ-0U87XmXScBZlOQg0Ak/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aTzkvPaQ-0U87XmXScBZlOQg0Ak/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aTzkvPaQ-0U87XmXScBZlOQg0Ak/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aTzkvPaQ-0U87XmXScBZlOQg0Ak/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;If you like to send complex data you need to forget about ancient string spliting technique and even XML. JSON is something better but if you want also speed and preservation of the Class object(also dynamic objects &lt;new object()=""&gt; are slow in compilation and execution) and use the power of Union support of hibernate, you need AMF.(Thx Adobe that decide to reveal its code). Combination with zip or lzw or other compression methods you will get even better results.&lt;br /&gt;If you stuck with JSON as3corelib would help you on the client side like&lt;br /&gt;&lt;code&gt;&lt;br /&gt;yourObject={now:new Date()}&lt;br /&gt;room.sendModuleMessage("TESTJSON",{data:JSON.encode(yourObject));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;but not on the server side.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;String input=evt.getMessage().getArg("data");&lt;br /&gt;JSONObject data = new JSONObject(input);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;data.getString("now")&lt;br /&gt;In attachement you will find json.jar library. Put it in "lib" of your union instalation and add it to the startserver.bat like lib\json.jar;&lt;br /&gt;I'm bit tightent with scarce JAVE Message interface having 3 not so useful methods(designed only for dynamic Objects) in discussed cases. I hope in future Message would be more customizable in the future so we could send custom structure of the message content and we could write more optimize code instead writing hacks :)).&lt;br /&gt;This made me problems when I tried&lt;br /&gt;&lt;code&gt;&lt;br /&gt;room.sendModuleMessage("TESTAMF",{data:AMF.serializring(classObject)); and to use byteArray.compress(), cos&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Message content has much more chars above the 64 ASCII array or chars, so it makes big problems in getArg/s parsers of Message obejct to produce something.&lt;br /&gt;The solution was&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CurrentDayVO classObject=new CurrentDayVO();&lt;br /&gt;classObject.now = new Date();&lt;br /&gt;room.sendModuleMessage("TESTAMF",{data:Base64.encode(AMFSerializer.serializeToString(classObject)));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In attachement you can find AMFSerializer.as and Base64.as for client side and for server side&lt;br /&gt;you need to include into lib folder of your union instalation BlazeDS flex-messaging-core.jar;flex-messaging-common.jar;(also attached )&lt;br /&gt;and in startserver.bat lib\flex-messaging-core.jar;lib\json.jar;lib\flex-messaging-common.jar; so you can use&lt;br /&gt;AMFSerialize.java like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;String input=evt.getMessage().getArg("data");&lt;br /&gt;input=Base64decoder.decode(input);&lt;br /&gt;CurrentDayVO output = AMFSerializer.&lt;currentdayvo&gt;fromAmf(input);&lt;/currentdayvo&gt;&lt;/code&gt;&lt;br /&gt;For sending complex class object you need to make 2 classes one in AS3(&lt;span style="font-style: italic;"&gt;CurrentDayVO&lt;/span&gt;.as) and one in Java(&lt;span style="font-style: italic;"&gt;CurrentDayVO&lt;/span&gt;.java).&lt;br /&gt;&lt;code&gt;&lt;br /&gt;AS3:&lt;br /&gt;package com.jdftm.vo{&lt;br /&gt;    [Bindable]&lt;br /&gt;    //[RemoteClass(alias="com.jdftm.vo.CurrentDayVO")]&lt;br /&gt;    public class CurrentDayVO{&lt;br /&gt;        private var _now:Date;&lt;br /&gt;&lt;br /&gt;        public function get now():Date{&lt;br /&gt;            return _now;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public function set now(value:Date):void{&lt;br /&gt;            _now=value;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;JAVA:&lt;br /&gt;package com.jdftm.vo;&lt;br /&gt;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;    public class CurrentDayVO&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        private Date now;&lt;br /&gt;&lt;br /&gt;        public CurrentDayVO() {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void setNow(Date now) {&lt;br /&gt;            this.now = now;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Date getNow() {&lt;br /&gt;            return now;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/code&gt;&lt;br /&gt;They need to be in same packages. Dont forget to&lt;br /&gt;&lt;code&gt; registerClassAlias("com.jdftm.vo.CurrentDayVO", CurrentDayVO);&lt;/code&gt; in you client code so compiler know to preserve Class object strucuture during serialization.&lt;br /&gt;You need to put CurrentDayVO.class (compiled java) into your &lt;span style="font-style: italic;"&gt;"lib"&lt;/span&gt; folder of union instalation.&lt;br /&gt;TestUnion.as is the basic client application that sends JSON and AMF packages.&lt;br /&gt;TestRoomModule.java is custom room module handling unpack and use of JSON or AMF messages sent by the client and send back.&lt;br /&gt;&lt;code&gt;&lt;br /&gt; public void TestJson(RoomEvent evt)&lt;br /&gt;    {&lt;br /&gt;     String input=evt.getMessage().getArg("data");&lt;br /&gt;     JSONObject data = null;&lt;br /&gt;     //Map msgMap=evt.getMessage().getArgs();&lt;br /&gt;     System.out.println("---------------------------------------");&lt;br /&gt;     System.out.println("Received JSON Test Package:"+input);&lt;br /&gt;     &lt;br /&gt;  try {&lt;br /&gt;   data = new JSONObject(input);&lt;br /&gt;  } catch (JSONException e1) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   System.out.println(e1.getMessage());&lt;br /&gt;  }&lt;br /&gt;     &lt;br /&gt;  try {&lt;br /&gt;   System.out.println("Data from JSON Obeject "+data.getString("now"));&lt;br /&gt;  } catch (JSONException e1) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   System.out.println(e1.getMessage());&lt;br /&gt;  }&lt;br /&gt;     &lt;br /&gt;     &lt;br /&gt;     try {&lt;br /&gt;     &lt;br /&gt;     //{echo:ofTheMessage,key:"We User1 know what JSON is!"}&lt;br /&gt;     data.put("echo",input);&lt;br /&gt;     data.put("key", "We User1 know what JSON is!");&lt;br /&gt;    &lt;br /&gt;     m_ctx.getRoom().sendMessage("MODULE_RESPONSE", data.toString());&lt;br /&gt;    &lt;br /&gt;     &lt;br /&gt;     &lt;br /&gt;   } catch (JSONException e) {&lt;br /&gt;    // TODO Auto-generated catch block&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;   }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void TestAmf(RoomEvent evt)&lt;br /&gt;    {&lt;br /&gt;     String input=evt.getMessage().getArg("data");&lt;br /&gt;     //Map msgMap=evt.getMessage().getArgs();&lt;br /&gt;     byte[] iBytes=null;&lt;br /&gt;     CurrentDayVO output=null;&lt;br /&gt;     System.out.println("---------------------------------------");&lt;br /&gt;     System.out.println("Received AMF Test Package:"+input);&lt;br /&gt;  &lt;br /&gt;     /* try {&lt;br /&gt;   iBytes = ZIPCompressor.uncompress(input.getBytes());&lt;br /&gt;  } catch (DataFormatException e1) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   System.out.println(e.getMessage());&lt;br /&gt;  }&lt;br /&gt;         &lt;br /&gt;     try {&lt;br /&gt;      &lt;br /&gt;   input=new String(iBytes, 0, iBytes.length, "UTF-8");&lt;br /&gt;  } catch (UnsupportedEncodingException e) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   System.out.println(e.getMessage());&lt;br /&gt;  }&lt;br /&gt;     //evt.getMessage().&lt;br /&gt;     System.out.println("uncompressed:"+input);&lt;br /&gt;     */&lt;br /&gt;     decoder.reset();&lt;br /&gt;     &lt;br /&gt;     decoder.decode(input);&lt;br /&gt;     &lt;br /&gt;     iBytes=decoder.flush();&lt;br /&gt;     try {&lt;br /&gt;   input=new String(iBytes, 0, iBytes.length, "UTF-8");&lt;br /&gt;  } catch (UnsupportedEncodingException e) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   System.out.println(e.getMessage());&lt;br /&gt;  }&lt;br /&gt;     System.out.println("AMF:"+input);&lt;br /&gt;     &lt;br /&gt;     &lt;br /&gt;     &lt;br /&gt;  try {&lt;br /&gt;   &lt;br /&gt;   output = AMFSerializer.&lt;currentdayvo&gt;fromAmf(input);&lt;br /&gt;  } catch (UnsupportedEncodingException e) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   System.out.println(e.getMessage());&lt;br /&gt;  } catch (ClassNotFoundException e) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   System.out.println(e.getMessage());&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   System.out.println(e.getMessage());&lt;br /&gt;  }&lt;br /&gt;  System.out.println("Data from CurrentDayVO getNow()"+output.getNow().toString());&lt;br /&gt;  /*System.out.println(input);&lt;br /&gt;      System.out.println(evt.toString());*/&lt;br /&gt;    }&lt;br /&gt;  &lt;/currentdayvo&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Source &lt;a href="http://www.winx.ws/blog/AMFJSON.zip"&gt;download&lt;/a&gt;&lt;/new&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-8197171445469980440?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/fdpmHSRSUn4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/8197171445469980440/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/07/use-amf-and-json-packaging-in-union.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8197171445469980440?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8197171445469980440?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/fdpmHSRSUn4/use-amf-and-json-packaging-in-union.html" title="How to use AMF and JSON serialization in UNION platform(Multiplayer)AS3, BlazeDS, Java" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/07/use-amf-and-json-packaging-in-union.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQHRXo7eCp7ImA9WhRREUw.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-337458051613746733</id><published>2010-06-27T04:36:00.000-07:00</published><updated>2011-11-23T22:32:14.400-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-23T22:32:14.400-08:00</app:edited><title>Facebook Graph and AOuth API in Flex 4</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vMxRGxSexvLAoldtvk5tkwXdHII/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vMxRGxSexvLAoldtvk5tkwXdHII/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vMxRGxSexvLAoldtvk5tkwXdHII/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vMxRGxSexvLAoldtvk5tkwXdHII/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&amp;nbsp;DEPRICATED!!!&lt;br /&gt;
&lt;br /&gt;
Official Adobe &lt;a href="http://code.google.com/p/facebook-actionscript-api/"&gt;Facebook API's&lt;/a&gt; become/would become obsolete with new API's that were introduced by Facebook. It was about time that they make something &lt;a href="http://developers.facebook.com/docs/api"&gt;breadcrumb style like&lt;/a&gt; and simple, clear and understandable.&lt;br /&gt;
http://graph.facebook.com/who/what?arguments&lt;br /&gt;
who - id or name of the person,company...,id of the comment,photos album,event...&lt;br /&gt;
what - could be properties of "who" like /photos,/feeds...,&lt;br /&gt;
could be query&lt;br /&gt;
could be method&lt;br /&gt;
...and more.&lt;br /&gt;
&lt;br /&gt;
Out there you can found &lt;a href="http://labs.byhook.com/source/FBLoaderExampleSource.zip"&gt;facebook-actionscript-api&lt;/a&gt; supporting the new Facebook API's (as they could cos new API's aren't final nether have passed child sickness).&lt;br /&gt;
This post would show you how you can make Flex application that will access FacebookAPI's without using too much JavaScripts as in some examples. If you want to just wrap your swf file with the Facebook functionalities you will took this kind of &lt;a href="http://thinkdiff.net/facebook/graph-api-javascript-base-facebook-connect-tutorial/"&gt;approach&lt;/a&gt; making all API's calls and responses thru JavaScripts without involving swf in it.&lt;br /&gt;
In order to handle query string parameters returned from Facebook we need change default .htm file adding:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;var flashVars = {};&lt;br /&gt;     var strHref = window.location.href;&lt;br /&gt;     if ( strHref.indexOf("?") &amp;gt; -1 ) {&lt;br /&gt;    var strQueryString = strHref.substr(strHref.indexOf("?")+1);&lt;br /&gt;    var aQueryString = strQueryString.split("&amp;amp;");&lt;br /&gt;    for ( var iParam = 0; iParam &amp;lt; aparam =" aQueryString[iParam].split("&amp;gt;&lt;/code&gt;&lt;br /&gt;
which will parse the url and send parameters as flash variables to the embedded swf.&lt;br /&gt;
We could use this approach in order to avoid changing default html file produced by Flash Builder:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;var queryString:String=ExternalInterface.call("window.location.href.toString");&lt;br /&gt;//parse string&lt;/code&gt;&lt;br /&gt;
with ActionScript parsing url returned by JavaScript call but we will gone into bottle neck later if we want to add support of Opera, Safari or some early version of IE or Mozzila in which &lt;span style="font-style: italic;"&gt;window.location.href&lt;/span&gt; not work as expected. I hope this would be JSON encoded object in the future.&lt;br /&gt;
&lt;br /&gt;
We will focus our code on 2 parameters returned, for orientation of actions in our code:&lt;br /&gt;
-fb_sig_added (defines if user has granted permission to your application or not)&lt;br /&gt;
-fb_sig_logged_out_facebook (mean that user has loggout option, actually that user is logged)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If this fb_sig_added exist we could be sure we are access application thru Facebook.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;br /&gt;if(loaderInfo.parameters.hasOwnProperty('fb_sig_added'))&lt;br /&gt;{&lt;br /&gt;  //check if user is logged&lt;br /&gt;  if(!loaderInfo.parameters.hasOwnProperty('fb_sig_logged_out_facebook'))&lt;br /&gt;  {&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;    //send the user to login facebook page with refrence to continue to your application&lt;br /&gt;  }&lt;br /&gt;      {&lt;br /&gt;}&lt;br /&gt;else//user has access application not thru facebook&lt;br /&gt;{&lt;br /&gt;//send the user to login facebook page with refrence to continue to your application&lt;br /&gt;}&lt;br /&gt;                 &lt;br /&gt;    &lt;/code&gt;&lt;br /&gt;
If user isn't logged we redirect him/her to facebook login page with refrence to continue to your application after login.&lt;br /&gt;
To access user  &lt;a href="http://developers.facebook.com/docs/authentication/permissions"&gt;data,photos,videos...&lt;/a&gt; access should be granted and access_token received. Every time user access your application would be redirected to authorization page. If user haven't grant permission to the application will be ask to do in page like this:&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_Hoya55ledVM/TCdY9A4a_dI/AAAAAAAAAEo/ZFa_gtaeG-s/s1600/Clipboard02.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5487452476206153170" src="http://4.bp.blogspot.com/_Hoya55ledVM/TCdY9A4a_dI/AAAAAAAAAEo/ZFa_gtaeG-s/s400/Clipboard02.jpg" style="cursor: pointer; display: block; height: 222px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
with listed permissions defined in scope(scope=user_photos,user_videos,publish_stream...)&lt;br /&gt;
else application would be supplied with access_token.&lt;br /&gt;
You may look in access_token as somekind of grant permission key that application is using to identify itself as permited to access user data or write on user wall or else.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt; if (loaderInfo.parameters.hasOwnProperty("access_token"))&lt;br /&gt;       {&lt;br /&gt;          _accessToken = loaderInfo.parameters.access_token;&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        _urlVariables = new URLVariables();&lt;br /&gt;        _urlVariables.access_token = _accessToken;&lt;br /&gt;        _urlVariables.fields = "id,name,picture";&lt;br /&gt;        call(_urlVariables, onUserDataComplete);&lt;br /&gt;        &lt;br /&gt;       &lt;br /&gt;       }&lt;br /&gt;       else//&lt;br /&gt;       {&lt;br /&gt;                &lt;br /&gt;            //https://graph.facebook.com/oauth/authorize?&lt;br /&gt;        //client_id=application_api_key&amp;amp;&lt;br /&gt;        //redirect_uri=http://www.example.com/myapplication&amp;amp;&lt;br /&gt;        //scope=user_photos,user_videos,publish_stream&lt;br /&gt;       &lt;br /&gt;      &lt;br /&gt;     &lt;br /&gt;     &lt;br /&gt;         navigateToURL(new URLRequest(AUTORIZE_URL+"?client_id="+loaderInfo.parameters.fb_sig_api_key+"&amp;amp;redirect_uri="+APPLICATION_URL+"&amp;amp;type=user_agent&amp;amp;display=page&amp;amp;scope=publish_stream"),"_top");&lt;br /&gt;  &lt;br /&gt;       }&lt;/code&gt;&lt;br /&gt;
There is a possibility access_token to be saved as SharedObject and fb_sig_added to be checked, if true, not to send user every time to authorization page so access_token is acquired. But access_token is short lived and after expiration new access_token need to be requested.&lt;br /&gt;
&lt;br /&gt;
Application API key isn't hard coded inside your application as that is security risk&lt;br /&gt;
but obtained thru fb_sig_api_key parameter.&lt;br /&gt;
Important thing is that in authorization you need to use "GET" and in requesting data "POST" method.&lt;br /&gt;
Obtaining access_token allow us to request data:&lt;br /&gt;
https://graph.facebook.com/uid or me(meaning current user)/?access_token=...,&amp;amp;fields=id,name,picture&lt;br /&gt;
and got JSON coded data.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;/**&lt;br /&gt;               *&lt;br /&gt;               * @param arg (arguments)&lt;br /&gt;               * @param handler (function that will handle response)&lt;br /&gt;               * @param category (subcategory or property)&lt;br /&gt;               * @param method (GET or POST)&lt;br /&gt;               */&lt;br /&gt;     private function call(arg:URLVariables,handler:Function,category:String="",method:String=URLRequestMethod.GET):void&lt;br /&gt;   &lt;/code&gt;&lt;br /&gt;
Our handler function will decode and assign values&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;/**&lt;br /&gt;      * &lt;br /&gt;      * @param e&lt;br /&gt;      */&lt;br /&gt;     private function onUserDataComplete(e:Event):void &lt;br /&gt;     {&lt;br /&gt;      var data:Object;&lt;br /&gt;      _urlLoader.removeEventListener(Event.COMPLETE, onUserDataComplete, false);&lt;br /&gt;      &lt;br /&gt;      //Alert.show(_urlLoader.data);&lt;br /&gt;      &lt;br /&gt;      /*{&lt;br /&gt;         "id": "1104286707",&lt;br /&gt;         "name": "Alex Extream",&lt;br /&gt;         "picture": "http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs256.snc3/23172_1104286707_7803_q.jpg"&lt;br /&gt;      }*/&lt;br /&gt;      data= JSON.decode(_urlLoader.data);&lt;br /&gt;      &lt;br /&gt;      if (data.error)&lt;br /&gt;      {&lt;br /&gt;       throw new Error(data.message);&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;      userImg.source = data.picture;&lt;br /&gt;      nameLbl.text = data.name;&lt;br /&gt;      publishButton.visible=true;&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;     }&lt;/code&gt;&lt;br /&gt;
to the Lable and Image control previously add to mxml.&lt;br /&gt;
&lt;br /&gt;
source &lt;a href="http://www.winx.ws/blog/FacebookDemo.zip"&gt;download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-337458051613746733?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/rMyZqjYT128" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/337458051613746733/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/06/facebook-graph-and-aouth-api-in-flex-4.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/337458051613746733?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/337458051613746733?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/rMyZqjYT128/facebook-graph-and-aouth-api-in-flex-4.html" title="Facebook Graph and AOuth API in Flex 4" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Hoya55ledVM/TCdY9A4a_dI/AAAAAAAAAEo/ZFa_gtaeG-s/s72-c/Clipboard02.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/06/facebook-graph-and-aouth-api-in-flex-4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEERHo_eCp7ImA9WxFUFk4.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-7113545238412777943</id><published>2010-05-28T05:03:00.000-07:00</published><updated>2010-06-27T04:36:45.440-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-27T04:36:45.440-07:00</app:edited><title>Move Effect TabNavigator (Flex 4 SDK)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Iy3g5A-ENSG9FrTD3LD9C-jxWMQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Iy3g5A-ENSG9FrTD3LD9C-jxWMQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Iy3g5A-ENSG9FrTD3LD9C-jxWMQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Iy3g5A-ENSG9FrTD3LD9C-jxWMQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Maybe MXML put much on what we call RAD(Rapid application Development) but if you really want to do something more then fast UI Design, codding of ActionScript is inevitable. Maybe some MXML guru would embed all that code inside MXML tags but I think that way we lose the power of readable and manageable MXML.&lt;br /&gt;I actually wanted to change &lt;span style="font-style: italic;"&gt;showEffect&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;hideEffect &lt;/span&gt;on fly depending of direction of selection of tabs in TabNavigator (from left to right or opposite).&lt;br /&gt;Good news in Flex4 is that you can declare effects, strings, templates...inside the declarations tags and use them where and as much time you want, avoiding redundancy.&lt;br /&gt;&lt;br /&gt;First we need some event that happen before change of container in TabNavigator. When user click on tab button &lt;/code&gt;&lt;code style="font-style: italic;"&gt;FlexEvent.BUTTON_DOWN&lt;/code&gt; is dispatched.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for (idx=0; idx&amp;lt;len;idx++){&lt;br /&gt;flightDetailsTabNavigator.getTabAt(idx).addEventListener(FlexEvent.BUTTON_DOWN,onTabClick);&lt;br /&gt;flightDetailsTabNavigator.getTabAt(idx).label="Tab"+idx;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;Handling that event mean finding the direction of selection of the tabs and attaching proper hide/show effects to previous and next container.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;private function onTabClick(e:FlexEvent):void&lt;br /&gt;{&lt;br /&gt;var currentIndex:int;&lt;br /&gt;var currentContainer:*;&lt;br /&gt;var nextContainer:*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(!e.target.selected)&lt;br /&gt;{&lt;br /&gt;currentIndex=e.target.parent.getChildIndex(e.target);&lt;br /&gt;currentContainer=flightDetailsTabNavigator.getChildren()[_prevSelectedIndex];&lt;br /&gt;nextContainer=flightDetailsTabNavigator.getChildren()[currentIndex];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if( _prevSelectedIndex&gt;currentIndex)//we go rigth to left&lt;br /&gt;{&lt;br /&gt;currentContainer.setStyle("hideEffect",moveToRight);&lt;br /&gt;nextContainer.setStyle("showEffect",moveFromRight);&lt;br /&gt;}&lt;br /&gt;else//we go left to right&lt;br /&gt;{&lt;br /&gt;currentContainer.setStyle("hideEffect",moveToLeft);&lt;br /&gt;nextContainer.setStyle("showEffect",moveFromLeft);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;_prevSelectedIndex=currentIndex;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hoya55ledVM/TAoymnNGr4I/AAAAAAAAAEg/rl_HgVFN7_o/s1600/Clipboard01.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 374px; height: 281px;" src="http://1.bp.blogspot.com/_Hoya55ledVM/TAoymnNGr4I/AAAAAAAAAEg/rl_HgVFN7_o/s400/Clipboard01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5479247535589994370" /&gt;&lt;/a&gt;&lt;br /&gt;source: &lt;a href="http://www.winx.ws/blog/TabNavigator2DirectionWipe.zip"&gt;download&lt;/a&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-7113545238412777943?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/7Ih9yti57Cw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/7113545238412777943/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/05/move-effect-tabnavigator-flex-4-sdk.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7113545238412777943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7113545238412777943?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/7Ih9yti57Cw/move-effect-tabnavigator-flex-4-sdk.html" title="Move Effect TabNavigator (Flex 4 SDK)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Hoya55ledVM/TAoymnNGr4I/AAAAAAAAAEg/rl_HgVFN7_o/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/05/move-effect-tabnavigator-flex-4-sdk.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQDQH47eCp7ImA9WxFRFEk.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-7778420929483468371</id><published>2010-04-28T01:11:00.000-07:00</published><updated>2010-04-28T01:12:51.000-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-28T01:12:51.000-07:00</app:edited><title>Ultimate freelancer's survival guide</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/q97WgM_MYiTtb6G9c5j56_ife0A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q97WgM_MYiTtb6G9c5j56_ife0A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/q97WgM_MYiTtb6G9c5j56_ife0A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q97WgM_MYiTtb6G9c5j56_ife0A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Protect you self from buyers, defend your freedom and financial independence.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number one:&lt;/em&gt;&lt;br /&gt;Buyers have advantage in the oDesk system (Don't wanna to compare other just fixed price systems). Remember this. You are building your profile and feedback with hard work, tests,constant learning.... Buyer can wait until you have crashed yourself bidding, could blackmail you and ruin your feedback(*) in second without harm with just creating himself other profile. You could create new account too but is futile cos you spent so much time and effort to build it and you can just hope of better feedback system. They could have no skills in the area and can evaluate your skills and code quality, and can forbid to show any information that you have been worked on that project(even screenshot)&lt;br /&gt;&lt;br /&gt;(*)Use oDesk Feedback Policy&lt;br /&gt;"Manipulating or coercing another User to perform a given task by threatening to leave negative feedback..."&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number two:&lt;/em&gt;&lt;br /&gt;Avoid fixed price projects&lt;br /&gt;You will get often into trap. First fixed projects aren't guaranteed by Odesk system nether have dispute option. Percentages of buyer who would agree to pay 100% in front no matter what feedback and experience you have is minimal. So request very good specification of request at front, with good defined development/payment phases and resolve all misunderstanding as soon as possible. Spoken language isn't invented for precise specification so buyer would take advantage of any doubtful statement to increase the requests and you can finished in the loop of new requests/bad feedack blackmail.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number three:&lt;/em&gt;&lt;br /&gt;Avoid buyers who send you decompiled code, ask hacking, cracking or request selling your already developed application protected by NDA.&lt;br /&gt;You will have problems with law soon or later.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number four:&lt;/em&gt;&lt;br /&gt;Remember that most of the buyers are "wanna banna" people and "what they see what they think". Use this to present to your profile the best looking things(best put movie clips in your profile). You could developed most complex system and if you don't have  100$ makeup it worth 0 in your profile for them. So during development thru things to look good not run only for functionality they can't evaluate that.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number five:&lt;/em&gt;&lt;br /&gt;Never return on provocation("You have spent so much"),insults("f*** you","thief"...) and bad attitude. Record every conversation and try to finish the project as soon as possible. Records might help you with oDesk team to intervene changing your feedback. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number six:&lt;/em&gt;&lt;br /&gt;Use polite language(use could,should...) when want to complain or disagree with buyer's crazy requests like work outside oDesk, not logging hours, work 9-5(what is free(lance) in this chain???) .&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number seven:&lt;/em&gt;&lt;br /&gt;Remember that to be constant with you work,availability and attitude. One error mean one star less to most of the buyers. They actually don't know what every feedback category consist of and didn't care. Your bad communication would reflect on your skill feedback category and your skill will reflect your communication feedback category.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number eight:&lt;/em&gt;&lt;br /&gt;Try to avoid other freelancers as customers. Dont get in chain first hand -&gt; hand second hand ----&gt; tenth hand -&gt; You. They will request more and for less money and less time.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number nine:&lt;/em&gt;&lt;br /&gt;Don't get to close with the customer and don't involve emotion to relation. Remember on what is this relation based. You are earning for decent live and they to double,triple their fortune a.k.a interests so no friends,dudes,pals,morale,chivalry.... Play smart, understand how the capitalism function,keep professional distance and you wont be hurt.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number ten:&lt;/em&gt;&lt;br /&gt;Better with one eye then bad word about you.Better refund money (if you refund and cost of the project goes below 1$ =&gt; oDesk system would remove the project/feedback from your portfolio) then keep bad feedback.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number eleven:&lt;/em&gt;&lt;br /&gt;Don't beleave in charity,church and so on organizations or paying in stocks or percentage of profit especially when you are not US or EU citizen and don't have court signed agreement.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Rule number twelve:&lt;/em&gt;&lt;br /&gt;Inform the customer/s what you were doing and how that leads to his goal and on the technical level consumable by them. They often not read all Memos and don't understand what is involved and even you don't have fancy system like CampFire, Unfuddle,Bugzilla... email on regular base will do.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;More to come...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-7778420929483468371?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/kie_matCwV0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/7778420929483468371/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/04/ultimate-freelancers-survival-guide.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7778420929483468371?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7778420929483468371?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/kie_matCwV0/ultimate-freelancers-survival-guide.html" title="Ultimate freelancer's survival guide" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/04/ultimate-freelancers-survival-guide.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECRXc9cSp7ImA9WhdaFUk.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-6222265673076393796</id><published>2010-04-01T03:21:00.000-07:00</published><updated>2011-10-25T06:17:44.969-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-25T06:17:44.969-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Games" /><category scheme="http://www.blogger.com/atom/ns#" term="Events" /><category scheme="http://www.blogger.com/atom/ns#" term="Custom MovieClip" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash" /><category scheme="http://www.blogger.com/atom/ns#" term="Character Animation" /><category scheme="http://www.blogger.com/atom/ns#" term="Bitmap" /><category scheme="http://www.blogger.com/atom/ns#" term="Optimization" /><title>How to use  Animated Bitmap Clip (Games)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/s3qo1k2r2un1j1CeKVulp8CGdM4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s3qo1k2r2un1j1CeKVulp8CGdM4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/s3qo1k2r2un1j1CeKVulp8CGdM4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s3qo1k2r2un1j1CeKVulp8CGdM4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;When you build avatars(virtual worlds) or characters(games) it is good to have  container movie clip with all animated actions, understandable for designer, as we know that they aren't Action Script gurus.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_Hoya55ledVM/S9f2dm2AsNI/AAAAAAAAADc/c-WKKLkGj0Y/s1600/Clipboard01.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5465107661341110482" src="http://4.bp.blogspot.com/_Hoya55ledVM/S9f2dm2AsNI/AAAAAAAAADc/c-WKKLkGj0Y/s1600/Clipboard01.jpg" style="margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here comes Movie Clip Class  disabilities.&lt;br /&gt;
Having many instances of same Movie Clip(ex. 50 or more enemies of same type, flock of birds, fish) will consume lot of memory and processor time. "Worse than that, if you apply a filter to a DisplayObject, the Flash Player caches it automatically and creates 2 bitmaps in memory : One to work with pixels and another one to generate the filtered result. This time, for each transformation made to the DisplayObject, the two bitmaps previously generated are updated in memory. This time, your CPU occupancy rate is gonna go crazy" &lt;a href="http://www.bytearray.org/?p=117"&gt;Thibault Imber&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The idea was to use one Bitmap Source for all instances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/_Hoya55ledVM/S-fai5TmbYI/AAAAAAAAAD0/ALrlh_yvjYY/s1600/Clipboard02.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5469580565498195330" src="http://3.bp.blogspot.com/_Hoya55ledVM/S-fai5TmbYI/AAAAAAAAAD0/ALrlh_yvjYY/s1600/Clipboard02.jpg" style="float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;&lt;code style="font-style: italic;"&gt;AnimationResourcer &lt;/code&gt;&lt;code&gt;class object takes the designer's container movi&lt;span style="font-family: Georgia,serif;"&gt; clip and parse frame actions and graphics making resource of bitmaps and actions that can be use by any  &lt;/span&gt;&lt;/code&gt;&lt;code style="font-style: italic;"&gt;AnimatedClip&lt;/code&gt;&lt;code&gt;(enhanced&lt;/code&gt;&lt;code style="font-style: italic;"&gt; MovieClip&lt;/code&gt;&lt;code&gt;)&lt;/code&gt;&lt;code&gt;&lt;span style="font-family: Georgia,serif;"&gt; instance.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;The original source done by designer can be .swf container containing the animation,or on stage or embedded in main swf.&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
It is important mc to be ready(added to displayed obejct list render) so AnimationResourcer could access the frames graphi&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;If original animation source movie clip "mc" is on stage in Event.ADDED_TO_STAGE event instantiate &lt;i&gt;AnimationResourcer&lt;/i&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;private function onAddedToStage(e:Event){&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: red;"&gt; var aniResources:AnimationResourcer = new AnimationResourcer(mc);&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: red;"&gt;} &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;or if embedded:&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;private function onAddedToStage(e:Event){&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp; var mc:MyMovieClipClass=new &lt;/code&gt;&lt;code&gt;MyMovieClipClass();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; addChild(mc);&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var aniResources:AnimationResourcer = new AnimationResourcer(mc);&lt;/code&gt;&lt;/div&gt;
&lt;code style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; removeChild(mc);&lt;/code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;} &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
of if you loaded from outside swf:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;span style="color: red;"&gt;private function onLoadComplete(e:Event){&lt;/span&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;code&gt;&amp;nbsp; var mc:MovieClip=event.target.content as MovieClip;&lt;br /&gt;&amp;nbsp;&amp;nbsp;   addChild(mc);&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; var aniResources:AnimationResourcer = new AnimationResourcer(mc);&lt;/code&gt;&lt;/div&gt;
&lt;code style="color: red;"&gt;&amp;nbsp;&amp;nbsp; removeChild(mc)&lt;/code&gt;&lt;code style="color: red;"&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;}&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: red;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;code&gt;aniClip3:AnimatedClip=new AnimatedClip();&lt;/code&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;code&gt;aniClip3.source = aniHeroResources;&lt;br /&gt;       aniClip3.gotoAndPlay("Jump");&lt;br /&gt;       aniClip3.x = 10;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;One of the advantages of this is you could change the source of&amp;nbsp; on fly (ex. your hero transformed in wolf)&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code style="color: red;"&gt;aniClip3.source = aniWolfResources;&lt;/code&gt;&lt;span style="color: #38761d;"&gt;//resource conatining wolf animations&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;or modify current source(ex. adding some matrix transformation) which will affect all the instances&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&lt;/code&gt; &lt;br /&gt;
 or adding additional resources from aditional container (ex. your hero have learned new skils and moves so you need more animation action frames):&lt;br /&gt;
&lt;br /&gt;
&lt;code style="color: red;"&gt;aniHeroResources&lt;/code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;.addSource(mc2);&lt;/span&gt; &lt;span style="color: #38761d;"&gt;//mc2 is MovieClip containing addtional&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;animation frames source that will be concatenated to the frames from "mc" used as initial frames source&lt;/code&gt;&lt;br /&gt;
or concatenate animated resousrces&lt;br /&gt;
&lt;code&gt; &lt;span style="color: red;"&gt;aniResources1.concat(aniResources2);&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other advantage is control of the animation speed  e.g . (ex character normal/faster walk or with increase of  heroes dexterity faster hit or enemy feels effect of slow down potion) and you not need to create and load new slower or faster animation.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;code&gt;aniClip.frameRate=60 //60 fps&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;Animated Clip&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;/code&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;has internal timer which control timing between every frame (bitmap) a.k.a frame rate&lt;span style="font-family: monospace;"&gt; h&lt;/span&gt;&lt;code&gt;as support almost all things and control/interaction as original &lt;i&gt;MovieClip&lt;/i&gt;.&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;code&gt;aniClip.rotate=45;&lt;/code&gt;&lt;/div&gt;
&lt;code&gt;&lt;span style="color: red;"&gt;aniClip.gotoAndPlay("Jump");&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: red;"&gt;aniClip.addEventListener(MouseEvent.Click,onMouseClick);&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_Hoya55ledVM/S-fcjRnRtVI/AAAAAAAAAEM/uU4-f2vzS48/s1600/Clipboard03.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5469582771046430034" src="http://4.bp.blogspot.com/_Hoya55ledVM/S-fcjRnRtVI/AAAAAAAAAEM/uU4-f2vzS48/s400/Clipboard03.jpg" style="cursor: hand; cursor: pointer; height: 293px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;AnimatedClip&lt;/span&gt; is successor of &lt;span style="font-style: italic;"&gt;Bitmap&lt;/span&gt; class which isn't supporting MouseEvent's so we need to attach our listeners to stage or our parent.&lt;br /&gt;
&lt;br /&gt;
Also we need to keep track z-order index change.Unfortunelly Flash don't have INDEXCHANGE event which I need for elegant solution of reordering priority of the events, so AnimatedClips's parent DisplayObjectContainer need to override  setChildIndex, swapChildIndex and swapChildren functions and we need custom &lt;span style="font-style: italic;"&gt;IndexChangeEvent&lt;/span&gt;.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;override public function setChildIndex(child:flash.display.DisplayObject, index:int):void &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  {&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   var prevChildAt:DisplayObject;&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   prevChildAt = this.getChildAt(index);&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   super.setChildIndex(child, index);&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   if (prevChildAt)&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   prevChildAt.dispatchEvent(new IndexChangeEvent(IndexChangeEvent.CHANGE, index + 1));&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   child.dispatchEvent(new IndexChangeEvent(IndexChangeEvent.CHANGE,index));&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  }&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  override public function swapChildrenAt(index1:int, index2:int):void &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  {&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   super.swapChildrenAt(index1, index2);&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   this.getChildAt(index1).dispatchEvent(new IndexChangeEvent(IndexChangeEvent.CHANGE, index1));&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   this.getChildAt(index2).dispatchEvent(new IndexChangeEvent(IndexChangeEvent.CHANGE,index2));&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  }&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  override public function swapChildren(child1:flash.display.DisplayObject, child2:flash.display.DisplayObject):void &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  {&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   super.swapChildren(child1, child2);&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   child1.dispatchEvent(new IndexChangeEvent(IndexChangeEvent.CHANGE, this.getChildIndex(child1)));&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;   child2.dispatchEvent(new IndexChangeEvent(IndexChangeEvent.CHANGE, this.getChildIndex(child2)));&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  }&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt;  &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Source &lt;a href="http://www.winx.ws/blog/AnimatedClip.zip"&gt;download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-6222265673076393796?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/B4GQMAhhzUI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/6222265673076393796/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/04/blog-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6222265673076393796?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6222265673076393796?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/B4GQMAhhzUI/blog-post.html" title="How to use  Animated Bitmap Clip (Games)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Hoya55ledVM/S9f2dm2AsNI/AAAAAAAAADc/c-WKKLkGj0Y/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBR3o6fCp7ImA9WxBaE0U.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-5700216957632094612</id><published>2010-03-23T04:50:00.000-07:00</published><updated>2010-03-23T15:14:16.414-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-23T15:14:16.414-07:00</app:edited><title>How to customize Flash Components Cells - CellRenderer</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/X8qwKHEVYDQ2KU5BQluaBsMGLFs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X8qwKHEVYDQ2KU5BQluaBsMGLFs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/X8qwKHEVYDQ2KU5BQluaBsMGLFs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X8qwKHEVYDQ2KU5BQluaBsMGLFs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;In many scenarios you don't want to reinvent the wheel by making component from scratch and will need more complex cells then cells in List,ComboBox,DataGrid containing just text, Carousel,TileList containing text and picture etc. &lt;br /&gt;First we will design look of cell.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hoya55ledVM/S6kwKP6I4dI/AAAAAAAAACs/L2suViccGPE/s1600-h/designMovie.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 163px;" src="http://4.bp.blogspot.com/_Hoya55ledVM/S6kwKP6I4dI/AAAAAAAAACs/L2suViccGPE/s320/designMovie.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5451941776535904722" /&gt;&lt;/a&gt;&lt;br /&gt;Then create class that extends MovieClip ( or Sprite or some component if we use different cell design) implementing the ICellRender Interface.&lt;br /&gt;&lt;code&gt;package  &lt;br /&gt;{&lt;br /&gt; import fl.controls.listClasses.ICellRenderer;&lt;br /&gt; import fl.controls.listClasses.ListData;&lt;br /&gt; import fl.events.ListEvent;&lt;br /&gt; import flash.display.MovieClip;&lt;br /&gt; import flash.events.MouseEvent;&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * ...&lt;br /&gt;  * @author DefaultUser (Tools -&gt; Custom Arguments...)&lt;br /&gt;  */&lt;br /&gt; public class CustomCellRenderer extends MovieClip implements ICellRenderer&lt;br /&gt; {&lt;br /&gt;  private var _listData:ListData; &lt;br /&gt;        private var _data:Object;&lt;br /&gt;  public function CustomCellRenderer()&lt;br /&gt;  {&lt;br /&gt;   &lt;br /&gt;        } &lt;br /&gt;  &lt;br /&gt;  public function set data(d:Object):void &lt;br /&gt;  { &lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;            _data = d.TestColumn; &lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;   textTextArea.text = _data.label;&lt;br /&gt;   checkCheckBox.selected = _data.checked;&lt;br /&gt;   imageUILoader.source = _data.icon;&lt;br /&gt;   &lt;br /&gt;   //colorColorPicker.selectedColor = _data.color;&lt;br /&gt;          &lt;br /&gt;        } &lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Most important to be implemented is "data" property&lt;br /&gt;&lt;code&gt;public function set data(d:Object):void &lt;/code&gt; which is called each time object from your &lt;span style="font-style:italic;"&gt;DataProvider&lt;/span&gt; is supplied for the cell.You will need to create objects that comply to your above cell design movie clip.&lt;br /&gt;&lt;code&gt; DataProvider([{TestColumn:{color:0xFF00FF,label:"testText1",checked:true,icon:"logo.gif"},normalColumn:"normalText1"},&lt;br /&gt;          {TestColumn:{color:0x0000FF,label:"testText2",checked:false,icon:"logo.gif"},normalColumn:"normalText1"}]);&lt;/code&gt;&lt;br /&gt;  &lt;br /&gt;Next you should linkage the cell design movie clip with the custom class &lt;span style="font-style:italic;"&gt;CustomCellRenderer&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hoya55ledVM/S6kw1aPL9kI/AAAAAAAAAC0/Za2uq5Q861M/s1600-h/CreateClass.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 244px; height: 320px;" src="http://4.bp.blogspot.com/_Hoya55ledVM/S6kw1aPL9kI/AAAAAAAAAC0/Za2uq5Q861M/s320/CreateClass.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5451942518042916418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When we use custom cells in other components we do &lt;br /&gt;&lt;code&gt; component.setStyle("cellRenderer",CustomCellRenderer)&lt;/code&gt;&lt;br /&gt;but for &lt;span style="font-style:italic;"&gt;DataGrid&lt;/span&gt; we will customize one column cell &lt;br /&gt;&lt;code&gt; column.cellRenderer=CustomCellRenderer;&lt;/code&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hoya55ledVM/S6kxHKEbG3I/AAAAAAAAAC8/RPVUKSxF8VU/s1600-h/Final.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="http://3.bp.blogspot.com/_Hoya55ledVM/S6kxHKEbG3I/AAAAAAAAAC8/RPVUKSxF8VU/s320/Final.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5451942822940449650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Source:&lt;/span&gt;&lt;a href="http://www.winx.ws/blog/customCellRenderer.zip"&gt;download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-5700216957632094612?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/oEopy7zCAIY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/5700216957632094612/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/03/how-to-customize-flash-components-cells.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5700216957632094612?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5700216957632094612?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/oEopy7zCAIY/how-to-customize-flash-components-cells.html" title="How to customize Flash Components Cells - CellRenderer" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Hoya55ledVM/S6kwKP6I4dI/AAAAAAAAACs/L2suViccGPE/s72-c/designMovie.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/03/how-to-customize-flash-components-cells.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIAR3Y-eCp7ImA9WxBUF0w.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-394465815311993797</id><published>2010-03-04T03:56:00.000-08:00</published><updated>2010-03-04T06:22:26.850-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-04T06:22:26.850-08:00</app:edited><title>How to Solve scale9Grid Problem AS3(Flash)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gMj4Od7_F3-R6yHi0OuR3I8ovJA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gMj4Od7_F3-R6yHi0OuR3I8ovJA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gMj4Od7_F3-R6yHi0OuR3I8ovJA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gMj4Od7_F3-R6yHi0OuR3I8ovJA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hoya55ledVM/S4-knEsUi4I/AAAAAAAAABM/xqYPvK3Bjs8/s1600-h/Clipboard01.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 248px;" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4-knEsUi4I/AAAAAAAAABM/xqYPvK3Bjs8/s320/Clipboard01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5444751465695710082" /&gt;&lt;/a&gt;&lt;br /&gt;Scaling in Flash using partitioning of DisplayObject to 9 pieces is well known to developers and designers. The problems of using it goes from not affecting children of DisplayObject, proper scaling only when same(equal) scaling to X and Y, no scaling support of the Bitmaps and &lt;a href="http://www.ovidiudiac.ro/blog/2009/05/scale9grid-work-and-fail/"&gt;so on...&lt;/a&gt;&lt;br /&gt;The idea is to make bitmapData of the DisplayObject, partition and drawing 9 parts of the inital bitmapData according to supplied scale9Grid rectangle and scaling requested.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hoya55ledVM/S4_BpLkINxI/AAAAAAAAABc/nDOft7O2orY/s1600-h/Clipboard03.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 127px;" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_BpLkINxI/AAAAAAAAABc/nDOft7O2orY/s320/Clipboard03.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5444783387737339666" /&gt;&lt;/a&gt;&lt;br /&gt;I wanted to have OO approach to the problem YourSprite inherts ScaleBitmapSprite inherts -&gt;Spite and not helper static object &lt;span style="font-weight:bold;"&gt;SpriteHelper.createScale9GridAvailableSprite(YourSprite)&lt;/span&gt; returning new Scale9GridAvailableSprite or Scale9GridAvailableSprite Class &lt;span style="font-weight:bold;"&gt;Scale9GridAvailableSprite(sourceSprite)&lt;/span&gt; that takes source in constructor.&lt;br /&gt;First I took the &lt;a href="http://troygilbert.com/2009/08/quick-fix-for-scale-9-issues/"&gt;Troy Gilbert version&lt;/a&gt; and made it 00. But I wasn't satisfied with making 9 Bitmap children and add to original Spite (&lt;span style="font-style:italic;"&gt;ScaleComponentsSprite&lt;/span&gt;).&lt;br /&gt;Then I wrote ScaleBitmapSprite based on &lt;a href="http://www.bytearray.org/?p=1206"&gt;Didier Brun's&lt;/a&gt; ScaleBitmapSprite which uses one BitmapData instead of nine incapsulated in Bitmaps as in above example and  have advance options like outer Rectangle for effects and filters.&lt;br /&gt;So you can use my version like:&lt;br /&gt;&lt;code&gt;var s:ScaleBitmapSprite=new ScaleBitmapSprite();&lt;br /&gt;addChild(s);&lt;br /&gt;s.scale9Grid=new Rectangle(5, 5, 90, 90 );&lt;br /&gt;s.width=500;&lt;/code&gt;&lt;br /&gt;or inherits to as much SkinClasses in your library or run-time as you like.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hoya55ledVM/S4-1W9qyZEI/AAAAAAAAABU/RPpNJPIxA_0/s1600-h/Clipboard02.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 237px;" src="http://3.bp.blogspot.com/_Hoya55ledVM/S4-1W9qyZEI/AAAAAAAAABU/RPpNJPIxA_0/s320/Clipboard02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5444769880629994562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;code&gt;package &lt;br /&gt;{&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * ...&lt;br /&gt;  * @author alex winx (www.winx.ws)&lt;br /&gt;  */&lt;br /&gt; public class MySkinClass extends ScaleBitmapSprite &lt;br /&gt; {&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;Using OO way you can extend functionality in different or scenario that suit you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Class code:&lt;/span&gt;&lt;br /&gt;&lt;code&gt;package {&lt;br /&gt; import flash.display.BitmapData;&lt;br /&gt; import flash.display.Shape;&lt;br /&gt; import flash.display.Sprite;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.geom.Matrix;&lt;br /&gt; import flash.geom.Rectangle; &lt;br /&gt;&lt;br /&gt; public class ScaleBitmapSprite extends Sprite {&lt;br /&gt;  &lt;br /&gt;    &lt;br /&gt;  // ------------------------------------------------&lt;br /&gt;  //&lt;br /&gt;  // ---o properties&lt;br /&gt;  //&lt;br /&gt;  // ------------------------------------------------&lt;br /&gt;  &lt;br /&gt;  private var _width : Number;&lt;br /&gt;  private var _height : Number;&lt;br /&gt;  private var _inner : Rectangle;&lt;br /&gt;  private var _outer : Rectangle;&lt;br /&gt;  private var _bitmapData : BitmapData;&lt;br /&gt;  private var _outerWidth : Number;&lt;br /&gt;  private var _outerHeight : Number;&lt;br /&gt;  private var _minWidth : Number;&lt;br /&gt;  private var _minHeight : Number;&lt;br /&gt;  private var _originalWidth:Number;&lt;br /&gt;  private var _originalHeight:Number;&lt;br /&gt;&lt;br /&gt;  // ------------------------------------------------&lt;br /&gt;  //&lt;br /&gt;  // ---o constructor&lt;br /&gt;  //&lt;br /&gt;  // ------------------------------------------------&lt;br /&gt;  &lt;br /&gt;  public function ScaleBitmapSprite():void &lt;br /&gt;  {&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;   _width = super.width;&lt;br /&gt;   _height = super.height;&lt;br /&gt;   &lt;br /&gt;   _bitmapData = new BitmapData(_width, _height, true, 0);&lt;br /&gt;   _bitmapData.draw(this, new Matrix(), null, null, null, true);&lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  override public function get scale9Grid():Rectangle { return super.scale9Grid; }&lt;br /&gt;  &lt;br /&gt;  override public function set scale9Grid(value:Rectangle):void &lt;br /&gt;  {&lt;br /&gt;   //super.scale9Grid = value;&lt;br /&gt;   &lt;br /&gt;   _inner = value;&lt;br /&gt;   &lt;br /&gt;   if (!_inner) return;&lt;br /&gt;   &lt;br /&gt;   if (_outer!=null){  &lt;br /&gt;    _width = _outer.width;&lt;br /&gt;    _height = _outer.height;&lt;br /&gt;    _outerWidth = _bitmapData.width - _outer.width;&lt;br /&gt;    _outerHeight = _bitmapData.height - _outer.height;&lt;br /&gt;   } else {&lt;br /&gt;    _width = _inner.width;&lt;br /&gt;    _height = _inner.height;&lt;br /&gt;    _outerWidth = 0;&lt;br /&gt;    _outerHeight = 0; &lt;br /&gt;   } &lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;   _minWidth = _bitmapData.width - _inner.width - _outerWidth;&lt;br /&gt;   _minHeight = _bitmapData.height - _inner.height - _outerHeight;&lt;br /&gt;   &lt;br /&gt;   draw();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  public function get scale9OuterGrid():Rectangle { return _outer }&lt;br /&gt;  &lt;br /&gt;  public function set scale9OuterGrid(value:Rectangle):void &lt;br /&gt;  {&lt;br /&gt;   _outer = value;&lt;br /&gt;   &lt;br /&gt;   if (!_outer) return;&lt;br /&gt;   &lt;br /&gt;    _width = _outer.width;&lt;br /&gt;    _height = _outer.height;&lt;br /&gt;    _outerWidth = _bitmapData.width - _outer.width;&lt;br /&gt;    _outerHeight = _bitmapData.height - _outer.height;&lt;br /&gt;  &lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;   _minWidth = _bitmapData.width - _inner.width - _outerWidth;&lt;br /&gt;   _minHeight = _bitmapData.height - _inner.height - _outerHeight;&lt;br /&gt;   &lt;br /&gt;   draw();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  // ------------------------------------------------&lt;br /&gt;  //&lt;br /&gt;  // ---o public methods&lt;br /&gt;  //&lt;br /&gt;  // ------------------------------------------------&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * draw&lt;br /&gt;   */&lt;br /&gt;  public function draw():void {&lt;br /&gt;   &lt;br /&gt;   graphics.clear();&lt;br /&gt;   &lt;br /&gt;   ScaleBitmap.draw( _bitmapData,&lt;br /&gt;        graphics,&lt;br /&gt;        Math.floor(_width + _outerWidth),&lt;br /&gt;        Math.floor(_height + _outerHeight),&lt;br /&gt;        _inner,&lt;br /&gt;        _outer);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; &lt;br /&gt;  // ------------------------------------------------&lt;br /&gt;  //&lt;br /&gt;  // ---o public methods&lt;br /&gt;  //&lt;br /&gt;  // ------------------------------------------------&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * get width&lt;br /&gt;   */&lt;br /&gt;  override public function get width():Number{&lt;br /&gt;   return _width;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * set width&lt;br /&gt;   */&lt;br /&gt;  override public function set width(w:Number):void &lt;br /&gt;  {&lt;br /&gt;   if (_inner)&lt;br /&gt;   {&lt;br /&gt;    removeAll();&lt;br /&gt;    &lt;br /&gt;    //reset&lt;br /&gt;     this.scaleX = 1;&lt;br /&gt;     this.scaleY = 1;&lt;br /&gt;     &lt;br /&gt;    _width=Math.max(w,_minWidth);&lt;br /&gt;    draw();&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;   _width = w;&lt;br /&gt;   super.width = w;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * get height&lt;br /&gt;   */&lt;br /&gt;  override public function get height():Number{&lt;br /&gt;   return _height;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * set height&lt;br /&gt;   */&lt;br /&gt;  override public function set height(h:Number):void &lt;br /&gt;  {&lt;br /&gt;   if (_inner)&lt;br /&gt;   {&lt;br /&gt;    removeAll();&lt;br /&gt;    &lt;br /&gt;    //reset&lt;br /&gt;    this.scaleX = 1;&lt;br /&gt;    this.scaleY = 1;&lt;br /&gt;     &lt;br /&gt;   _height=Math.max(h, _minHeight);&lt;br /&gt;   draw();&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;   _height = h;&lt;br /&gt;   super.height = h;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * get bitmapData&lt;br /&gt;   */&lt;br /&gt;  public function get bitmapData() : BitmapData{&lt;br /&gt;   return _bitmapData;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * set bitmapData&lt;br /&gt;   */&lt;br /&gt;  public function set bitmapData(b : BitmapData) : void {&lt;br /&gt;   &lt;br /&gt;   _bitmapData=b;&lt;br /&gt;   draw();&lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /**&lt;br /&gt;   * &lt;br /&gt;   */&lt;br /&gt;  public function removeAll():void&lt;br /&gt;   {&lt;br /&gt;    var i:int = 0&lt;br /&gt;    var num:int = this.numChildren;&lt;br /&gt;    &lt;br /&gt;    for (; i &lt; num; i++)&lt;br /&gt;    removeChildAt(0);&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Source:&lt;/span&gt;&lt;a href="http://www.winx.ws/blog/ScaleBitmapSprite.zip"&gt;download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-394465815311993797?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/dv24RgBOOpk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/394465815311993797/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/03/how-to-with-scale9grid-problem.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/394465815311993797?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/394465815311993797?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/dv24RgBOOpk/how-to-with-scale9grid-problem.html" title="How to Solve scale9Grid Problem AS3(Flash)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Hoya55ledVM/S4-knEsUi4I/AAAAAAAAABM/xqYPvK3Bjs8/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/03/how-to-with-scale9grid-problem.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YFRXo6eCp7ImA9WhdaFUk.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-2649799639919916801</id><published>2010-03-03T11:50:00.001-08:00</published><updated>2011-10-25T06:25:14.410-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-25T06:25:14.410-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JSON" /><category scheme="http://www.blogger.com/atom/ns#" term="Localization" /><category scheme="http://www.blogger.com/atom/ns#" term="String.Format" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="loadLanguageXML.Locale" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash" /><category scheme="http://www.blogger.com/atom/ns#" term="Multilanguage" /><title>How to make Multilanguage support AS3 (Flash) Localization</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uuLQEguIoHLlUZLYCOV_c9KCFfI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uuLQEguIoHLlUZLYCOV_c9KCFfI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uuLQEguIoHLlUZLYCOV_c9KCFfI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uuLQEguIoHLlUZLYCOV_c9KCFfI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_Hoya55ledVM/S5D-Qz0gJHI/AAAAAAAAACE/ZAyJn8_y4lo/s1600-h/Clipboard01.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5445131514232710258" src="http://2.bp.blogspot.com/_Hoya55ledVM/S5D-Qz0gJHI/AAAAAAAAACE/ZAyJn8_y4lo/s320/Clipboard01.jpg" style="float: right; height: 247px; margin: 0pt 0pt 10px 10px; width: 320px;" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The story of multilanguage support of your application&lt;br /&gt;
or localization in Flash begins with &lt;span style="font-style: italic;"&gt;Strings Panel&lt;/span&gt; that can be accessed &lt;span style="font-weight: bold;"&gt;Window-&amp;gt;Other Panels-&amp;gt;Strings&lt;/span&gt;. Actually the basic logic of localization is creating of file (txt, XML, database, SWF(in Flex) or other), containing &lt;span style="font-style: italic;"&gt;key-value&lt;/span&gt; pairs (ID of the string as &lt;span style="font-style: italic;"&gt;key&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;value&lt;/span&gt; actual string) for each language.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When you choose Settings from String Panel you can add languages from the list on&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/_Hoya55ledVM/S5EAH-s0DKI/AAAAAAAAACM/Snu_Cpk3LZg/s1600-h/Clipboard02.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5445133561557683362" src="http://3.bp.blogspot.com/_Hoya55ledVM/S5EAH-s0DKI/AAAAAAAAACM/Snu_Cpk3LZg/s1600/Clipboard02.jpg" style="display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
right that your application would support or custom languages (&lt;span style="font-weight: bold;"&gt;mk (Macedonian)&lt;/span&gt;) and Flash will crate the xml language files for you in separate folder. (&lt;span style="font-weight: bold;"&gt;This is very buggy and you will find sometime new version of your xmls where the 0S folder pointer was pointing last time&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
There are 3 ways how you can use those files:&lt;br /&gt;
"&lt;span style="font-style: italic;"&gt;automatically at runtime&lt;/span&gt;" —Flash Player replaces string IDs with strings from the XML file matching the default system language code returned by flash.system.capabilities.language. &lt;br /&gt;
"&lt;span style="font-style: italic;"&gt;manually using stage language&lt;/span&gt;" —String IDs are replaced by strings at compile time and cannot be changed by Flash Player. &lt;br /&gt;
"&lt;span style="font-style: italic;"&gt;via ActionScript at runtime&lt;/span&gt;" —String ID replacement is controlled using ActionScript at runtime. This option gives you control over both the timing and language of string ID replacement.&lt;br /&gt;
I prefer the last, cos give me more flexibility then other two . &lt;span style="font-weight: bold;"&gt;TIP:&lt;/span&gt;&lt;span style="font-style: italic;"&gt;If you use it be sure that you not have static fields. You will got stuck with static fields for in scenario when you want to change application languages in runtime.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/_Hoya55ledVM/S5EGSeq-apI/AAAAAAAAACU/XsmdJUydqq0/s1600-h/Clipboard03.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5445140339008367250" src="http://3.bp.blogspot.com/_Hoya55ledVM/S5EGSeq-apI/AAAAAAAAACU/XsmdJUydqq0/s1600/Clipboard03.jpg" style="display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Creating key(ID)-value pairs is done by selecting of the TextField and filing the data in StringsPanel. The smaller TextField in Strings Panel is for ID and the bigger one is for string value for currently selected language. When you hit Apply, you will see that row in the table below got filled and you can add string values for additional languages.&lt;br /&gt;
XML created would look like&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_Hoya55ledVM/S5EJMtKCluI/AAAAAAAAACc/I7lFVColo5w/s1600-h/Clipboard04.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5445143538352428770" src="http://4.bp.blogspot.com/_Hoya55ledVM/S5EJMtKCluI/AAAAAAAAACc/I7lFVColo5w/s1600/Clipboard04.jpg" style="display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;TIP:&lt;/span&gt;&lt;span style="font-style: italic;"&gt;It would be of great help to the translator and developer if you put descriptive IDS like IDS_CREATBUTTON_LABEL, IDS_BASEWND_CAPTION and so on&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As I said above for bigger control and flexibility you will use "third" mode and you will create the XML files yourself, without using Strings Panel at all, following the requested convention.&lt;br /&gt;
In Flash &lt;span style="font-style: italic;"&gt;ResourceManager(FlexSDK)&lt;/span&gt; class is &lt;span style="font-style: italic;"&gt;Locale&lt;/span&gt; class &lt;span style="font-style: italic;"&gt;import fl.lang.Locale&lt;/span&gt;; and have handy methods.&lt;br /&gt;
In the constructor of your application you can set the location from where swf will load xml file for requested language designated with language code (ex. "en","mk"):&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
Locale.addXMLPath("mk", pathT0+"My_mk.xml");&lt;br /&gt;
Locale.addXMLPath("en", pathT0+"My_en.xml");&lt;code&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;You can load different languages in runtime:&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;code&gt;&lt;code&gt;btn.addEventListener(MouseEvent.Click,onSwitchButtonClick);&lt;br /&gt;
private function onSwitchButtonClick(e:MouseEvent):void &lt;br /&gt;
{&lt;br /&gt;
//initiate loading of the xml file previously added with &lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;addXMLPath&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;code&gt;&lt;code&gt; Locale.loadLanguageXML(languageCode,onLanguageLoad);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
private function onLanguageLoad(success:Boolean):void&lt;br /&gt;
{ &lt;br /&gt;
&lt;span style="color: #38761d;"&gt;//setLanguage(languageCode:String):void function used to change language of all components of the window or group or components that need language change.&lt;/span&gt;&lt;br /&gt;
setLanguage(languageCode);&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt; &lt;code&gt;&lt;br /&gt;
public function setLanguage(languageCode:String):void &lt;br /&gt;
{&lt;br /&gt;
myTextField.text = Locale.loadStringEx("IDS_TEST_STRING", languageCode);&lt;br /&gt;
myCheckBox.label =Locale.loadStringEx("IDS_MYCHECKBOX_LABEL", languageCode);&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;span style="color: white;"&gt;In the case of localization of the components that have dataProvider like ComboBox,List,TabBar,Tree... we can use JSON library to decode:&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br style="color: #666666;" /&gt;&lt;span style="color: white;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;//in language xml file&amp;nbsp;&amp;lt; resname="IDS_COMBOBOX_DATA"&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&amp;lt;source&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;"{'label':'Item1','data':1},{'label':'Item2','data':2},{'label':'Item3','data':3}"&amp;lt;/source&amp;gt;  data has been JSON formated&lt;/span&gt; &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt; myComboBox=new DataProvider(JSON.decode(Locale.loadStringEx("IDS_COMBOBOX_DATA"&lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt; ,languageCode ) as Array);&lt;/span&gt;&lt;/code&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;&lt;code&gt;&lt;br style="color: red;" /&gt;&lt;span style="color: red;"&gt; &lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt;//inside you language xml file &amp;lt; resname="IDS_STRING_WITH_FORMATING" &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt;&amp;lt;source&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt; "I'm %s and I've %d wifes" &amp;lt;/source&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;span style="color: red;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: #666666;"&gt; &lt;/span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;br style="color: white;" /&gt;&lt;span style="color: red;"&gt; StringUtil.format(Locale.loadStringEx("IDS_STRING_WITH_FORMATING", languageCode),"'"+stringVariable1+"'",intVariable2);&lt;/span&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;code&gt;&lt;span style="color: white;"&gt;StringUtil is used to fill special tags %d,%s... with variables values&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;
Source:&lt;/span&gt;&lt;a href="http://www.winx.ws/blog/StringUtil.zip"&gt;download&lt;/a&gt;&lt;/code&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-2649799639919916801?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/rVu3KV0fadM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/2649799639919916801/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2010/03/multilanguage-support-as3-flash.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/2649799639919916801?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/2649799639919916801?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/rVu3KV0fadM/multilanguage-support-as3-flash.html" title="How to make Multilanguage support AS3 (Flash) Localization" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Hoya55ledVM/S5D-Qz0gJHI/AAAAAAAAACE/ZAyJn8_y4lo/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2010/03/multilanguage-support-as3-flash.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08MQHY6fyp7ImA9WxRbGUg.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-328768480569767546</id><published>2008-12-10T14:26:00.000-08:00</published><updated>2008-12-10T15:31:21.817-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T15:31:21.817-08:00</app:edited><title>MovieClipUIComponentMaterial</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x5x17zQCg3cOUorjDp-bS4xQD4c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x5x17zQCg3cOUorjDp-bS4xQD4c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x5x17zQCg3cOUorjDp-bS4xQD4c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x5x17zQCg3cOUorjDp-bS4xQD4c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.winx.ws/blog/ComponentMaterialTest.html"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 231px;" src="http://1.bp.blogspot.com/_Hoya55ledVM/SUBPGHQqSoI/AAAAAAAAAAY/jwn_qzmAUoA/s320/Clipboard01.jpg" alt="" id="BLOGGER_PHOTO_ID_5278305729724959362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;One of stuffs that I needed and missed in papervison2.0 was lack of  material that supports UIComponents. Basically I don't want to use  mambo-jumbo tricks in Flash as possible. I've found the Jonh Garden blog about using UIComponents on material and problems. Problems wasn't just that UIComponents are changing size after init but constant render which affect then material bitmap. I didn' like hiding component movie in x=y=1000 and wiring evets and waiting for every tcomponet to be added on Stage. About component movie the first idea was to make upadate by using of native render() method but I've ended with set alpha=1 on the RenderTick and then alpha=0. To force to draw components I've used the well known parent-child tactics on making components UIComponent(child).drawNow(); To make ComboBox, ColorPicker and other to work on this material you need a little hack ;D. Bla bla....The source  &lt;a href="http://www.winx.ws/blog/ComponentMaterialTest.rar"&gt;source&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5117115183110986877-328768480569767546?l=winxalex.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/CQYgCCHRS3I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/328768480569767546/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2008/12/movieclipuicomponentmaterial.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/328768480569767546?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/328768480569767546?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/CQYgCCHRS3I/movieclipuicomponentmaterial.html" title="MovieClipUIComponentMaterial" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Hoya55ledVM/SUBPGHQqSoI/AAAAAAAAAAY/jwn_qzmAUoA/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2008/12/movieclipuicomponentmaterial.html</feedburner:origLink></entry></feed>

