<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2055530350521596454</id><updated>2012-02-10T20:42:39.734-08:00</updated><category term='MicroPlanet'/><category term='ActiveTuts+'/><category term='Game'/><category term='Carousel'/><category term='ASUnit'/><category term='Chaser'/><category term='ZContainer'/><category term='CJFile'/><category term='Fader'/><category term='Papervision3D'/><category term='FX'/><category term='Output'/><category term='PureMVC'/><category term='WonderFL'/><category term='Dragger'/><category term='3DS Max'/><category term='ZedBox'/><category term='Mapper'/><category term='Rusher'/><category term='Flash'/><category term='MagnifierFX'/><category term='AuxGeom'/><category term='Fenozix'/><category term='Stardust'/><category term='SWC'/><category term='CJLibrary CS4'/><category term='CJSignals'/><category term='Flex'/><category term='ND3D'/><category term='Shintaz'/><category term='GlowFX'/><category term='Bunnies'/><category term='Swift3D'/><category term='Animation'/><category term='AfterEffects'/><category term='PushButtonEngine'/><category term='component 3.0'/><category term='FlashDevelop'/><category term='Alternativa3D'/><category term='Minko'/><category term='TurbulenceFX'/><category term='Flint'/><category term='Pixel Bender'/><category term='ZSorter'/><category term='AIR'/><category term='AS3'/><category term='DynaShape'/><category term='Progression'/><category term='Java'/><category term='Away3D'/><category term='Tile'/><category term='API'/><category term='GreenSock'/><category term='CG'/><category term='Crowd'/><category term='Pyronova'/><category term='CJ'/><category term='Astro'/><category term='Box2D'/><category term='FenoFSM'/><category term='Emitter'/><category term='Flex SDK'/><category term='SVN'/><category term='Illustrator'/><category term='Flare3D'/><title type='text'>CJ's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default?start-index=101&amp;max-results=100'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>167</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7270506232868404504</id><published>2011-01-23T00:37:00.000-08:00</published><updated>2011-01-23T00:37:53.869-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CJ'/><title type='text'>Moving to a New Blog</title><content type='html'>I’ve registered a new domain, and I've moved to &lt;a href="http://blog.cjcat.net/"&gt;a new blog&lt;/a&gt;.&lt;br /&gt;Future posts will be posted there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7270506232868404504?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7270506232868404504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7270506232868404504&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7270506232868404504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7270506232868404504'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2011/01/moving-to-new-blog.html' title='Moving to a New Blog'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-2504986624482132273</id><published>2011-01-07T11:25:00.000-08:00</published><updated>2011-01-07T11:34:08.006-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Away3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Alternativa3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Minko'/><title type='text'>Stardust 1.3 Released!</title><content type='html'>&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png" alt=""/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally! Stardust version 1.3 is released!&lt;br /&gt;&lt;br /&gt;I've updated all the examples, so they all work perfectly with the new &lt;a href="http://cjcat.blogspot.com/2011/01/particle-handlers-for-stardust-13.html"&gt;particle handlers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm currently working on the integration of Stardust and &lt;a href="http://aerys.in/minko"&gt;Minko&lt;/a&gt;, a new 3D engine that will support the &lt;a href="http://labs.adobe.com/technologies/flash/molehill/"&gt;Molehill APIs&lt;/a&gt;. &lt;a href="twitter.com/#!/search/paq89"&gt;Paq&lt;/a&gt; is working on the integration with &lt;a href="alternativaplatform.com/en/"&gt;Alternativa3D&lt;/a&gt; and &lt;a href="away3d.com"&gt;Away3D&lt;/a&gt;, whilch will also support the Molehill APIs. I'm really looking forward to Stardust being used in Molehill-powered applications (especially games, of course), enriching the visual experience with 3D particles!.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-2504986624482132273?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/2504986624482132273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=2504986624482132273&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2504986624482132273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2504986624482132273'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2011/01/stardust-13-released.html' title='Stardust 1.3 Released!'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7110527768378206346</id><published>2011-01-03T04:23:00.000-08:00</published><updated>2011-01-07T22:37:44.437-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Particle Handlers for Stardust 1.3</title><content type='html'>&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png" alt=""/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As a quick notice, &lt;a href="http://twitter.com/#!/paq89"&gt;Paq&lt;/a&gt; has joined the Stardust development team. He'll be working on plugins for &lt;a href="http://alternativaplatform.com/en/alternativa3d/"&gt;Alternativa3D&lt;/a&gt; and &lt;a href="http://away3d.com/"&gt;Away3D&lt;/a&gt;, and Japanese localization. Horray!!&lt;br /&gt;&lt;br /&gt;I'm currently working on the most important new features of Stardust 1.3, switching from renderers to particle handlers.&lt;br /&gt;&lt;br /&gt;Previously, the particle data in Stardust are read and visually presented by the &lt;code&gt;Renderer&lt;/code&gt; class, whose &lt;code&gt;particlesAdded&lt;/code&gt;, &lt;code&gt;particlesRemoved&lt;/code&gt;, and &lt;code&gt;render&lt;/code&gt; methods take in &lt;code&gt;ParticleCollection&lt;/code&gt; objects as parameters, and traverse them to retrieve particle data, resulting in almost twice the processing overhead for particle traversal.&lt;br /&gt;&lt;br /&gt;I've found this extra traversal effort quite unnecessary. Since a complete traversal of the internal particle collection of each emitter is already done in each emitter step, so why not "embed" the rendering process into the emitter step? This is how I came up with the idea for particle handlers.&lt;br /&gt;&lt;br /&gt;The skeleton of the &lt;code&gt;ParticleHandler&lt;/code&gt; class looks like this:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[class ParticleHandler extends StardustElement { public function stepBegin(emitter:Emitter, particles:ParticleCollection, time:Number):void {} public function stepEnd(emitter:Emitter, particles:ParticleCollection, time:Number):void {} public function particleAdded(particle:Particle):void {} public function particleRemoved(particle:Particle):void {} public function readParticle(particle:Particle):void {}}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;stepBegin&lt;/code&gt; method is invoked at the beginning of each emitter step.&lt;br /&gt;The &lt;code&gt;stepEnd&lt;/code&gt; method is invoked at the end of each emitter step.&lt;br /&gt;The &lt;code&gt;particlesAdded&lt;/code&gt; method is invoked when a new particle is added to the emitter.&lt;br /&gt;The &lt;code&gt;particlesRemoved&lt;/code&gt; method is invoked when a dead particle is removed from the emitter.&lt;br /&gt;The &lt;code&gt;readParticle&lt;/code&gt; method is invoked when a particle is fully updated by all actions.&lt;br /&gt;&lt;br /&gt;You may override these methods to create your own handlers. The concept is quite similar to that of the renderers, only that particle handlers do not require extra (and unnecessary) particle collection traversal. Everything is done in one single traversal.&lt;br /&gt;&lt;br /&gt;A particle handler is assigned to an emitter through the &lt;code&gt;Emitter.particleHandler&lt;/code&gt; property, which is quite straightforward:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[emitter.particleHandler = new DisplayObjectHandler(container);]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;You may find the similarity between the code above and the use of its renderer counterpart:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[new DisplayObjectRenderer(container).addEmitter(emitter);]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Not until I finished the &lt;code&gt;ParticleHandler&lt;/code&gt; class did I realize how easy it is to implement a polling station as a particle handler, favoring those developers preferring polling over events.&lt;br /&gt;&lt;br /&gt;For your information, a polling station is like a passive database. You access the data only when you need to, which is the opposite to an event system. An event system, as most Flash developers are already familiar with, is an active database, "pushing" data to you whenever there is new data available.&lt;br /&gt;&lt;br /&gt;Some framework is designed to better work with polling stations rather than event systems. Thus, I've written a &lt;code&gt;PollingStation&lt;/code&gt; class that works as a polling station, recording all the relevant particles in each emitter step, and exposing an interface for data polling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7110527768378206346?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7110527768378206346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7110527768378206346&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7110527768378206346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7110527768378206346'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2011/01/particle-handlers-for-stardust-13.html' title='Particle Handlers for Stardust 1.3'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1214478201121563995</id><published>2010-11-27T06:31:00.000-08:00</published><updated>2010-11-27T06:31:48.316-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><title type='text'>My Weird Dream - Thriller Game Story Concept</title><content type='html'>I was taking a siesta in my girlfriend's house, and I had this very weird dream. The story of the dream was bizarre yet inspirational. It might serve as a game or movie concept. I thought I should type it down before I forget it.&lt;br /&gt;&lt;br /&gt;So here goes my dream.&lt;br /&gt;&lt;br /&gt;*** &lt;br /&gt;&lt;br /&gt;My girlfriend and I were some sort of secret agents sent by the government to investigate a mafia overload. We managed to get invited to his party held at his mansion, as undercover guests of course. His mansion was located in a small remote village in deep mountains, so it took us hours to drive there.&lt;br /&gt;&lt;br /&gt;It was a very dark night. The mansion was extraordinary, like the ones you see in most movies. Most of the guests consisted of mafia members, and so began our investigation throughout the mansion.&lt;br /&gt;&lt;br /&gt;Somehow I was noticed by a guard. He gave me a full tap-down and found my concealed gun, so our secret operation was blown. My girlfriend and I were held and watched by guards in a small room, with their boss standing aside planning how to torture and interrogate us. Both of us could simply thought about our hopeless future.&lt;br /&gt;&lt;br /&gt;Suddenly, that was when something really wrong went on.&lt;br /&gt;&lt;br /&gt;Without any warning, the entire village experienced a complete black-out. We could hear the screaming form the guests from everywhere in the mansion. We could even hear the shrieking voices from the entire village in the mountains, as if they were chased and attacked by some unidentified beings.&lt;br /&gt;&lt;br /&gt;Then the lights came back.&lt;br /&gt;&lt;br /&gt;The mansion was a mess. Shattered glasses, plates, and furnitures were scattered everywhere. Most of the guests were gone, and the rest were just too terrified to even say a word, with their mind completely left blank, not knowing what exactly to do next. People who managed to get to the garage and tried to drive away from the mansion, from the village, all mysteriously ended up either crashing into obstacles or falling into cliffs, with no survivors.&lt;br /&gt;&lt;br /&gt;The mafia boss, my girlfriend and I, and the guards watching us, were the only people left who had remained conscious and were all thinking what to do next. Then we heard the sound.&lt;br /&gt;&lt;br /&gt;Like thousands of high-pitched squeaking mice all coming at once, we can feel a swarm of unknown beings approaching extremely fast from outside of the mansion window.&lt;br /&gt;&lt;br /&gt;"Quick! Shut the windows!" I yelled.&lt;br /&gt;&lt;br /&gt;Two of the guards rushed to the open window and slammed it closed. But they were not fast enough. Some of the creatures leaked into the room. They were huge bats, or at least I thought they were. Those black-winged creatures soared in the room, attacking all the people inside, trying to bite us with their fangs and mauling us with claws.&lt;br /&gt;&lt;br /&gt;I told the boss and the guards that this was not the time for making enemies. They should free us immediately so that we could work out a way to survive. And so my girlfriend and I were untied. Each of us picked up what we could find as a weapon in the room.&lt;br /&gt;&lt;br /&gt;After a lot of yelling and wielding, all of us managed to kill every single flying creature in the room, shivering and panting.&lt;br /&gt;&lt;br /&gt;"So, I think we DO need to cooperate in order to live." said the mafia boss.&lt;br /&gt;&lt;br /&gt;It seemed that the the entire village had been wiped out, and we were the only survivors, for we could hear not a single voice from the village outside of the mansion.&lt;br /&gt;&lt;br /&gt;"Yeah, I think so." I said.&lt;br /&gt;&lt;br /&gt;And so began our escape from the mansion.&lt;br /&gt;&lt;br /&gt;***&lt;br /&gt;&lt;br /&gt;This is where my dream ended.&lt;br /&gt;&lt;br /&gt;I can still remember us fighting our way through some unearthly and carnivorous creatures in my dream. It was as if those creatures were kind of manifestation of the fear and nightmare of each of us.&lt;br /&gt;&lt;br /&gt;This can be some inspiration to a thriller adventure game. I hope more idea could come along.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1214478201121563995?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1214478201121563995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1214478201121563995&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1214478201121563995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1214478201121563995'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/11/my-weird-dream-thriller-game-story.html' title='My Weird Dream - Thriller Game Story Concept'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8213053975112691882</id><published>2010-10-22T11:35:00.000-07:00</published><updated>2010-10-22T12:34:41.661-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='MicroPlanet'/><category scheme='http://www.blogger.com/atom/ns#' term='Bunnies'/><title type='text'>MicroPlanet Game Concepts</title><content type='html'>Currently I'm training in the School of Political Warfare, since I've passed the test for political officers. After two more months of training, I'll be working in the army as a political officer, hopefully having a much better and easier life than other ordinary soldiers.&lt;br /&gt;&lt;br /&gt;In case you don't follow me on Twitter, I'm accepted into DigiPen's Bachelor of Science in Game Design program. This means I'm going to learn some real hard-core game development skills from the professionals after I get out of the army. I think I shouldn't waste my time on the boring and hollow training classes in the School of Political Warfare, so I've been constantly sketching game concepts in classes.&lt;br /&gt;&lt;br /&gt;Recently, I've come up with this game concept, called MicroPlanet. The story takes place on a galaxy of microscopic planets, where there are bunny-like fungus creatures trying to expand their territory and fighting against opposing tribes.&lt;br /&gt;&lt;br /&gt;Here's the first concept art I've drawn.&lt;br /&gt;(Click on the image for larger view)&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 15.9722px; "&gt;&lt;a href="http://fc04.deviantart.net/fs70/f/2010/295/b/2/micro_planet_by_cjcat2266-d319y1s.jpg"&gt;&lt;img src="http://fc04.deviantart.net/fs70/f/2010/295/b/2/micro_planet_by_cjcat2266-d319y1s.jpg" border="0" alt="" style="cursor: pointer; width: 350px; height: 247px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.9722px; "&gt;&lt;a href="http://fc04.deviantart.net/fs70/f/2010/295/b/2/micro_planet_by_cjcat2266-d319y1s.jpg"&gt;&lt;/a&gt;&lt;/span&gt;Basically, it's a 2D real-time strategy game. The player can only control the creatures, making them gather resources and building stuff, in order to expand the colony and destroy opposing tribes. The creatures cannot directly attack those from the opposing tribes, and vice versa. They can only build weapons, such as tanks and missile silos, to destroy enemy structures. Each tribe has a main building that produces new fungus creatures. When this building is destroyed, the game is over.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below are some concept arts for the main menu screen. The smaller two on the bottom are two different designs for the main menu options.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.9722px; "&gt;&lt;a href="http://fc02.deviantart.net/fs71/f/2010/295/a/f/mp_main_menu_by_cjcat2266-d31a0rw.jpg"&gt;&lt;img src="http://fc02.deviantart.net/fs71/f/2010/295/a/f/mp_main_menu_by_cjcat2266-d31a0rw.jpg" border="0" alt="" style="cursor: pointer; width: 300px; height: 275px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are some quick sketches for various units, resources, and buildings.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.9722px; "&gt;&lt;a href="http://fc02.deviantart.net/fs70/f/2010/295/2/c/mp_units_by_cjcat2266-d319yqh.jpg"&gt;&lt;img src="http://fc02.deviantart.net/fs70/f/2010/295/2/c/mp_units_by_cjcat2266-d319yqh.jpg" border="0" alt="" style="cursor: pointer; width: 350px; height: 265px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And below are some more sketches. So far I've come up with three different types of resources: thermo energy, water, and metal. Thermo energy core are like miniature suns floating in the air; the Thermo Absorber is a ring-like structure that absorbers the thermo energy radiating from the core. On micro planets, water appears as floating blobs; the Water Station gathers water resource from below using an erect pipe.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.9722px; "&gt;&lt;a href="http://fc05.deviantart.net/fs71/f/2010/295/9/1/mp_units_2_by_cjcat2266-d31a08b.jpg"&gt;&lt;img src="http://fc05.deviantart.net/fs71/f/2010/295/9/1/mp_units_2_by_cjcat2266-d31a08b.jpg" border="0" alt="" style="cursor: pointer; width: 350px; height: 242px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are two types of planets: solid planets and gas planets. There are some planet-specific buildings and resources, which I'm still working on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the top left you can see a quick concept sketch of the in-game screen, where a minimap is present and the character is selected.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;That's it for MicroPlanet concept so far. I'll go as far as I can when I'm in the army, and I'll try get directly down to some coding when I'm home. Or at least I could do some CG concept arts.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8213053975112691882?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8213053975112691882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8213053975112691882&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8213053975112691882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8213053975112691882'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/10/microplanet-game-concepts.html' title='MicroPlanet Game Concepts'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-2463132439675602282</id><published>2010-08-07T22:47:00.001-07:00</published><updated>2010-08-07T22:54:35.898-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='CJ'/><title type='text'>My One-Year Compulsory Military Service</title><content type='html'>I'm about to fulfill my compulsory military service tomorrow (August 9), and it ends in mid-July 2011. During my service, I can only have web access perhaps every one or two weeks, or even longer. So the updates and fixes to my projects will become far less frequent than normal. You may still email me if you've got any problems with the projects. I don't guarantee a quick response, but I'll reply as soon as possible.&lt;br /&gt;&lt;br /&gt;I've applied for the "Bachelor of Science in Game Design (Fall 2011)" program in &lt;a href="https://www.digipen.edu/"&gt;DigiPen&lt;/a&gt;. The result will come out several weeks later. I hope I could make it :)&lt;br /&gt;&lt;br /&gt;P.S. I've shaved my head for the army, and it takes only 10 seconds to dry it after shower!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-2463132439675602282?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/2463132439675602282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=2463132439675602282&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2463132439675602282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2463132439675602282'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/08/my-one-year-compulsory-military-service.html' title='My One-Year Compulsory Military Service'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-2944160267892994122</id><published>2010-08-01T07:43:00.000-07:00</published><updated>2010-08-01T16:05:43.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CJSignals'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>Using MVC Pattern in Rusher</title><content type='html'>&lt;a href="http://code.google.com/p/rusher/"&gt;&lt;img src="http://rusher.googlecode.com/svn/trunk/logo/Rusher%20logo%20250x115.png" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/rusher/"&gt;Rusher project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/rusher/"&gt;Rusher&lt;/a&gt; is now version 0.6 Beta. One of the most important changes is the extraction of entity-related code from the &lt;code&gt;Engine&lt;/code&gt; class into the &lt;code&gt;EntityManager&lt;/code&gt; class. So instead of writing things like:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[ engine.addEntity(myEntity); ]]&gt;&lt;/script&gt;&lt;br /&gt;you write:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[ engine.entityManager.addEntity(myEntity); ]]&gt;&lt;/script&gt;&lt;br /&gt;I've also added a new MVC Pattern example. Actually, it was one of my experiments to try implementing the MVC Patern in Rusher. This one turned out nice, so I've committed it to the repository. This example is simply a proof of concept, and I might find out other better approaches to using the MVC Pattern in Rusher.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rusher.googlecode.com/svn/trunk/examples/MVCPainter/bin/Main.swf"&gt;View example demo&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rusher.googlecode.com/svn/trunk/examples/MVCPainter/"&gt;View example source&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This example is a very simple painter application, consisted of a color chooser, a clear button, and a bitmap canvas where you can draw with your cursor.&lt;br /&gt;&lt;br /&gt;The entire application is represented by the &lt;code&gt;Context&lt;/code&gt; class, which extends the &lt;code&gt;Entity&lt;/code&gt; class. There are four components added to this entity: &lt;code&gt;Signaller&lt;/code&gt;, &lt;code&gt;Model&lt;/code&gt;, &lt;code&gt;View&lt;/code&gt;, and &lt;code&gt;Controller&lt;/code&gt;.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;h3&gt;Context&lt;/h3&gt;&lt;br /&gt;The &lt;code&gt;Context&lt;/code&gt; class is pretty simple. It creates four components and adds it to itself. Another important modification to Rusher in version 0.6 is the one-clock-cycle-delayed invocation to the &lt;code&gt;Component.onAdd()&lt;/code&gt; method. In this way, the order in which the components are added to the entity does not affect whether accessing other components in a component's &lt;code&gt;onAdd()&lt;/code&gt; method yields a null value.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class Context extends Entity {&lt;br /&gt; &lt;br /&gt; private var _signaller:Signaller;&lt;br /&gt; public function get signaller():Signaller { return _signaller; }&lt;br /&gt; &lt;br /&gt; private var _model:Model;&lt;br /&gt; public function get model():Model { return _model; }&lt;br /&gt; &lt;br /&gt; private var _view:View;&lt;br /&gt; public function get view():View { return _view; }&lt;br /&gt; &lt;br /&gt; private var _controller:Controller;&lt;br /&gt; public function get controller():Controller { return _controller; }&lt;br /&gt; &lt;br /&gt; public function Context() {&lt;br /&gt;  name = Const.CONTEXT;&lt;br /&gt;  &lt;br /&gt;  _signaller = new Signaller();&lt;br /&gt;  _model = new Model();&lt;br /&gt;  _view = new View();&lt;br /&gt;  _controller = new Controller();&lt;br /&gt;  &lt;br /&gt;  addComponent(signaller);&lt;br /&gt;  addComponent(model);&lt;br /&gt;  addComponent(view);&lt;br /&gt;  addComponent(controller);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Signaller&lt;/h3&gt;&lt;br /&gt;The &lt;code&gt;Signaller&lt;/code&gt; component is pretty much a "signal hub" consisted of several &lt;a href="http://code.google.com/p/cjsignals/"&gt;CJSignals&lt;/a&gt; signal objects. These signal objects dispatch application events listened by other components. Also, other components can cause these signal objects to dispatch events.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class Signaller extends Component {&lt;br /&gt; &lt;br /&gt; private var _onLineColor:ISignal = new Signal(uint);&lt;br /&gt; public function get onLineColor():ISignal { return _onLineColor; }&lt;br /&gt; &lt;br /&gt; private var _onMoveTo:ISignal = new Signal(Number, Number);&lt;br /&gt; public function get onMoveTo():ISignal { return _onMoveTo; }&lt;br /&gt; &lt;br /&gt; private var _onLineTo:ISignal = new Signal(Number, Number);&lt;br /&gt; public function get onLineTo():ISignal { return _onLineTo; }&lt;br /&gt; &lt;br /&gt; private var _onClear:ISignal = new Signal();&lt;br /&gt; public function get onClear():ISignal { return _onClear; }&lt;br /&gt; &lt;br /&gt; //-------------------------------------------------&lt;br /&gt; &lt;br /&gt; public function Signaller() {&lt;br /&gt;  name = Const.SIGNALLER;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Model&lt;/h3&gt;&lt;br /&gt;The &lt;code&gt;Model&lt;/code&gt; component contains the underlying application data, a &lt;code&gt;BitmapData&lt;/code&gt; object representing the canvas. Also, this component defines several public methods that modifies the bitmap data. These methods allow users to change the line color, move the drawing pen position, draw a line, and clear the entire canvas.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class Model extends Component {&lt;br /&gt; &lt;br /&gt; private static const DEFAULT_LINE_THICKNESS :Number = 2;&lt;br /&gt; private static const DEFAULT_LINE_COLOR  :uint = 0x000000;&lt;br /&gt; &lt;br /&gt; private var _bitmapData:BitmapData = _bitmapData = new BitmapData(600, 400, false, 0xFFFFFF);&lt;br /&gt; public function get bitmapData():BitmapData { return _bitmapData; }&lt;br /&gt; &lt;br /&gt; private var _shape:Shape = _shape = new Shape();&lt;br /&gt; private var _color:uint = DEFAULT_LINE_COLOR;&lt;br /&gt; &lt;br /&gt; //-------------------------------------------------&lt;br /&gt; &lt;br /&gt; public function Model() {&lt;br /&gt;  name = Const.MODEL;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; override public function onAdd():void {&lt;br /&gt;  _shape.graphics.lineStyle(DEFAULT_LINE_THICKNESS, _color);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function lineColor(color:uint):void {&lt;br /&gt;  _color = color;&lt;br /&gt;  _shape.graphics.lineStyle(DEFAULT_LINE_THICKNESS, color);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function moveTo(x:Number, y:Number):void {&lt;br /&gt;  _shape.graphics.moveTo(x, y);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function lineTo(x:Number, y:Number):void {&lt;br /&gt;  _shape.graphics.lineTo(x, y);&lt;br /&gt;  _bitmapData.draw(_shape);&lt;br /&gt;  _shape.graphics.clear();&lt;br /&gt;  _shape.graphics.lineStyle(DEFAULT_LINE_THICKNESS, _color);&lt;br /&gt;  _shape.graphics.moveTo(x, y);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function clear():void {&lt;br /&gt;  _bitmapData.fillRect(_bitmapData.rect, 0xFFFFFF);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;View&lt;/h3&gt;&lt;br /&gt;The &lt;code&gt;View&lt;/code&gt; component constructs and displays the visual representation of the application. In addition, this component listens for the mouse event dispatched by these display objects and relays these events to the signal objects in the &lt;code&gt;Signaller&lt;/code&gt; component.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class View extends Component {&lt;br /&gt; &lt;br /&gt; private var _canvas:Sprite;&lt;br /&gt; public function get canvas():Sprite { return _canvas; }&lt;br /&gt; &lt;br /&gt; //reference holders&lt;br /&gt; private var _context:Context;&lt;br /&gt; private var _signaller:Signaller;&lt;br /&gt; &lt;br /&gt; //view components&lt;br /&gt; private var _colorChooser:ColorChooser;&lt;br /&gt; private var _clearButton:PushButton;&lt;br /&gt; private var _mouseIsDown:Boolean = false;&lt;br /&gt; &lt;br /&gt; //-------------------------------------------------&lt;br /&gt; &lt;br /&gt; public function View() {&lt;br /&gt;  name = Const.VIEW;&lt;br /&gt;  &lt;br /&gt;  _canvas = new Sprite();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; override public function onAdd():void {&lt;br /&gt;  //store references&lt;br /&gt;  _context = Context(engine.entityManager.getEntity(Const.CONTEXT));&lt;br /&gt;  _signaller = _context.signaller;&lt;br /&gt;  &lt;br /&gt;  //construct display tree&lt;br /&gt;  var bitmap:Bitmap = new Bitmap(_context.model.bitmapData);&lt;br /&gt;  var bitmapEventListener:Sprite = new Sprite();&lt;br /&gt;  bitmapEventListener.addChild(bitmap);&lt;br /&gt;  _canvas.addChild(bitmapEventListener);&lt;br /&gt;  _colorChooser = new ColorChooser(canvas, 10, 40, 0x000000);&lt;br /&gt;  _colorChooser.addEventListener(Event.CHANGE, onColorChange);&lt;br /&gt;  _clearButton = new PushButton(canvas, 10, 10, "Clear", onClear);&lt;br /&gt;  &lt;br /&gt;  //add mouse listeners&lt;br /&gt;  bitmapEventListener.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);&lt;br /&gt;  bitmapEventListener.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);&lt;br /&gt;  bitmapEventListener.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //dispatch onMove signal&lt;br /&gt; private function onMouseDown(e:MouseEvent):void {&lt;br /&gt;  _mouseIsDown = true;&lt;br /&gt;  _signaller.onMoveTo.dispatch(e.stageX, e.stageY);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function onMouseUp(e:MouseEvent):void {&lt;br /&gt;  _mouseIsDown = false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //dispatch onLineTo signal&lt;br /&gt; private function onMouseMove(e:MouseEvent):void {&lt;br /&gt;  if (_mouseIsDown) {&lt;br /&gt;   _signaller.onLineTo.dispatch(e.stageX, e.stageY);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //dispatch onColorChange signal&lt;br /&gt; private function onColorChange(e:Event):void{&lt;br /&gt;  _signaller.onLineColor.dispatch(_colorChooser.value);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //dispatch onClear signal&lt;br /&gt; private function onClear(e:Event):void{&lt;br /&gt;  _signaller.onClear.dispatch();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Controller&lt;/h3&gt;&lt;br /&gt;The &lt;code&gt;Controller&lt;/code&gt; component listens the signal objects in the &lt;code&gt;Signaller&lt;/code&gt; component and maps them to command objects. These command objects invokes the public methods provided by the &lt;code&gt;Model&lt;/code&gt; class to modify the underlying bitmap data.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class Controller extends Component {&lt;br /&gt; &lt;br /&gt; public function Controller() {&lt;br /&gt;  name = Const.CONTROLLER;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; override public function onAdd():void {&lt;br /&gt;  var context:Context = Context(engine.entityManager.getEntity(Const.CONTEXT));&lt;br /&gt;  var signaller:Signaller = context.signaller;&lt;br /&gt;  &lt;br /&gt;  //map signals to commands&lt;br /&gt;  signaller.onLineColor.add(onLineColorListener);&lt;br /&gt;  signaller.onMoveTo.add(onMoveToListener);&lt;br /&gt;  signaller.onLineTo.add(onLineToListener);&lt;br /&gt;  signaller.onClear.add(onClearListener);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function onLineColorListener(color:uint):void{&lt;br /&gt;  executeCommand(new LineColor(color));&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function onMoveToListener(x:Number, y:Number):void{&lt;br /&gt;  executeCommand(new MoveTo(x, y));&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function onLineToListener(x:Number, y:Number):void{&lt;br /&gt;  executeCommand(new LineTo(x, y));&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function onClearListener():void{&lt;br /&gt;  executeCommand(new Clear());&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function executeCommand(command:Command):void {&lt;br /&gt;  engine.commandManager.execute(command);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Finally, below are the command classes.&lt;br /&gt;&lt;br /&gt;This is the &lt;code&gt;LineColor&lt;/code&gt; command that changes the line color.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class LineColor extends Command {&lt;br /&gt; &lt;br /&gt; private var _color:uint;&lt;br /&gt; &lt;br /&gt; public function LineColor(color:uint) {&lt;br /&gt;  _color = color;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; override protected function execute():void {&lt;br /&gt;  var context:Context = Context(engine.entityManager.getEntity(Const.CONTEXT));&lt;br /&gt;  context.model.lineColor(_color);&lt;br /&gt;  complete();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This is the &lt;code&gt;MoveTo&lt;/code&gt; command that moves the position of the drawing pen.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class MoveTo extends Command {&lt;br /&gt; &lt;br /&gt; private var _x:Number;&lt;br /&gt; private var _y:Number;&lt;br /&gt; &lt;br /&gt; public function MoveTo(x:Number, y:Number) {&lt;br /&gt;  _x = x;&lt;br /&gt;  _y = y;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; override protected function execute():void {&lt;br /&gt;  var context:Context = Context(engine.entityManager.getEntity(Const.CONTEXT));&lt;br /&gt;  context.model.moveTo(_x, _y);&lt;br /&gt;  complete();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This is the &lt;code&gt;LineTo&lt;/code&gt; command that draws a line.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class LineTo extends Command {&lt;br /&gt; &lt;br /&gt; private var _x:Number;&lt;br /&gt; private var _y:Number;&lt;br /&gt; &lt;br /&gt; public function LineTo(x:Number, y:Number) {&lt;br /&gt;  _x = x;&lt;br /&gt;  _y = y;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; override protected function execute():void {&lt;br /&gt;  var context:Context = Context(engine.entityManager.getEntity(Const.CONTEXT));&lt;br /&gt;  context.model.lineTo(_x, _y);&lt;br /&gt;  complete();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And this is the &lt;code&gt;Clear&lt;/code&gt; command that clears the entire bitmap data.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class Clear extends Command {&lt;br /&gt; &lt;br /&gt; public function Clear() {&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; override protected function execute():void {&lt;br /&gt;  var context:Context = Context(engine.entityManager.getEntity(Const.CONTEXT));&lt;br /&gt;  context.model.clear();&lt;br /&gt;  complete();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;You may view the source of this example in its entirety &lt;a href="http://rusher.googlecode.com/svn/trunk/examples/MVCPainter/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-2944160267892994122?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/2944160267892994122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=2944160267892994122&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2944160267892994122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2944160267892994122'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/08/using-mvc-pattern-in-rusher.html' title='Using MVC Pattern in Rusher'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6922650448997228966</id><published>2010-07-07T21:24:00.000-07:00</published><updated>2010-07-08T04:02:28.473-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CJSignals'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>Performance-Improving Techniques Employed in CJSignals</title><content type='html'>&lt;a href="http://code.google.com/p/cjsignals/"&gt;&lt;img src="http://cjsignals.googlecode.com/svn/trunk/logo/CJSignals%20logo%20medium.png" alt=""/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/cjsignals/"&gt;CJSignals project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/cjsignals/"&gt;CJSignals&lt;/a&gt; is an observer framework I released a couple of days ago, based on &lt;a href="http://flashblog.robertpenner.com/"&gt;Robert Penner&lt;/a&gt;'s &lt;a href="http://github.com/robertpenner/as3-signals"&gt;AS3 Signals&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For some performance comparison of the native event system, CJSignals, and AS3 Signals, you may check out &lt;a href="http://cjcat.blogspot.com/2010/07/cjsignals-my-new-observer-framework.html"&gt;my previous post&lt;/a&gt;. Here I'm going to describe the performance-improving techniques employed in CJSignals.&lt;br /&gt;&lt;br /&gt;This technique can also be employed elsewhere when massive objects are added and removed from an array very rapidly, where the array must be sorted and performance is vital. &lt;a href="http://code.google.com/p/rusher"&gt;Rusher&lt;/a&gt; also uses this technique to manage prioritized active components.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Listener Array&lt;/h3&gt;&lt;br /&gt;For each listener functions added, a corresponding &lt;code&gt;ListenerData&lt;/code&gt; object is created and stored in the internal array, which contains a reference to the listener, a boolean variable indicating whether the listener is a one-time listener, and an integer variable for keeping track of the index of the &lt;code&gt;ListenerData&lt;/code&gt; object in the array. Also, a mapping relation between the listener and the &lt;code&gt;ListenerData&lt;/code&gt; object is added to an internal dictionary for fast lookup.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Adding Listeners&lt;/h3&gt;&lt;br /&gt;CJSignals keeps track of the index of the &lt;em&gt;first empty cell&lt;/em&gt; of the listener array with an integer variable, i.e. keeping track of the &lt;em&gt;first null element&lt;/em&gt;. When a new listener is added, its corresponding &lt;code&gt;ListenerData&lt;/code&gt; object is inserted to the array cell corresponding to the index, and then the index is incremented by 1. If the array is full, then its size is doubled. This approach assigns elements directly to an array cell by index, instead of invoking &lt;code&gt;Array.push()&lt;/code&gt; every time a new listener is added.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Removing Listeners&lt;/h3&gt;&lt;br /&gt;Listeners can be removed from the array very efficiently. When a listener is removed from a signal, the listener dictionary is used to quickly retrieve the listener's corresponding &lt;code&gt;ListenerData&lt;/code&gt; object. From the &lt;code&gt;ListenerData&lt;/code&gt; object, the index of the object in the array can then be obtained (A). The &lt;em&gt;index of the first empty cell&lt;/em&gt; is decremented by 1, thus pointing to the &lt;em&gt;last non-null element&lt;/em&gt; (B). Cell A's content is replaced by cell B's, and cell B's content is replaced with a null value, so the &lt;em&gt;first-null-element index&lt;/em&gt; is now keeping track of the &lt;em&gt;new first null element&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Priority Sorting&lt;/h3&gt;&lt;br /&gt;Adding and removing listeners sets a &lt;em&gt;listener-array-dirty&lt;/em&gt; flag to true, indicating the necessity to sort the listener array according to the listener priorities. The sorting is not necessary until the next signal dispatch or retrieval of the internal listener array through the public getter method &lt;code&gt;get listeners()&lt;/code&gt;, the flag set back to false afterwards. Thus, multiple calls to the &lt;code&gt;Signal.add()&lt;/code&gt; and &lt;code&gt;Signals.remove()&lt;/code&gt; methods do not cause the array to be re-sorted; it is deferred to the point when the sorting is really necessary. After the array is sorted, the &lt;code&gt;ListenerData&lt;/code&gt; objects are informed of and updated with their new indices.&lt;br /&gt;&lt;br /&gt;I guess the native event system sorts the array every time a new listener is added, resulting in the huge performance difference between the system and CJSignals.&lt;br /&gt;&lt;br /&gt;One good thing about the &lt;code&gt;Array.sort()&lt;/code&gt; method is that it always pushes null elements to the tail of the array, so it's okay to keep a sparse array, as long as the index of the first null element is kept track of.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6922650448997228966?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6922650448997228966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6922650448997228966&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6922650448997228966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6922650448997228966'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/07/performance-improving-techniques.html' title='Performance-Improving Techniques Employed in CJSignals'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3844063882656111249</id><published>2010-07-04T23:18:00.001-07:00</published><updated>2010-07-05T07:54:51.327-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CJSignals'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>CJSignals - My New Observer Framework</title><content type='html'>&lt;a href="http://code.google.com/p/cjsignals/"&gt;&lt;img src="http://cjsignals.googlecode.com/svn/trunk/logo/CJSignals%20logo%20small.png" alt=""/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/cjsignals/"&gt;CJSignals project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You might be able to tell from the project name that this project is inspired by &lt;a href="http://flashblog.robertpenner.com/"&gt;Robert Penner&lt;/a&gt;'s &lt;a href="http://github.com/robertpenner/as3-signals"&gt;AS3 Signals&lt;/a&gt;. Yes, this is the case, indeed.&lt;br /&gt;&lt;br /&gt;I've studied C# before, and played with Qt in the last semester. I felt the same thing Robert felt about the Event System in C# and the Signals/Slots System in Qt. It makes much more sense to extend an observer framework with composition rather than inheritance, and it makes code cleaner and more comprehensible if an object dispatches events of just one type, which is not the case for the ActionScript 3.0 native event dispatchers, for they can dispatch multiple types of events.&lt;br /&gt;&lt;br /&gt;With CJSignals, each type of event corresponds to a &lt;code&gt;Signal&lt;/code&gt; object "owned", a term for composition, by the subject. For instance, you can write code like this.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;myObject.onChange.add(changeListener);&lt;br /&gt;&lt;br /&gt;function changeListener(data:int):void {&lt;br /&gt; //do something&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The parameter types of the listener matches those specified in the signal constructor. For information on the actual usage, you may check out the &lt;a href="http://code.google.com/p/cjsignals/wiki/tutorials"&gt;tutorial wiki page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I built CJSignals from the ground up, using my own implementation of signals to boost performance, mainly performance concerning listener priority management and listener removal. I used the fast-splicing array technique I mentioned in &lt;a href="http://cjcat.blogspot.com/2010/05/stardust-v11-with-fast-array-splicing_21.html"&gt;this post&lt;/a&gt;, which is also employed by &lt;a href="http://code.google.com/p/rusher"&gt;Rusher&lt;/a&gt; for active component priority management. And the priority sorting is only executed upon signal dispatch and if necessary.&lt;br /&gt;&lt;br /&gt;Here's a comparison chart of the performance for the native event system, CJSignals, and AS3 Signals. Although CJSignals places second or third in some tests, the actual numerical results do not pose as bottleneck. What is more important is that CJSignals has the best worst-case performance: the worst test result for CJSignals is merely 13ms, whereas that for the native event system is 681ms, and AS3 Signals 5717ms.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_4-LtXwX7Yuo/TDGPVhPlbpI/AAAAAAAAArI/WGS3WZ7nkNs/CJSignals%20performance%20comparison.png" alt=""/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3844063882656111249?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3844063882656111249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3844063882656111249&amp;isPopup=true' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3844063882656111249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3844063882656111249'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/07/cjsignals-my-new-observer-framework.html' title='CJSignals - My New Observer Framework'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_4-LtXwX7Yuo/TDGPVhPlbpI/AAAAAAAAArI/WGS3WZ7nkNs/s72-c/CJSignals%20performance%20comparison.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4524110655662650431</id><published>2010-06-22T06:10:00.000-07:00</published><updated>2010-06-22T06:47:18.241-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Shintaz'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>The Shintaz Project</title><content type='html'>I've started a new project called Shintaz, also named after &lt;a href="http://cjcat2266.deviantart.com/gallery/#_search/shintaz"&gt;one of my character&lt;/a&gt; from the same series as &lt;a href="http://cjcat2266.deviantart.com/gallery/#_search/rusher"&gt;Rusher&lt;/a&gt;. Shintaz is a scripting engine, consisted of a compiler and a virtual machine. As you may know, the virtual machine behind Flash Player is called ActionScript Virtual Machine (AVM), and the Shintaz Virtual Machine (SVM) is going to be running on AVM. That's right, a VM running on another VM.&lt;br /&gt;&lt;br /&gt;Actually, I took a compiler course this semester in order to help me understand how to develop a compiler and a virtual machine. It really helps a lot!&lt;br /&gt;&lt;br /&gt;The main purpose of developing Shintaz is to integrate it with Rusher, making Rusher a game engine equipped with a scripting engine capable of compiling and running scripts at run-time. This helps the debugging process and may allow people to do lots of dynamic stuff with the game.&lt;br /&gt;&lt;br /&gt;Shintaz's compiler is half-complete, and its virtual machine, SVM, is almost done. SVM is already capable of executing bytecode consisted of &lt;a href="http://en.wikipedia.org/wiki/Opcode"&gt;opcodes&lt;/a&gt;. Same as Java Virtual Machine (JVM), SVM is a &lt;a href="http://en.wikipedia.org/wiki/Stack_machine"&gt;stack machine&lt;/a&gt;, meaning its memory takes the form of one or more stacks.&lt;br /&gt;&lt;br /&gt;Here are some code snippets for generating an opcode array, converting it to Shintaz-compatible bytecode object, and executing the bytecode with SVM.&lt;br /&gt;&lt;br /&gt;The following code declares a variable "x", and assigns it a value of 10. Note how the value 10 is first pushed to the memory stack and then popped to be assigned to "x".&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var opcodes:Array = [];&lt;br /&gt;opcodes.push(Opcode.DECL, "x"); //declare "x"&lt;br /&gt;opcodes.push(Opcode.LDV, 10); //load 10 onto the stack&lt;br /&gt;opcodes.push(Opcode.STR, "x"); //pop the stack and store to "x"&lt;br /&gt;&lt;br /&gt;var bc:Bytecode = Bytecode.buildFromArray(opcodes);&lt;br /&gt;&lt;br /&gt;var vm:VirtualMachine = new VirtualMachine();&lt;br /&gt;vm.execute(bc);&lt;br /&gt;&lt;br /&gt;//retrieve the value of "x"&lt;br /&gt;trace(vm.globalScope.getVar("x")); //10&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;There're also some opcodes for program counter jumping and branching. The following code skips the assignment of a value 20 to "x".&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var opcodes:Array = [];&lt;br /&gt;opcodes.push(Opcode.DECL, "x"); //declare "x"&lt;br /&gt;opcodes.push(Opcode.LDV, 20);&lt;br /&gt;opcodes.push(Opcode.JMP, 9); //jump to the 10-th opcode&lt;br /&gt;opcodes.push(Opcode.POP); //7-th opcode&lt;br /&gt;opcodes.push(Opcode.LDV, 10); //8-th and 9-th opcodes&lt;br /&gt;opcodes.push(Opcode.STR, "x"); //10-th and 11-th opcodes&lt;br /&gt;&lt;br /&gt;var bc:Bytecode = Bytecode.buildFromArray(opcodes);&lt;br /&gt;&lt;br /&gt;var vm:VirtualMachine = new VirtualMachine();&lt;br /&gt;vm.execute(bc);&lt;br /&gt;&lt;br /&gt;//retrieve the value of "x"&lt;br /&gt;trace(vm.globalScope.getVar("x")); //20 instead of 10&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;That's it for the opcodes. Who wants to program with opcodes anyway? Shintaz provides a compiler that accepts scripts with a grammar similar to JavaScript and ActionScript. I'm still working on the parser, but here's how things will turn out.&lt;br /&gt;&lt;br /&gt;The code below does exactly the same thing as the first code snippet, declaring a variable "x" and assigning a value 10 to it, but with high-level scripts.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var script:String = "";&lt;br /&gt;script += "var x = 10;";&lt;br /&gt;&lt;br /&gt;var parser:Parser = new Parser();&lt;br /&gt;var bc:Bytecode = parser.parse(new Scanner(script));&lt;br /&gt;&lt;br /&gt;var vm:VirtualMachine = new VirtualMachine();&lt;br /&gt;vm.execute(bc);&lt;br /&gt;&lt;br /&gt;//retrieve the value of "x"&lt;br /&gt;trace(vm.globalScope.getVar("x")); //10&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Function declaration and class declaration are on its way. I'm trying to find more information on these topics, and then I'll start working on it.&lt;br /&gt;&lt;br /&gt;Lastly, and one of the most important feature of Shintaz, although still work in progress, is symbol linking. What's a scripting worth if it cannot communicate with other objects and functions outside of the virtual machine? Shintaz provides a way to link symbols in the scripts with other ActionScript objects and functions.&lt;br /&gt;&lt;br /&gt;The following code shows how. The trace function is linked to the symbol "print", so any occurrence of the identifier "print" in the script is regarded as a reference to the trace function.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var script:String += "print(\"hello world\");";&lt;br /&gt;&lt;br /&gt;var parser:Parser = new Parser();&lt;br /&gt;var bc:Bytecode = parser.parse(new Scanner(script));&lt;br /&gt;&lt;br /&gt;var vm:VirtualMachine = new VirtualMachine();&lt;br /&gt;vm.linkSymbol("print", trace); //link the symbol "print" with the trace function&lt;br /&gt;vm.execute(bc); //traces out "hello world"&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Oh, I almost forgot. I'm also planning on adding serialization and deserialization features to Shintaz, allowing conversion between compiled Bytecode objects and ByteArray objects. In this way, people can save compiled bytecode to files, and later load and execute them during run-time, saving the time of compilation.&lt;br /&gt;&lt;br /&gt;That's it. I hope I can finish Shintaz before my presentation for the PTT Flash Workshop this year on July 24.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4524110655662650431?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4524110655662650431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4524110655662650431&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4524110655662650431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4524110655662650431'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/06/shintaz-project.html' title='The Shintaz Project'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8877548813143143844</id><published>2010-06-07T08:43:00.000-07:00</published><updated>2010-06-07T09:01:55.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Switching Stardust Particle Collection Type</title><content type='html'>&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png" alt=""/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/paq89"&gt;Paq&lt;/a&gt; from &lt;a href="http://wonderfl.net/"&gt;WonderFL&lt;/a&gt; made a quick performance test with different particle collection types provided by Stardust, and the result turned out to be quite different from my own previous tests. I think the difference is due to the fact that we conducted the tests with different numbers of particles. Hence, it's reasonable to choose which particle collection type to use according to the roughly estimated number of particles that will be present.&lt;br /&gt;&lt;br /&gt;For this reason, also as one of the new feature of Stardust version 1.1.161, I've added the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/common/emitters/Emitter.html#particleCollectionType"&gt;&lt;code&gt;Emitter.particleCollectionType&lt;/code&gt;&lt;/a&gt; getter/setter to allow users to switch between different particle collection types. Valid types are mapped by integers defined in the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/common/particles/ParticleCollectionType.html"&gt;&lt;code&gt;ParticleCollectionType&lt;/code&gt;&lt;/a&gt; class.&lt;br /&gt;&lt;br /&gt;Now the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/common/emitters/Emitter.html#Emitter()"&gt;&lt;code&gt;Emitter&lt;/code&gt;&lt;/a&gt; constructor accepts a second parameter for the integer corresponding to a particle collection type, which is the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/common/particles/ParticleFastArray.html"&gt;&lt;code&gt;ParticleFastArray&lt;/code&gt;&lt;/a&gt; class by default.&lt;br /&gt;&lt;br /&gt;This is how you set the underlying particle collection type of an emitter to a linked list.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var emitter:Emitter = new Emitter(new SteadyClock(1), ParticleCollectionType.LINKED_LIST);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And this is how you switch an emitter's particle collection to a different type, say, an array.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;emitter.particleCollectionType = ParticleCollectionType.ARRAY;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;There's no specific rule in deciding whether a collection type is the best for your specific particle system. In terms of performance, fast arrays are approximately as good as linked lists. However, if you insist on finding the exact best one, you just have to try them all and then determine which works the best.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8877548813143143844?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8877548813143143844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8877548813143143844&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8877548813143143844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8877548813143143844'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/06/switching-stardust-particle-collection.html' title='Switching Stardust Particle Collection Type'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8179944554251841160</id><published>2010-05-25T07:04:00.000-07:00</published><updated>2010-05-25T18:36:50.978-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flare3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Supports Flare3D</title><content type='html'>&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Flare3D/GoldenStars/GoldenStars.html"&gt;&lt;img src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/S_vZfUEME1I/AAAAAAAAAp4/tJ-jmu1rMRM/s400/goldenstars.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Flare3D/GoldenStars/GoldenStars.html"&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Flare3D/FireflySprites/FireflySprites.html"&gt;&lt;img src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/S_vZe7FYkSI/AAAAAAAAApw/PMq1KihHWfM/s400/fireflies.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Flare3D/FireflySprites/FireflySprites.html"&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;(example source can be found on the project homepage)&lt;br /&gt;&lt;br /&gt;You heard it. &lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust Particle Engine&lt;/a&gt; now supports &lt;a href="http://flare3d.com/"&gt;Flare3D&lt;/a&gt;, a brand new 3D engine just released a couple of days ago. Awesome!&lt;br /&gt;&lt;br /&gt;Flare3D includes a 3DS Max exporter that can export much, much more than just mesh data, such as complex materials (environment map, texture map, etc), animations, and bone animations. For the first example, I exported the star model and gold material entirely in 3DS Max, and the data can be correctly rendered in Flare, without writing a single line of code. The Flare3D team really has the love for 3DS Max users :)&lt;br /&gt;&lt;br /&gt;The Flare3D extension for Stardust mainly consists of three initializers, &lt;code&gt;Flare3DPivot3DClass&lt;/code&gt;, &lt;code&gt;Flare3DPivot3DClone&lt;/code&gt;, &lt;code&gt;Flare3DSprite3D&lt;/code&gt;, and two renderers, &lt;code&gt;Flare3DPivot3DRenderer&lt;/code&gt;, and &lt;code&gt;Flare3DSprite3DRenderer&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;Flare3DPivot3DClass&lt;/code&gt; and &lt;code&gt;Flare3DPivot3DClone&lt;/code&gt; initializers work pretty much like the original &lt;code&gt;DisplayObjectClass&lt;/code&gt; initializer, only that they assign &lt;code&gt;Pivot3D&lt;/code&gt; objects from Flare3D to the &lt;code&gt;Particle.target&lt;/code&gt; property, and they have to be used along with the &lt;code&gt;Flare3DPivot3DRenderer&lt;/code&gt;. The first initializer creates new &lt;code&gt;Pivot3D&lt;/code&gt; objects from a reference to a &lt;code&gt;Pivot3D&lt;/code&gt; subclass, while the second initializer creates &lt;code&gt;Pivot3D&lt;/code&gt; objects by cloning an existing one. The &lt;code&gt;Flare3DSprite3D&lt;/code&gt; initializer creates 3D sprites and has to be used with the &lt;code&gt;Flare3DSprite3DRenderer&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;I hope you enjoy playing Stardust with Flare3D :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8179944554251841160?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8179944554251841160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8179944554251841160&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8179944554251841160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8179944554251841160'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/05/stardust-supports-flare3d.html' title='Stardust Supports Flare3D'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/S_vZfUEME1I/AAAAAAAAAp4/tJ-jmu1rMRM/s72-c/goldenstars.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-417294687752850474</id><published>2010-05-21T07:54:00.000-07:00</published><updated>2010-05-22T05:04:41.788-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust v1.1 with Fast Array Splicing</title><content type='html'>&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The initial release of &lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust Particle Engine&lt;/a&gt; version 1.1 is now available (yep, no more betas). The major difference of the current revision from the previous one is the use of fast-splicing arrays (I made up this name, because I don't know if there's a formal or correct name for it).&lt;br /&gt;&lt;br /&gt;Before Stardust employs linked-lists as default internal particle collections, ordinary arrays are used. Arrays are known to be fast to traverse and sort; however, arrays are also notoriously known to be ultra-slow when it comes to splicing large arrays. This is why I switched to linked-lists, which can perform much faster splicing operations by simple node-link manipulation.&lt;br /&gt;&lt;br /&gt;I've come back to arrays and use a new method to perform splicing, and this turns the tables again. Now Stardust uses fast-splicing arrays as internal particle collections.&lt;br /&gt;&lt;br /&gt;So, what are fast-splicing arrays anyway? Well, they're are no different from ordinary arrays except that they perform splicing quite differently. As any programmer familiar with ordinary array splicing knows, ordinary splicing first creates a new array of the size one-cell-smaller than the original one, and then copies the original elements, except for the spliced out one, into the new array. This is very CPU-consuming when dealing with large arrays, since a new large array is created every time a large array is to be spliced, not to mention the fact that rapid splicing is a fundamental nature of particle engines.&lt;br /&gt;&lt;br /&gt;The figure below illustrates the splicing process for ordinary arrays.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/S_abEBGB_TI/AAAAAAAAApA/OXkDkys7fuY/s1600/array+splicing.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Fast-splicing arrays do the job differently. Each of them always keeps the last cell empty, to allow iterators to tell whether they have reached the "tail" of the array, and it double its size when the last empty cell is to be used. Also, each array keeps track of the index of &lt;span style="font-weight:bold;"&gt;the last occupied cell&lt;/span&gt;. When a particle is to be removed from a cell, the last particle is then moved to the now-empty cell, and then the index indicator is decremented, i.e. moved left. No new arrays are ever created for splicing.&lt;br /&gt;&lt;br /&gt;The order of the array has been disrupted you say? As long as no mutual action is in place, the order of the array is of no significance. Even if mutual actions are involved, requiring the particles to be sorted according to their x-coordinates, the emitter sorts the array automatically before further processing in this case, so the order is still not problem.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/S_aceUeFK_I/AAAAAAAAApI/-aZzbYcbBRk/s1600/fast+array+splicing.png" alt=""/&gt;&lt;br /&gt;&lt;br /&gt;This splicing approach is even faster than linked-list splicing, since it only involves two assignment operations and one integer decrement operation, as opposed to four assignment operations for linked-lists (or maybe more...argh, you do the math).&lt;br /&gt;&lt;br /&gt;Moreover, arrays are faster for adding particles, because they simply assign references to their cells, and, on the other hand, linked-lists have to create new nodes to hold references to particles added and subsequent nodes.&lt;br /&gt;&lt;br /&gt;I think I don't have to say anything more about the sorting operations. Arrays are the fastest, 'nuff said.&lt;br /&gt;&lt;br /&gt;Here's a table that compares the performance of particle adding, traversal, splicing, and sorting operations for different particle containers. I believe that you can clearly understand why I prefer fast-splicing arrays over linked-lists.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/S_adONa2yRI/AAAAAAAAApQ/QuSigq1YPvM/s1600/performance+table.png" alt=""/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-417294687752850474?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/417294687752850474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=417294687752850474&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/417294687752850474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/417294687752850474'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/05/stardust-v11-with-fast-array-splicing_21.html' title='Stardust v1.1 with Fast Array Splicing'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/S_abEBGB_TI/AAAAAAAAApA/OXkDkys7fuY/s72-c/array+splicing.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5117502952039721909</id><published>2010-05-19T07:40:00.000-07:00</published><updated>2010-05-19T07:43:56.336-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><title type='text'>Monica WINS!!</title><content type='html'>&lt;object width="450" height="685"&gt;&lt;param name="movie" value="http://backend.deviantart.com/embed/view.swf" /&gt;&lt;param name="flashvars" value="id=164580304&amp;width=1337" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://backend.deviantart.com/embed/view.swf" type="application/x-shockwave-flash" width="450" flashvars="id=164580304&amp;width=1337" height="685" allowscriptaccess="always"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.deviantart.com/deviation/164580304/"&gt;Monica WINS&lt;/a&gt; by ~&lt;a class="u" href="http://cjcat2266.deviantart.com/"&gt;cjcat2266&lt;/a&gt; on &lt;a href="http://www.deviantart.com"&gt;deviant&lt;/a&gt;&lt;a href="http://www.deviantart.com"&gt;ART&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://prj.gamer.com.tw/bcgc_vote/play_01.html"&gt;&lt;img src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/S5T2NBJ4tPI/AAAAAAAAAm8/28cL5mybcG4/s400/Monica+Nightmare.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://prj.gamer.com.tw/bcgc_vote/play_01.html"&gt;Play Monica: Nightmare&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's been too long since I got the third place in the Creative Game Design Contest held by &lt;a href="http://www.gamer.com.tw/"&gt;Gamer&lt;/a&gt;. Today the finally sent me the certificate for the award. I felt like drawing Monica being excited about the certificate, so here it is :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5117502952039721909?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5117502952039721909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5117502952039721909&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5117502952039721909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5117502952039721909'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/05/monica-wins.html' title='Monica WINS!!'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/S5T2NBJ4tPI/AAAAAAAAAm8/28cL5mybcG4/s72-c/Monica+Nightmare.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-848269688944825975</id><published>2010-05-11T08:49:00.000-07:00</published><updated>2010-05-11T09:15:50.521-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><title type='text'>Heineken with Zedbox</title><content type='html'>&lt;a href="http://newcan.heineken.com.tw/"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 133px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/S-l9nXAHCCI/AAAAAAAAAog/kBwhTianM3A/s400/cans.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5470041337561024546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://newcan.heineken.com.tw/"&gt;Visit site&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/zedbox/"&gt;ZedBox project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm happily informed by &lt;a href="http://milkmidi.blogspot.com/"&gt;Milkmidi&lt;/a&gt; from &lt;a href="http://medialand.com.tw/"&gt;Medialand&lt;/a&gt; that &lt;a href="http://mark-vann.blogspot.com/"&gt;Mark Vann&lt;/a&gt;, also from Medialand, has built a &lt;a href="http://newcan.heineken.com.tw/"&gt;Heineken website&lt;/a&gt; using &lt;a href="http://code.google.com/p/zedbox/"&gt;ZedBox&lt;/a&gt;, my 2.5D billboard engine.&lt;br /&gt;&lt;br /&gt;I've never imagined I could use ZedBox to create such stunning visual experience with massive cans of Heineken beer, although at some points the website does consume a lot of CPU resource. I think the performance could be improved by caching, or pre-rendering, the bitmaps, accounting for their different rotation angles, instead of changing their rotations directly at run-time. Anyway, Mark's definitely done a pretty darn good job on this one.&lt;br /&gt;&lt;br /&gt;Nice job, Mark. And thanks a lot for supporting ZedBox :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-848269688944825975?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/848269688944825975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=848269688944825975&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/848269688944825975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/848269688944825975'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/05/heineken-with-zedbox.html' title='Heineken with Zedbox'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/S-l9nXAHCCI/AAAAAAAAAog/kBwhTianM3A/s72-c/cans.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-537959940836605611</id><published>2010-05-11T02:32:00.000-07:00</published><updated>2010-05-11T03:00:17.836-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>My Most Wanted Flash Features</title><content type='html'>I've seen a lot of most-wanted-Flash-features articles. So I decided that I might as well write one :p&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Full GPU Rendering Support&lt;/span&gt;&lt;br /&gt;Currently, Flash Player 10.1 only supports hardware acceleration for the full-screen feature and video playback. I've always wanted to see Flash Player being capable of rendering all the display objects with full GPU acceleration. It'll be a huge boost on the performance. I believe lots of people out there also want this feature very badly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Function Overloading&lt;/span&gt;&lt;br /&gt;ActionScript is the only one among the object-oriented languages I use that does not support function overloading. This can sometimes lead to frustrating experiences while designing frameworks. Sometimes I just want to provide functions with different sets of parameters that do the same job; however, due to Flash's lack of support for function overloading, I have no choice but to use lots of optional wild-card-typed parameters and depend on their types to perform differently in a single function.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Complete Generics Support&lt;/span&gt;&lt;br /&gt;The &lt;code&gt;Vector&lt;/code&gt; class supports generics. However, I'm talking about COMPLETE generics support. That is, developers are able to write classes with whatever class templates they want, instead of only playing with the little &lt;code&gt;Vector&lt;/code&gt; class provided by Adobe.&lt;br /&gt;&lt;br /&gt;It is so tempting to write classes with generics. Just imagine if you could write a following generic class:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;class DataHolder&lt;T&gt; {&lt;br /&gt; private var _data:T;&lt;br /&gt; public function get data():T { reutrn _data; }&lt;br /&gt; &lt;br /&gt; public function DataHolder(T data) {&lt;br /&gt;  _data = data;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;There'll be no more type casting issues, and the following code is definitely legal.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var holder:DataHodler&lt;Sprite&gt; = new DataHolder&lt;Sprite&gt;(new Sprite);&lt;br /&gt;var sprite:Sprite = holder.data;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Data Container Framework&lt;/span&gt;&lt;br /&gt;What naturally comes after the generics support shall be a data container framework like that in Java. I hope Adobe can provide a set of containers of basic data structures, such as linked lists, stacks, hash maps, hash sets, etc. Currently the &lt;code&gt;Dictionary&lt;/code&gt; class acts like a object-to-object hash map, and is not strongly typed, which requires lots of casting being done. With a generic data container framework, we are able to write code like this:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var map:Dictionary&lt;String, Sprite&gt; = new Dictionary&lt;String, Sprite&gt;();&lt;br /&gt;map["mySprite"] = new Sprite();&lt;br /&gt;var sprite:Sprite = map["mapSprite"];&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;And it's guaranteed to be type-safe, so you don't have to cast the evaluated value of &lt;code&gt;map["mapSprite"]&lt;/code&gt; to &lt;code&gt;Sprite&lt;/code&gt; anymore.&lt;br /&gt;&lt;br /&gt;I like the Java container framework very much, especially the support for iterators. Iterators make traversing abstract containers even extremely easy and intuitive. I hope Adobe do consider adding a container framework seriously. I know there are already some neat container frameworks out there, like &lt;a href="http://lab.polygonal.de/ds/"&gt;as3ds&lt;/a&gt;, but it's always nice to have official support, isn't it?&lt;br /&gt;&lt;br /&gt;That's all I've got for now. I'm sure I'll come up with more wanted Flash features.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-537959940836605611?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/537959940836605611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=537959940836605611&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/537959940836605611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/537959940836605611'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/05/my-most-wanted-flash-features.html' title='My Most Wanted Flash Features'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3589417838128129041</id><published>2010-05-07T05:09:00.000-07:00</published><updated>2010-05-07T05:43:33.895-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActiveTuts+'/><category scheme='http://www.blogger.com/atom/ns#' term='PureMVC'/><title type='text'>Loading with Commands</title><content type='html'>&lt;a href="http://active.tutsplus.com/tutorials/actionscript/loading-data-with-commands/"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/S-QJF6mFnpI/AAAAAAAAAoA/GbgftDcPKNw/s400/Preview.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5468505844767628946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://active.tutsplus.com/tutorials/actionscript/loading-data-with-commands/"&gt;View tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a sequel to my previous tutorial, Thinking in Commands &lt;a href="http://active.tutsplus.com/tutorials/actionscript/thinking-in-commands-part-1-of-2/"&gt;part 1&lt;/a&gt; and &lt;a href="http://active.tutsplus.com/tutorials/actionscript/thinking-in-commands-part-2-of-2/"&gt;part 2&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This time I talked about how to encapsulate external data loading functionalities into commands, so that they can be arranged together with other commands. Also, I've introduced the &lt;code&gt;DataManager&lt;/code&gt; class, which essentially acts like a global variable aggregator. However, as Rich pointed out in the comment. This class is not type-safe, thus requiring type casting through the entire application. Actually, I also think this could be a problem for large applications. When I was writing the class, I was thinking of the &lt;code&gt;Proxy&lt;/code&gt; class from &lt;a href="http://puremvc.org/"&gt;PureMVC&lt;/a&gt;. The class also acts like a global variable aggregator that is not type-safe, since this is how you obtain a reference to a custom proxy object.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var proxy:MyProxy = Facade.getInstance().retrieveProxy(proxyName) as MyProxy;&lt;br /&gt;var data:MyData = proxy.getData();&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Not type-safe as it is, it actually served me quite well in most applications. But yet I agree with Rich that it's not friendly in large applications. Unfortunately, this is the best solution I can come up with right now. I'll see if I can conceive something better in handling data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3589417838128129041?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3589417838128129041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3589417838128129041&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3589417838128129041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3589417838128129041'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/05/loading-with-commands.html' title='Loading with Commands'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/S-QJF6mFnpI/AAAAAAAAAoA/GbgftDcPKNw/s72-c/Preview.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5759990572119765663</id><published>2010-05-01T07:54:00.000-07:00</published><updated>2010-05-01T20:49:25.852-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Shintaz'/><title type='text'>New Scripting Engine in Progress</title><content type='html'>Yup, I'm currently working on a scripting engine, named Shintaz, which is the name of another character in Rusher's series. You can check out the complete character lineup &lt;a href="http://cjcat2266.deviantart.com/art/the-Squad-34865914"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The motivation is twofold: first, it is my term project for the compiler course I'm taking this semester; second, my ultimate purpose is to integrate this scripting engine with &lt;a href="http://code.google.com/p/rusher"&gt;Rusher Game Framework&lt;/a&gt;, so that you may open a console, like those where you can enter cheat codes in many Valve games, and enter scripts. This is mostly for testing and debugging purposes.&lt;br /&gt;&lt;br /&gt;The project SVN is already opened on Google Code. Here's the &lt;a href="http://shintaz.googlecode.com/svn/trunk/test/"&gt;source folder&lt;/a&gt; and the &lt;a href="http://shintaz.googlecode.com/svn/trunk/docs/index.html"&gt;documentation&lt;/a&gt;. I use the &lt;a href="http://asunit.org/"&gt;ASUnit&lt;/a&gt; framework for unit testing Shintaz. You can check out the testing project &lt;a href="http://shintaz.googlecode.com/svn/trunk/src/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The scripting engine is still a work in progress. So far, I've finished the scanner. There's still a long way to go, with the parser and virtual machine to be finished.&lt;br /&gt;&lt;br /&gt;Here I'll show some code snippets for the scanner.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;This is how a scanner is initialized. The parameter passed to the constructor is a string of script, or code.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var scanner:IScanner = new Scanner(code);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Tokens of the code can be obtained by repeatedly calling the &lt;code&gt;IScanner.getToken()&lt;/code&gt; method until the method returns null. Each token is consisted of a token type, an integer value, and a token value, whose data type depends of the token type. Here's what a piece of actual scanner code would look like.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var code:String = "";&lt;br /&gt;code += "var str = \"\" \n";&lt;br /&gt;code += "for (var i = 0; i &lt; 9; i++) { \n";&lt;br /&gt;code += " str += i; \n";&lt;br /&gt;code += "} \n";&lt;br /&gt;&lt;br /&gt;var scanner:IScanner = new Scanner(code);&lt;br /&gt;var token:Token;&lt;br /&gt;while (token = scanner.getToken()) {&lt;br /&gt; trace(token);&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;Token.toString()&lt;/code&gt; method is overridden to show both the token type and token value. This is what will be displayed on the output panel.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;[Token type=15 value="var"]&lt;br /&gt;[Token type=0 value="str"]&lt;br /&gt;[Token type=400 value="="]&lt;br /&gt;[Token type=202 value=""]&lt;br /&gt;[Token type=8 value="for"]&lt;br /&gt;[Token type=104 value=")"]&lt;br /&gt;[Token type=15 value="var"]&lt;br /&gt;[Token type=0 value="i"]&lt;br /&gt;[Token type=400 value="="]&lt;br /&gt;[Token type=201 value=0]&lt;br /&gt;[Token type=108 value=";"]&lt;br /&gt;[Token type=0 value="i"]&lt;br /&gt;[Token type=310 value="&lt;"]&lt;br /&gt;[Token type=201 value=9]&lt;br /&gt;[Token type=108 value=";"]&lt;br /&gt;[Token type=0 value="i"]&lt;br /&gt;[Token type=315 value="++"]&lt;br /&gt;[Token type=105 value="("]&lt;br /&gt;[Token type=100 value="{"]&lt;br /&gt;[Token type=0 value="str"]&lt;br /&gt;[Token type=401 value="+="]&lt;br /&gt;[Token type=0 value="i"]&lt;br /&gt;[Token type=108 value=";"]&lt;br /&gt;[Token type=101 value="}"]&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;That's it. This is my current progress on Shintaz. I'll begin to work on the parser as soon as I can. Hopefully, the entire engine can be completed by the end of this month.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5759990572119765663?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5759990572119765663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5759990572119765663&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5759990572119765663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5759990572119765663'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/05/new-scripting-engine-in-progress.html' title='New Scripting Engine in Progress'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4630012270080576870</id><published>2010-04-18T02:28:00.000-07:00</published><updated>2010-04-18T02:37:10.281-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>Run Rusher Run</title><content type='html'>&lt;object width="450" height="483"&gt;&lt;param name="movie" value="http://backend.deviantart.com/embed/view.swf"&gt;&lt;param name="flashvars" value="id=161122961&amp;amp;width=1337"&gt;&lt;embed src="http://backend.deviantart.com/embed/view.swf" type="application/x-shockwave-flash" flashvars="id=161122961&amp;amp;width=1337" allowscriptaccess="always" width="450" height="483"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.deviantart.com/deviation/161122961/"&gt;Run Rusher Run&lt;/a&gt; by ~&lt;a class="u" href="http://cjcat2266.deviantart.com/"&gt;cjcat2266&lt;/a&gt; on &lt;a href="http://www.deviantart.com/"&gt;deviant&lt;/a&gt;&lt;a href="http://www.deviantart.com/"&gt;ART&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is Rusher, the character &lt;a href="http://code.google.com/p/rusher"&gt;Rusher Game Engine&lt;/a&gt; is named after. I haven't been drawing him for a very long while, and I felt like trying to draw him in a different style. So here it is, run Rusher run!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4630012270080576870?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4630012270080576870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4630012270080576870&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4630012270080576870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4630012270080576870'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/04/run-rusher-run.html' title='Run Rusher Run'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4457881033977099090</id><published>2010-03-29T06:28:00.001-07:00</published><updated>2010-03-29T06:38:53.092-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActiveTuts+'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>Thinking in Commands</title><content type='html'>&lt;a href="http://active.tutsplus.com/tutorials/actionscript/thinking-in-commands-part-1-of-2/"&gt;&lt;img src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/S7CrIn2hWTI/AAAAAAAAAn4/6qq0UgJYMPc/s400/tic1.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://active.tutsplus.com/tutorials/actionscript/thinking-in-commands-part-1-of-2/"&gt;View part 1 of 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://active.tutsplus.com/tutorials/workflow/thinking-in-commands-part-2-of-2/"&gt;&lt;img src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/S7CrIJkaNAI/AAAAAAAAAnw/jeBm-jPki5U/s400/tic2.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://active.tutsplus.com/tutorials/workflow/thinking-in-commands-part-2-of-2/"&gt;&lt;br /&gt;View part 2 of 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As I developed the Command Utility for &lt;a href="http://code.google.com/p/rusher"&gt;Rusher Game Framework&lt;/a&gt;, I have come up with this idea of spreading the love for Command Pattern :p&lt;br /&gt;&lt;br /&gt;I've already delivered three presentations on this topic, and written a two-part tutorial for &lt;a href="http://active.tutsplus.com/"&gt;ActiveTuts+&lt;/a&gt;. In the tutorial I've briefly covered the Command Pattern and showed how to build a minimalistic command framework, which is kind of a lite version of the Command Utility in Rusher. Also, you can find in this tutorial about how to further make use of this command framework to create a scene management framework, which is also a lite version of one of Rusher's features, the State Machine.&lt;br /&gt;&lt;br /&gt;The concept of commands would really simplify things out when working on huge projects. If you've got problems dealing with large applications, such as messing up with complicated code that is hard to maintain, just go check out the tutorial. It's gonna help you a lot. I promise :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4457881033977099090?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4457881033977099090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4457881033977099090&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4457881033977099090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4457881033977099090'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/03/thinking-in-commands.html' title='Thinking in Commands'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/S7CrIn2hWTI/AAAAAAAAAn4/6qq0UgJYMPc/s72-c/tic1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-9176347405868189838</id><published>2010-03-23T10:35:00.000-07:00</published><updated>2010-03-23T11:00:37.628-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>Third Place in Game Design Contest</title><content type='html'>&lt;a href="http://prj.gamer.com.tw/bcgc_vote/play_01.html"&gt;&lt;img src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/S5T2NBJ4tPI/AAAAAAAAAm8/28cL5mybcG4/s400/Monica+Nightmare.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://prj.gamer.com.tw/bcgc_vote/play_01.html"&gt;Play Monica: Nightmare&lt;/a&gt;&lt;br /&gt;&lt;a href="http://prj.gamer.com.tw/bcgc_vote/play.php"&gt;View all entries&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's right. &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;Monica: Nightmare&lt;/span&gt;&lt;/span&gt; got the third place in the Creative Game Design Contest held by &lt;a href="http://www.gamer.com.tw/"&gt;Gamer&lt;/a&gt;. I'm pretty glad that the first game created by &lt;a href="http://code.google.com/p/rusher"&gt;Rusher Game Framework&lt;/a&gt; could make it this far. Being involved in this contest was the main driving force for me on the development of Rusher. Had it not been for this contest, I think Rusher would have been still a mere idea in my mind by now.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/rusher/"&gt;&lt;img src="http://rusher.googlecode.com/svn/trunk/logo/Rusher%20logo%20250x115.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However, I've still got several things to complain about. The graphics and music aspects make up 20% of the total score, and yet the &lt;a href="http://prj.gamer.com.tw/bcgc_vote/play_17.html"&gt;runner-up&lt;/a&gt; still got 85 out of 100? I'm not unable to afford to lose. There are reasons why I'm saying this. Come on, the drawing skill is obviously...primitive, consisted of line segments and simple geometric shapes, let alone the fact that the framerate is 12FPS (that's eye-killing, really). And the music is nowhere near original, its background music for the menu scene is from Star Wars; how could Gamer not notice that? After all, use of proprietary assets is prohibited in this contest! I've sent Gamer a mail, requesting that they reveal the score every entry has got on each aspect. I hope they take this seriously; otherwise, just showing the final total score is far from convincing.&lt;br /&gt;&lt;br /&gt;Alright, enough with the complaining. At least &lt;span style="font-weight: bold; font-style: italic;"&gt;Monica: Nightmare&lt;/span&gt; gets the third place and is being displayed in the first row. This means Rusher is going to get more exposure, which is my ultimate purpose :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-9176347405868189838?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/9176347405868189838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=9176347405868189838&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/9176347405868189838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/9176347405868189838'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/03/third-place-in-game-design-contest.html' title='Third Place in Game Design Contest'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/S5T2NBJ4tPI/AAAAAAAAAm8/28cL5mybcG4/s72-c/Monica+Nightmare.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7431737425600692990</id><published>2010-03-08T05:04:00.000-08:00</published><updated>2010-03-08T05:26:06.908-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><category scheme='http://www.blogger.com/atom/ns#' term='Box2D'/><title type='text'>My First Game Built with Rusher Game Framework!</title><content type='html'>&lt;a href="http://prj.gamer.com.tw/bcgc_vote/play_01.html"&gt;&lt;img src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/S5T2NBJ4tPI/AAAAAAAAAm8/28cL5mybcG4/s400/Monica+Nightmare.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://prj.gamer.com.tw/bcgc_vote/play_01.html"&gt;Play Monica: Nightmare&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally! My first game built with &lt;a href="http://code.google.com/p/rusher"&gt;Rusher Game Framework&lt;/a&gt;! Escape from Monica's nightmare as fast as you can!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Monica: Nightmare&lt;/span&gt;&lt;/span&gt; is a 2D side-scroller evasive action game. You're right, no fancy attack moves. Just run! This is an entry to the Creative Game Design Contest held by &lt;a href="http://www.gamer.com.tw/"&gt;Gamer&lt;/a&gt;. The theme of the contest is "Escape", hence the absence of attack moves. I tried to make the opening and ending look like it is SOME console game :p&lt;br /&gt;&lt;br /&gt;I used &lt;a href="http://box2dflash.boristhebrave.com/"&gt;Box2D&lt;/a&gt; for collision handling. The game flow control is heavily making use of the Scene Manager (now State Machine) feature of Rusher.&lt;br /&gt;&lt;br /&gt;You can press the "+ (plus sign)" key to toggle the console panel to view debugging messages, and press the "- (minus sign)" key to toggle the Box2D debug view.&lt;br /&gt;&lt;br /&gt;It's still quite buggy, I know. I had been working very hard to eliminate all the bugs, but the deadline did not allow me to do so. I slept at 6 in the morning on the due date and woke up at 8:30 to mail the disk to Gamer. I apologize if the bugs bother you during the gameplay.&lt;br /&gt;&lt;br /&gt;Next time I'm gonna use all of my game-related frameworks: &lt;a href="http://code.google.com/p/rusher"&gt;Rusher&lt;/a&gt;, &lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust&lt;/a&gt;, and &lt;a href="http://code.google.com/p/zedbox"&gt;ZedBox&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7431737425600692990?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7431737425600692990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7431737425600692990&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7431737425600692990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7431737425600692990'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/03/my-first-game-built-with-rusher-game.html' title='My First Game Built with Rusher Game Framework!'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/S5T2NBJ4tPI/AAAAAAAAAm8/28cL5mybcG4/s72-c/Monica+Nightmare.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7505368792952053558</id><published>2010-03-05T06:17:00.000-08:00</published><updated>2010-03-29T06:30:32.197-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActiveTuts+'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Papervision3D'/><title type='text'>Stardust 3D Paritcle Effects Tutorial</title><content type='html'>&lt;a href="http://active.tutsplus.com/tutorials/effects/create-3d-effects-with-the-stardust-particle-engine/"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://activetuts.s3.amazonaws.com/tuts/075_stardust3D/Preview/Preview.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 200px;" src="http://activetuts.s3.amazonaws.com/tuts/075_stardust3D/Preview/Preview.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://active.tutsplus.com/tutorials/effects/create-3d-effects-with-the-stardust-particle-engine/"&gt;View Tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've written another &lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust&lt;/a&gt; tutorial on &lt;a href="http://active.tutsplus.com/"&gt;ActiveTuts+&lt;/a&gt;. This time it's about how to create 3D particle effects with Stardust's native 3D engine and &lt;a href="http://code.google.com/p/papervision3d/"&gt;Papervision3D&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To combine Stardust with different 3D engines, all you need to do is use a different engine-specific renderer and initializer for particle appearance. It's well explained in the tutorial. So what are you waiting for? Just go &lt;a href="http://active.tutsplus.com/tutorials/effects/create-3d-effects-with-the-stardust-particle-engine/"&gt;check it out&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7505368792952053558?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7505368792952053558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7505368792952053558&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7505368792952053558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7505368792952053558'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/03/stardust-3d-paritcle-effect-tutorial.html' title='Stardust 3D Paritcle Effects Tutorial'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6028181512228081968</id><published>2010-02-25T21:51:00.000-08:00</published><updated>2010-02-25T22:19:39.750-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>Conditional Commands for Rusher Game Framework</title><content type='html'>I showed one of my classmates the &lt;a href="http://cjcat.blogspot.com/2010/02/command-utility-for-rusher-game.html"&gt;Command Utility&lt;/a&gt; for &lt;a href="http://code.google.com/p/rusher"&gt;Rusher Game Framework&lt;/a&gt;. He gave me a quick thought about conditional commands, which execute different commands depending of different conditions. I thought the idea was great, so when I turned on my laptop I directly rushed into creating conditional commands for Rusher.&lt;br /&gt;&lt;br /&gt;Below are the conditional commands that are now available in Rusher, which is now version 0.5 Alpha.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;If Command&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The If command executes a "true subcommand" if the return value of the test function is true, otherwise the alternative "false subcommand" is executed. Additional parameters for the test function can be passed as an array.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var command:Command = &lt;br /&gt; new If(&lt;br /&gt;  testFunction, parameters, &lt;br /&gt;  trueSubcommand, &lt;br /&gt;  falseSubcommand&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;Engine.getInstance().commandManager.execute(command);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;While Command&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The While command repeatedly executes a subcommand until the test function returns false.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var command:Command = &lt;br /&gt; new While(&lt;br /&gt;  testFunction, params, &lt;br /&gt;  subcommand&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;Engine.getInstance().commandManager.execute(command);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;DoWhile Command&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pretty much like the While command, the DoWhile command repeatedly executes a subcommand until the test function returns false, except that for the first time the subcommand is always executed regardless of the test function.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var command:Command = &lt;br /&gt; new DoWhile(&lt;br /&gt;  testFunction, params, &lt;br /&gt;  subcommand&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;Engine.getInstance().commandManager.execute(command);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;For Command&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The For command is consisted of two subcommands: the "initCommand" is executed first, then the "loopCommand" is executed repeatedly until the test function returns false.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var command:Command = &lt;br /&gt; new For(&lt;br /&gt;  testFunction, params, &lt;br /&gt;  initCommand, &lt;br /&gt;  loopCommand&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;Engine.getInstance().commandManager.execute(command);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Switch Command&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Switch command contains a index function, which returns an integer, and an array of subcommands. It executes the subcommand in the array corresponding to the index returned by the index function.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var command:Command = &lt;br /&gt; new Switch(&lt;br /&gt;  indexFunction, params, &lt;br /&gt;  subcommand1, &lt;br /&gt;  subcommand2, &lt;br /&gt;  subcommand3, &lt;br /&gt;  ...etc&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;Engine.getInstance().commandManager.execute(command);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Repeat Command&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Repeat command repeatedly executes a subcommand for a specified number of times. This command basically does not count as a conditional command, but it certainly is equally useful.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var command:Command = &lt;br /&gt; new Repeat(delay, repeatCount, &lt;br /&gt;  subcommand&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;Engine.getInstance().commandManager.execute(command);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6028181512228081968?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6028181512228081968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6028181512228081968&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6028181512228081968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6028181512228081968'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/02/conditional-commands-for-rusher-game.html' title='Conditional Commands for Rusher Game Framework'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5534584745411192618</id><published>2010-02-23T23:46:00.000-08:00</published><updated>2010-02-24T00:11:53.894-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Progression'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><category scheme='http://www.blogger.com/atom/ns#' term='GreenSock'/><title type='text'>Scene Manager for Rusher Game Framework</title><content type='html'>The scene manager for &lt;a href="http://code.google.com/p/rusher/"&gt;Rusher Game Framework&lt;/a&gt; is now complete. It makes use of Rusher's &lt;a href="http://cjcat.blogspot.com/2010/02/command-utility-for-rusher-game.html"&gt;Command Utility&lt;/a&gt; to achieve scene transitions, i.e. intro and outro.&lt;br /&gt;&lt;br /&gt;One engine core contains one scene manager, which is accessed from the Engine.sceneManager property. The SceneManager.setScene() method sets the current scene for the engine core. The scene transition is handled by the Scene.introCommand and Scene.outroCommand properties. When the engine core is switching from scene A to scene B, the outro command of scene A is executed, the intro command of scene B is executed, and then finally the scene transition is complete. This scene transition command structure was inspired by &lt;a href="http://progression.jp/en/"&gt;Progression Framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are some code snippets for the scene transition. You can view the final result &lt;a href="http://rusher.googlecode.com/svn/trunk/tests/SceneTest/bin/SceneTest.swf"&gt;here&lt;/a&gt;. Click the black square and watch the scene manager do its work.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;The document class is quite simple. It starts up the engine core and sets the scene to a HomeScene object.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class Main extends Sprite {&lt;br /&gt; &lt;br /&gt; private var engine:Engine;&lt;br /&gt; &lt;br /&gt; public function Main():void {&lt;br /&gt;  stage.scaleMode = StageScaleMode.NO_SCALE;&lt;br /&gt;  &lt;br /&gt;  engine = Engine.getInstance("main");&lt;br /&gt;  engine.stage = stage;&lt;br /&gt;  &lt;br /&gt;  engine.sceneManager.setScene(new HomeScene(this));&lt;br /&gt;  &lt;br /&gt;  addEventListener(Event.ENTER_FRAME, engine.clock.tick);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And below is the code for the HomeScene class. It extends the Scene class and assigns two command objects to the introCommand and outroCommand properties. The _block property simply holds a reference to a Sprite with a square appearance.&lt;br /&gt;&lt;br /&gt;The intro command makes the block fade in from zero alpha and a random position to another random position, while the outro command fades out the block to zero alpha and another random position.&lt;br /&gt;&lt;br /&gt;The AddChild command adds the block to the container sprite. The TweenNanoFrom command is making use of the from() method of the TweenNano class from &lt;a href="http://www.greensock.com/"&gt;GreenSock Tweening Platform&lt;/a&gt;. The Trace, SetProperties, AddEventListener, RemoveEventListener commands do what their name suggest: tracing messages, setting properties, adding event listeners, and removing event listeners, respectively.&lt;br /&gt;&lt;br /&gt;When the block is clicked, the scene tells the SceneManager to switch to another scene, in this case, still another HomeScene instance.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public function HomeScene(container:DisplayObjectContainer) {&lt;br /&gt; _container = container;&lt;br /&gt; _block = new Square();&lt;br /&gt; &lt;br /&gt; var initX:Number = 640 * Math.random();&lt;br /&gt; var initY:Number = 400 * Math.random();&lt;br /&gt; var midX:Number = 640 * Math.random();&lt;br /&gt; var midY:Number = 400 * Math.random();&lt;br /&gt; var finalX:Number = 640 * Math.random();&lt;br /&gt; var finalY:Number = 400 * Math.random();&lt;br /&gt; &lt;br /&gt; introCommand = &lt;br /&gt;  new ParallelCommand(0, &lt;br /&gt;   new Trace("home scene entered"), &lt;br /&gt;   new SerialCommand(0, &lt;br /&gt;    new SetProperties(_block, {x:initX, y:initY}), &lt;br /&gt;    new AddChild(_container, _block), &lt;br /&gt;    new TweenNanoFrom(_block, 0.5, {x:midX, y:midY, alpha:0}), &lt;br /&gt;    new AddEventListener(_block, MouseEvent.CLICK, onBlockClicked)&lt;br /&gt;   )&lt;br /&gt;  );&lt;br /&gt; &lt;br /&gt; outroCommand = &lt;br /&gt;  new ParallelCommand(0, &lt;br /&gt;   new Trace("home scene left"), &lt;br /&gt;   new RemoveEventListener(_block, MouseEvent.CLICK, onBlockClicked), &lt;br /&gt;   new SerialCommand(0, &lt;br /&gt;    new TweenNanoTo(_block, 0.5, {x:finalX, y:finalY, alpha:0}), &lt;br /&gt;    new RemoveChild(_container, _block)&lt;br /&gt;   )&lt;br /&gt;  );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function onBlockClicked(e:MouseEvent):void {&lt;br /&gt; setScene(new HomeScene(_container));&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;There are more commands integrated with GreenSock Tweening Platform not shown in this example: TweenLiteFrom, TweenLiteTo, TweenMaxFrom, and TweenMaxTo. I believe their names tell you everything about what they do.&lt;br /&gt;&lt;br /&gt;I'm quite happy with how the Command Utility turned out. Managing how the program flow by using parallel and serial commands is very easy, and, more importantly, it is achieved with simple, clean, and readily maintainable code.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5534584745411192618?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5534584745411192618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5534584745411192618&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5534584745411192618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5534584745411192618'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/02/scene-manager-for-rusher-game-framework_23.html' title='Scene Manager for Rusher Game Framework'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7947747505028392121</id><published>2010-02-21T01:36:00.001-08:00</published><updated>2010-02-25T21:52:24.675-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Progression'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>Command Utility for Rusher Game Framework</title><content type='html'>I've added a Command Utility to &lt;a href="http://code.google.com/p/rusher"&gt;Rusher Game Framework&lt;/a&gt;. Each engine core now has a reference to a CommandManager object; this object allows you to execute commands, be it single commands or composite commands.&lt;br /&gt;&lt;br /&gt;There are two types of composite commands: ParallelCommand and SerialCommand. The parallel command executes all its subcommands simultaneously, while the serial command executes its subcommands sequentially. Also, each command has a delay property (the time a command "waits" before execution), which you may make use of to have advanced control over the command execution timing.&lt;br /&gt;&lt;br /&gt;Here are some code snippets for Rusher's Command Utility.&lt;br /&gt;&lt;span id='fullpost'&gt;&lt;br /&gt;This TraceCommand class is a very simple command consisted of a delay time and a trace message. Note that the execute() method is where all your command goes, and the complete() method should be called when the command is finished.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;class TraceCommand extends Command {&lt;br /&gt; &lt;br /&gt; private var _message:String;&lt;br /&gt; public function TraceCommand(delay:Number, message:String) {&lt;br /&gt;  super(delay);&lt;br /&gt;  &lt;br /&gt;  _message = message;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; override public function execute():void {&lt;br /&gt;  trace(_message);&lt;br /&gt;  complete();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Here's the document class. The two commands "ps" and "sp" are a parallel command with a serial subcommand and a serial command with a parallel subcommand, respectively. The first constructor parameter of the parallel and serial commands is the delay time, and the subsequent parameters are subcommands.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;public class Main extends Sprite {&lt;br /&gt; &lt;br /&gt; private var engine:Engine;&lt;br /&gt; &lt;br /&gt; public function Main():void {&lt;br /&gt;  engine = Engine.getInstance();&lt;br /&gt;  engine.stage = stage;&lt;br /&gt;  &lt;br /&gt;  var ps:ICommand = &lt;br /&gt;   new ParallelCommand(0, &lt;br /&gt;    new TraceCommand(1, "ps0"), &lt;br /&gt;    new SerialCommand(2, &lt;br /&gt;     new TraceCommand(0, "ps1"), &lt;br /&gt;     new TraceCommand(1, "ps2")&lt;br /&gt;    ), &lt;br /&gt;    new TraceCommand(4, "ps3")&lt;br /&gt;   );&lt;br /&gt;  &lt;br /&gt;  var sp:ICommand = &lt;br /&gt;   new SerialCommand(5, &lt;br /&gt;    new TraceCommand(0, "sp0"), &lt;br /&gt;    new ParallelCommand(1, &lt;br /&gt;     new TraceCommand(0, "sp1"), &lt;br /&gt;     new TraceCommand(1, "sp2")&lt;br /&gt;    ), &lt;br /&gt;    new TraceCommand(1, "sp3")&lt;br /&gt;   );&lt;br /&gt;  &lt;br /&gt;  engine.commandManager.execute(ps);&lt;br /&gt;  engine.commandManager.execute(sp);&lt;br /&gt;  &lt;br /&gt;  addEventListener(Event.ENTER_FRAME, mainLoop);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function mainLoop(e:Event):void {&lt;br /&gt;  engine.clock.tick();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This shall trace out "ps0", "ps1", "ps2", "ps3", "sp0", "sp1", "sp2", and "sp3" sequentially with a time gap of one second. The complete source code for this example can be found &lt;a href="http://rusher.googlecode.com/svn/trunk/tests/CommandTest/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One engine core is supposed to be used for one game level, or one scene in a game. I'm aiming for creating a utility for handling the entire game, including opening, menu screen, main game, ending, credits, etc. The Command Utility is just one part of it. You can think of it as something similar to &lt;a href="http://progression.jp/en/"&gt;Progression Framework&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7947747505028392121?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7947747505028392121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7947747505028392121&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7947747505028392121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7947747505028392121'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/02/command-utility-for-rusher-game.html' title='Command Utility for Rusher Game Framework'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3793784596083922687</id><published>2010-02-12T17:56:00.000-08:00</published><updated>2010-02-25T21:52:52.051-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PushButtonEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><title type='text'>Arrow Walker Example for Rusher Game Framework</title><content type='html'>&lt;a href="http://code.google.com/p/rusher/"&gt;&lt;img src="http://rusher.googlecode.com/svn/trunk/logo/Rusher%20logo%20250x115.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Oooh. Look at the fresh new logo I made :p&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rusher.googlecode.com/svn/trunk/examples/ArrowWalker/bin/ArrowWalker.html"&gt;&lt;img src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SvbxhqEQobI/AAAAAAAAAkM/MtGiwsB7HgY/s320/arrowwalker.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rusher.googlecode.com/svn/trunk/examples/ArrowWalker/bin/ArrowWalker.html"&gt;View SWF&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rusher.googlecode.com/svn/trunk/examples/ArrowWalker/src/"&gt;View source&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've written a &lt;a href="http://cjcat.blogspot.com/2009/11/pushbutton-game-engine-example-arrow.html"&gt;tutorial&lt;/a&gt; on the basic usage of &lt;a href="http://pushbuttonengine.com/"&gt;PushButton Engine&lt;/a&gt;. It demonstrates how to create a simple 2D arrow-key-controlled game character (well, if you'd call an arrow a character).&lt;br /&gt;&lt;br /&gt;This time I'm going to recreate the exact same example, but using &lt;a href="http://code.google.com/p/rusher"&gt;Rusher Game Framework&lt;/a&gt;, which is my own experimental game engine inspired by PushButton Engine.&lt;br /&gt;&lt;span id='fullpost'&gt;&lt;br /&gt;This is the document class. The Player entity is the keyboard-controlled character, and the Scene entity is in charge of update the arrow display object's position and rotation according to the Player entity's 2D spatial data.&lt;br /&gt;&lt;br /&gt;The engine core with the key "main" is obtained through the Engine.getInstance() method. Entities are added to the engine through the Engine.addEntity() method. The Engine.stage property must be set to a valid Stage reference in order to enable keyboard and mouse signal capture. And the engine core's main loop is invoked repeatedly through the Engine.clock.tick() method, by the enter-frame event.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;package idv.cjcat.arrowwalker {&lt;br /&gt; import flash.display.Sprite;&lt;br /&gt; import flash.display.StageScaleMode;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.geom.Rectangle;&lt;br /&gt; import idv.cjcat.arrowwalker.entities.Player;&lt;br /&gt; import idv.cjcat.arrowwalker.entities.Scene;&lt;br /&gt; import idv.cjcat.rusher.engine.Engine;&lt;br /&gt; import idv.cjcat.rusher.engine.entities.PropertyReference;&lt;br /&gt; import idv.cjcat.rusher.geom.Vec2D;&lt;br /&gt; &lt;br /&gt; public class ArrowWalker extends Sprite {&lt;br /&gt;  &lt;br /&gt;  //name constants&lt;br /&gt;  public static const SPATIAL:String = "spatial";&lt;br /&gt;  public static const RENDERER:String = "renderer";&lt;br /&gt;  public static const RENDER_TARGET:String = "renderTarget";&lt;br /&gt;  public static const CONTROLLER:String = "controller";&lt;br /&gt;  &lt;br /&gt;  //property reference constants&lt;br /&gt;  public static const POSITION_REF:PropertyReference = new PropertyReference(SPATIAL, "position");&lt;br /&gt;  public static const ROTATION_REF:PropertyReference = new PropertyReference(SPATIAL, "rotation");&lt;br /&gt;  &lt;br /&gt;  private var engine:Engine;&lt;br /&gt;  &lt;br /&gt;  public function ArrowWalker() {&lt;br /&gt;   stage.scaleMode = StageScaleMode.NO_SCALE;&lt;br /&gt;   root.scrollRect = new Rectangle(0, 0, 640, 480);&lt;br /&gt;   &lt;br /&gt;   engine = Engine.getInstance("main");&lt;br /&gt;   &lt;br /&gt;   //initialize the stage for the key and mouse managers to work&lt;br /&gt;   engine.stage = stage;&lt;br /&gt;   &lt;br /&gt;   buildEntities();&lt;br /&gt;   &lt;br /&gt;   //start the main loop&lt;br /&gt;   addEventListener(Event.ENTER_FRAME, engine.clock.tick);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function buildEntities():void{&lt;br /&gt;   //create the layer entity&lt;br /&gt;   var player:Player = new Player();&lt;br /&gt;   player.renderTarget.displayObject = arrow_mc;&lt;br /&gt;   player.setProperty(POSITION_REF, new Vec2D(arrow_mc.x, arrow_mc.y));&lt;br /&gt;   &lt;br /&gt;   //create the scene entity&lt;br /&gt;   var scene:Scene = new Scene();&lt;br /&gt;   scene.renderer.addRenderTarget(player.renderTarget);&lt;br /&gt;   &lt;br /&gt;   engine.addEntity(player);&lt;br /&gt;   engine.addEntity(scene);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This is the Player entity class, consisted of three components: 2D spatial data, render target, and controller.&lt;br /&gt;&lt;br /&gt;The 2D spatial component contains data for position, rotation, and scale, while the scale data is not used in this example.&lt;br /&gt;&lt;br /&gt;The render target component holds a reference to a target display object whose position and rotation will be updated according to the spatial data, accomplished by setting the render target component's positionRef and rotationRef properties to PropertyReference objects that reference the spatial data by name. The useOwnContainer property is set to true, so the display object remains in its original container set up in Flash IDE, instead of being added to the renderer's internal container sprite.&lt;br /&gt;&lt;br /&gt;The controller component listens for keyboard signals and updates the 2D spatial data accordingly.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;package idv.cjcat.arrowwalker.entities {&lt;br /&gt; import idv.cjcat.arrowwalker.ArrowWalker;&lt;br /&gt; import idv.cjcat.arrowwalker.components.Controller;&lt;br /&gt; import idv.cjcat.rusher.engine.entities.Entity;&lt;br /&gt; import idv.cjcat.rusher.rendering2d.RenderTargetComponent;&lt;br /&gt; import idv.cjcat.rusher.spatial2d.Spatial2DComponent;&lt;br /&gt; &lt;br /&gt; public class Player extends Entity {&lt;br /&gt;  &lt;br /&gt;  public var spatial:Spatial2DComponent;&lt;br /&gt;  public var renderTarget:RenderTargetComponent;&lt;br /&gt;  public var controller:Controller;&lt;br /&gt;  &lt;br /&gt;  public function Player() {&lt;br /&gt;   &lt;br /&gt;   spatial = new Spatial2DComponent();&lt;br /&gt;   spatial.name = ArrowWalker.SPATIAL;&lt;br /&gt;   &lt;br /&gt;   renderTarget = new RenderTargetComponent();&lt;br /&gt;   renderTarget.name = ArrowWalker.RENDER_TARGET;&lt;br /&gt;   renderTarget.useOwnContainer = true;&lt;br /&gt;   renderTarget.positionRef = ArrowWalker.POSITION_REF;&lt;br /&gt;   renderTarget.rotationRef = ArrowWalker.ROTATION_REF;&lt;br /&gt;   &lt;br /&gt;   controller = new Controller();&lt;br /&gt;   controller.name = ArrowWalker.CONTROLLER;&lt;br /&gt;   &lt;br /&gt;   addComponent(spatial);&lt;br /&gt;   addComponent(renderTarget);&lt;br /&gt;   addComponent(controller);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This is the Scene entity, which is pretty much consisted of a single component: the renderer component. This component updates the spatial value of display objects referenced by render target components.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;package idv.cjcat.arrowwalker.entities {&lt;br /&gt; import idv.cjcat.arrowwalker.ArrowWalker;&lt;br /&gt; import idv.cjcat.rusher.engine.entities.Entity;&lt;br /&gt; import idv.cjcat.rusher.rendering2d.RendererComponent;&lt;br /&gt; &lt;br /&gt; public class Scene extends Entity {&lt;br /&gt;  &lt;br /&gt;  public var renderer:RendererComponent;&lt;br /&gt;  &lt;br /&gt;  public function Scene() {&lt;br /&gt;   &lt;br /&gt;   renderer = new RendererComponent();&lt;br /&gt;   renderer.name = ArrowWalker.RENDERER;&lt;br /&gt;   &lt;br /&gt;   addComponent(renderer);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Here's the Controller component that updates the arrow's position. The onTick() method declared in the ActiveComponent superclass is invoked on each main loop call. The engine property is a reference to the engine the owner entity is added to.&lt;br /&gt;&lt;br /&gt;Note that the s variable is set the a value of SPEED * time. The time parameter passed to the onTick() method is the elapsed time between two main loop calls in seconds. Multiplying the SPEED constant by time, the arrow will be moved at the speed of 400 pixels per second, independent of the frame rate. So if the frame rate is set to, say, 30 fps, instead of the original 60 fps, the arrow will still move at the speed of 400 pixels per second.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;package idv.cjcat.arrowwalker.components {&lt;br /&gt; import idv.cjcat.arrowwalker.ArrowWalker;&lt;br /&gt; import idv.cjcat.rusher.engine.components.ActiveComponent;&lt;br /&gt; import idv.cjcat.rusher.engine.entities.PropertyReference;&lt;br /&gt; import idv.cjcat.rusher.engine.ui.Key;&lt;br /&gt; import idv.cjcat.rusher.geom.Vec2D;&lt;br /&gt; &lt;br /&gt; public class Controller extends ActiveComponent {&lt;br /&gt;  &lt;br /&gt;  private static const SPEED:Number = 400;&lt;br /&gt;  &lt;br /&gt;  public function Controller() {&lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //this method will be called on every main loop call&lt;br /&gt;  override public function onTick(time:Number):void {&lt;br /&gt;   //initialize offset to zero&lt;br /&gt;   var dx:Number = 0;&lt;br /&gt;   var dy:Number = 0;&lt;br /&gt;   &lt;br /&gt;   //keyboard signal handling&lt;br /&gt;   var s:Number = SPEED * time;&lt;br /&gt;   if (engine.keyManager.isDown(Key.LEFT)) dx -= s;&lt;br /&gt;   if (engine.keyManager.isDown(Key.RIGHT)) dx += s;&lt;br /&gt;   if (engine.keyManager.isDown(Key.UP)) dy -= s;&lt;br /&gt;   if (engine.keyManager.isDown(Key.DOWN)) dy += s;&lt;br /&gt;   &lt;br /&gt;   //if both dx and dy are nonzero&lt;br /&gt;   if (dx &amp;&amp; dy) {&lt;br /&gt;    //multiply them by 1/sqrt(2) for normalization&lt;br /&gt;    dx *= Math.SQRT1_2;&lt;br /&gt;    dy *= Math.SQRT1_2;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   //if any of dx and dy are nonzero (movement present)&lt;br /&gt;   if (dx || dy) {&lt;br /&gt;    //update rotation angle&lt;br /&gt;    var rotation:Number = 90 + 180 * Math.atan2(dy, dx) / Math.PI;&lt;br /&gt;    entity.setProperty(ArrowWalker.ROTATION_REF, rotation);&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   //update position&lt;br /&gt;   //get the position data from the POSITION property reference&lt;br /&gt;   var pos:Vec2D = entity.getProperty(ArrowWalker.POSITION_REF);&lt;br /&gt;   pos.x += dx;&lt;br /&gt;   pos.y += dy;&lt;br /&gt;   &lt;br /&gt;   //confine the position into the center rectangle&lt;br /&gt;   if (pos.x &gt; 640) pos.x = 640;&lt;br /&gt;   else if (pos.x &lt; 0) pos.x = 0;&lt;br /&gt;   if (pos.y &gt; 420) pos.y = 420;&lt;br /&gt;   else if (pos.y &lt; 50) pos.y = 50;&lt;br /&gt;   &lt;br /&gt;   //set the position data to the POSITION property reference&lt;br /&gt;   entity.setProperty(ArrowWalker.POSITION_REF, pos);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Okay, this is kind of the basic usage of 2D spatial data, render targets, renderers, and active components for Rusher Game Framework. Next time I think I'll post some sample code for using Rusher's Box2D package.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3793784596083922687?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3793784596083922687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3793784596083922687&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3793784596083922687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3793784596083922687'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/02/arrow-walker-example-for-rusher-game.html' title='Arrow Walker Example for Rusher Game Framework'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SvbxhqEQobI/AAAAAAAAAkM/MtGiwsB7HgY/s72-c/arrowwalker.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-974169378291942796</id><published>2010-02-12T08:28:00.000-08:00</published><updated>2010-02-25T21:53:00.386-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PushButtonEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Rusher'/><category scheme='http://www.blogger.com/atom/ns#' term='PureMVC'/><title type='text'>Rusher Game Framework</title><content type='html'>I have been very quiet lately. That's because my friends and I are busy preparing for the Creative Game Design Contest held by &lt;a href="http://www.gamer.com.tw/"&gt;Gamer&lt;/a&gt;. The theme of the contest is "Escape", and that's the only limitation. There's no limit on the game genre and gameplay.&lt;br /&gt;&lt;br /&gt;Originally, I was thinking of using &lt;a href="http://pushbuttonengine.com/"&gt;PushButton Engine&lt;/a&gt;. However, as &lt;a href="http://coderhump.com/"&gt;Ben Garney&lt;/a&gt;, the creator of PushButton Engine, points out in the forum, that he is still working on transforming the engine from single-core to multi-core. My game requires a multi-core game engine, so I decided to develop a light-weight component-based experimental game engine myself. This is the advent of &lt;a href="http://code.google.com/p/rusher/"&gt;Rusher Game Framework&lt;/a&gt;. There's no stable build available in the Downloads section, but you can grab the latest revision from the SVN repository. There are two primitive examples available in the "tests" folder.&lt;br /&gt;&lt;br /&gt;The name Rusher comes from a character I designed when I was in high school. &lt;a href="http://cjcat2266.deviantart.com/gallery/#_search/rusher"&gt;Here&lt;/a&gt;'s what Rusher looks like. Rusher is still in alpha, and I think it'll become beta after we release our game.&lt;br /&gt;&lt;br /&gt;Since Rusher is component-based, it's rather easy to extend custom functionalities. Rusher already has a built-in Box2D component package, which works with Box2D 2.1a, the latest version. I developed this Box2D package because we're working on a 2D platformer.&lt;br /&gt;&lt;br /&gt;Here I'll briefly demonstrate some code snippets for Rusher.&lt;br /&gt;&lt;span id='fullpost'&gt;&lt;br /&gt;Similar to the Multicore version of &lt;a href="http://puremvc.org/"&gt;PureMVC&lt;/a&gt;, each core is referenced by a key. The Engine class servers as the facade of the game framework, pretty much like the Facade class in PureMVC. The getInstance() method is how you get a reference to an engine core.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[//get the engine core with the key "main"&lt;br /&gt;var engine:Engine = Engine.getInstance("main"); ]]&gt;&lt;/script&gt;&lt;br /&gt;Instead of providing something like a start() method, I'd prefer make the user call the main loop function manually, just like what I did for &lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust&lt;/a&gt;. Each engine core has a reference to a Clock object. The Clock.tick() method must be called repeatedly to keep the engine running. This method can be directly used as an event listener, just like the Emitter.step() method in Stardust.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[addEventListener(Event.ENTER_FRAME, engine.clock.tick); ]]&gt;&lt;/script&gt;&lt;br /&gt;The Entity class represents a game entity, be it concrete as a character or abstract as a game scene. An entity is consisted of multiple components, each representing a basic module of data or behavior. The ActiveComponent class represents a behavioral component that is to update the entity repeatedly. The ActiveComponent.tick() method is called in each main loop iteration. For this to work, the entity must be added to the engine.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[var entity:Entity = new Entity();&lt;br /&gt;entity.addComponent(new MyDataComponent());&lt;br /&gt;entity.addComponent(new MyActiveComponent());&lt;br /&gt;engine.addEntity(entity); ]]&gt;&lt;/script&gt;&lt;br /&gt;Each component has a name property, so that it can be referenced by name. One entity cannot possess two or more components with the same name. To reference the data (or properties) of a component from another component, the PropertyReference class is used. The concept of the PropertyReference class is actually from PushButton Engine. Referencing components and properties by name is very convenient and flexible. For instance, you can swap a component containing 2D spatial data with another special component with 2D spatial data, which works with Box2D, not interrupting the 2D rendering components which reference the 2D position data by name.&lt;br /&gt;&lt;br /&gt;Alright, this is pretty much I can say about Rusher so far. I'll post more details about Rusher once it's matured.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-974169378291942796?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/974169378291942796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=974169378291942796&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/974169378291942796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/974169378291942796'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/02/rusher-game-framework.html' title='Rusher Game Framework'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-2749120746390715469</id><published>2010-01-25T05:11:00.000-08:00</published><updated>2010-03-29T06:30:35.290-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActiveTuts+'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Let's Shoot Some Stars with Stardust!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://active.tutsplus.com/tutorials/effects/shoot-out-stars-with-the-stardust-particle-engine/"&gt;&lt;img style="cursor: pointer; width: 200px; height: 200px;" src="http://activetuts.s3.amazonaws.com/tuts/053_starDust/preview.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://active.tutsplus.com/tutorials/effects/shoot-out-stars-with-the-stardust-particle-engine/"&gt;View article&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, my Stardust tutorial article has been published on &lt;a href="http://active.tutsplus.com/"&gt;ActiveTuts+&lt;/a&gt;. They must have been very busy there at ActiveTuts+, since I had waited one week after the submission of the article for an acknowledgement and another week before it got published.&lt;br /&gt;&lt;br /&gt;If you are interested in Stardust and are too lazy to go through the nearly 50-page PDF manual, you might want to check this article out. It's short, and yet after reading it you'll be able to create particle effects with Stardust!&lt;br /&gt;&lt;br /&gt;I'm planning on writing more articles in the future about custom initializers/actions/renderers, 3D particle effects, and XML serialization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-2749120746390715469?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/2749120746390715469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=2749120746390715469&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2749120746390715469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2749120746390715469'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/01/lets-shoot-some-stars-with-stardust.html' title='Let&apos;s Shoot Some Stars with Stardust!'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1302187567943356072</id><published>2010-01-15T09:01:00.000-08:00</published><updated>2010-01-17T06:24:59.229-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Papervision3D'/><title type='text'>Stardust Umbrella &amp; Depth of Field</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.rainyday.jp/flash/pv3d/stardust03.html"&gt;&lt;img style="cursor: pointer; width: 200px; height: 170px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/S1Cf1KkfjDI/AAAAAAAAAm0/OOnhz4nZVEg/s400/umbrella+snow.png" alt="" id="BLOGGER_PHOTO_ID_5427013286700747826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.rainyday.jp/flash/pv3d/stardust03.html"&gt;View Blog Post&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just came across two Stardust demos that are pretty neat. The first one was made by &lt;a href="http://blog.rainyday.jp/"&gt;Hasegawa&lt;/a&gt; (name spelling corrected, sorry about that :p), using a circle deflector to simulate umbrella blocking snow. The deflection looks quite nice. It's the first demo I've found to use objects other than just a boring circle to make circle deflectors look tasty. By the way, there's somehow a huge performance difference for Stardust deflectors between the Release version and Debug version of Flash Player. The Release version performs better than the Debug version. On my laptop, the performance difference for this demo is almost 50%.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wonderfl.net/code/fe2348b4a5be9261cb3f42446e0319fc10365417"&gt;&lt;img style="cursor: pointer; width: 240px; height: 280px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/S1Cf0_YEUAI/AAAAAAAAAms/7hsdVvQuY08/s400/paq+stardust.png" alt="" id="BLOGGER_PHOTO_ID_5427013283695841282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wonderfl.net/code/fe2348b4a5be9261cb3f42446e0319fc10365417"&gt;View SWF &amp;amp; Source&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The other demo is created by &lt;a href="http://wonderfl.net/user/paq"&gt;paq&lt;/a&gt; on &lt;a href="http://wonderfl.net/"&gt;WonderFL&lt;/a&gt;. This demo uses plane deflector in combination with Papervision3D to create this bouncing-planes-with-depth-of-field effect. Note that the main class extends the ReflectionView class provided by Papervision3D, which makes the demo even more beautiful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1302187567943356072?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1302187567943356072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1302187567943356072&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1302187567943356072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1302187567943356072'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2010/01/stardust-umbrella-depth-of-field.html' title='Stardust Umbrella &amp; Depth of Field'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/S1Cf1KkfjDI/AAAAAAAAAm0/OOnhz4nZVEg/s72-c/umbrella+snow.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8137943103201242642</id><published>2009-12-26T11:31:00.000-08:00</published><updated>2009-12-26T12:05:39.929-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust v1.1 - Now with Linked Lists</title><content type='html'>&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html?idv/cjcat/stardust/common/particles/package-detail.html&amp;idv/cjcat/stardust/common/particles/class-list.html"&gt;Particle collection documentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After a few days of struggle, I've finally done it! Now &lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust&lt;/a&gt; implements linked lists internally for particle collections instead of arrays. Linked lists are better than arrays for rapidly adding and removing elements at random positions, theoretically. I found the performance to remain pretty much the same after this major change. However, the internal particle list implementation is now hidden from clients, which makes it much safer, preventing direct access to the particle array as in version 1.0.&lt;br /&gt;&lt;br /&gt;To iterate through particles in a particle list, you use the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/common/particles/ParticleIterator.html"&gt;ParticleIterator&lt;/a&gt; interface. You shall be familiar with this interface if you have worked with the C++ STL library or the Java collection APIs.&lt;br /&gt;&lt;br /&gt;I'll illustrate this iterator interface by some sample code. Here's how you set all the particles' positions in an emitter to (0, 0), the origin.&lt;br /&gt;&lt;pre class="brush: as3"&gt;&lt;br /&gt;var particles:ParticleCollection = emitter.getParticles();&lt;br /&gt;var iter:ParticleIterator = particles.getIterator();&lt;br /&gt;var particle:Particle2D;&lt;br /&gt;while (particle = iter.particle as Particle2D) {&lt;br /&gt;    particle.x = particle.y = 0;&lt;br /&gt;    iter.next();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And this is how you add completely-customized particles to an emitter.&lt;br /&gt;&lt;pre class="brush: as3"&gt;&lt;br /&gt;var particles:ParticleCollection = new ParticleList();&lt;br /&gt;for (var i:int = 0; i &lt; 100; i++) {&lt;br /&gt;    var p:Particle2D = new Particle2D();&lt;br /&gt;    p.x = 100 * Math.random();&lt;br /&gt;    p.y = 100 * Math.random();&lt;br /&gt;    particles.add(p);&lt;br /&gt;}&lt;br /&gt;emitter.addParticles(particles);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pretty clean and self-explanatory code, isn't it? I'm quite satisfied with how the interface ended up. From now on, I can tweak the internal implementation and algorithm of the particle list without having to change the code outside of the black box. Gosh, I should have done this long ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8137943103201242642?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8137943103201242642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8137943103201242642&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8137943103201242642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8137943103201242642'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/stardust-v11-now-with-linked-lists.html' title='Stardust v1.1 - Now with Linked Lists'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5122128605553033496</id><published>2009-12-22T08:44:00.001-08:00</published><updated>2009-12-22T09:47:50.894-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Video Tutorial - More On The Main Loop</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=TIVul6X7zoI&amp;amp;feature=PlayList&amp;amp;p=79300CF812C795F9&amp;amp;index=5"&gt;&lt;img style="cursor: pointer; width: 400px; height: 160px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SzD3gS-ADXI/AAAAAAAAAmg/TUGrSiH7f1Q/s400/more+on+main+loop.png" alt="" id="BLOGGER_PHOTO_ID_5418102485946469746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=TIVul6X7zoI&amp;amp;feature=PlayList&amp;amp;p=79300CF812C795F9&amp;amp;index=5"&gt;View Video&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/view_play_list?p=79300CF812C795F9"&gt;View playlist&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's been a long time since my last update for Stardust video tutorial. Thanks a lot to &lt;a href="http://clockmaker.jp/blog/"&gt;Clockmaker&lt;/a&gt; - his &lt;a href="http://clockmaker.jp/blog/2009/12/as3-stardust/"&gt;article&lt;/a&gt; introducing Stardust gave me a great motivation boost to get down to recording more new vids. Clockmaker inspires me a lot, including tilting illustrations in blog articles for 5 degrees :p&lt;br /&gt;&lt;br /&gt;This video covers more in-depth details on the main loop, including emitter events, initializer/action priorities, and particle masking, which are very important must-knows if you really want to do some serious coding and complex behavior handling with Stardust.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5122128605553033496?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5122128605553033496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5122128605553033496&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5122128605553033496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5122128605553033496'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/stardust-video-tutorial-more-on-main.html' title='Stardust Video Tutorial - More On The Main Loop'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SzD3gS-ADXI/AAAAAAAAAmg/TUGrSiH7f1Q/s72-c/more+on+main+loop.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7465125610962702365</id><published>2009-12-21T05:20:00.000-08:00</published><updated>2009-12-21T05:35:21.888-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Papervision3D'/><title type='text'>Clockmaker's Stardust Butterfly Demo</title><content type='html'>&lt;a href="http://clockmaker.jp/blog/2009/12/as3-stardust/"&gt;&lt;img src="http://clockmaker.jp/blog/wp-content/uploads/2009/12/091221-stardust.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://clockmaker.jp/blog/2009/12/as3-stardust/"&gt;View Clockmaker's article &amp; demo&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm very honored to come to know that &lt;a href="http://clockmaker.jp/blog/"&gt;Clockmaker&lt;/a&gt;, one of my favorite Japanese ActionScripters, has gotten his hands on &lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust&lt;/a&gt;! He's created a couple of awesome Stardust demos at &lt;a href="http://wonderfl.net/"&gt;Wonderfl&lt;/a&gt;, a Japanese ActionScript community that provides online Flex compiling service. You don't have to have the Flex compiler to test your ActionScript code: just type the code on the website and see it work the magic on the fly, literally. You can check out his demos in &lt;a href="http://wonderfl.net/user/clockmaker/codes"&gt;his Wonderfl gallery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Clockmaker's Stardust Butterfly demo is very, very astonishing. The glow effect, the fluid butterfly motion, and the reflection...they've all left me in silent awe. Just watch the demo on his blog and you'll know that I'm not joking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7465125610962702365?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7465125610962702365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7465125610962702365&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7465125610962702365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7465125610962702365'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/clockmakers-stardust-butterfly-demo.html' title='Clockmaker&apos;s Stardust Butterfly Demo'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-299031436647676402</id><published>2009-12-12T04:21:00.000-08:00</published><updated>2009-12-12T04:42:17.236-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Boundary Collision Sparks</title><content type='html'>&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/BoundaryCollisionSparks/BoundaryCollisionSparks.html"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 150px; height: 150px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SyOK6gBPPRI/AAAAAAAAAmA/jyzEeUv9kkQ/s400/boundary+sparks.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5414323914661641490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/BoundaryCollisionSparks/BoundaryCollisionSparks.html"&gt;View SWF&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/BoundaryCollisionSparks/"&gt;View source&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's it. I've always wanted to create an action trigger that is triggered by "collision" with a deflector, or "deflection" with a deflector not acting as an obstacle. Now I've finally got it done :)&lt;br /&gt;&lt;br /&gt;The magic behind the scene is quite simple: the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/actions/Deflect.html"&gt;Deflect&lt;/a&gt; class is modified so as to map a deflector to a boolean value, a flag for determining if a "collision" or "deflection" has occurred, through a dictionary object; the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/actions/triggers/DeflectorTrigger.html"&gt;DeflectorTrigger&lt;/a&gt; class then simply check the flag to determine if the trigger is triggered.&lt;br /&gt;&lt;br /&gt;However, extra caution is now required when creating custom deflectors. If you decide that a deflector does not "deflect" a particle, the overrided &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/deflectors/Deflector.html#calculateMotionData4D()"&gt;calculateMotionData4D&lt;/a&gt; method must return a null value instead of a "new MotionData(particle.x, particle.y, particle.vx, particle.vy)" copy of the particle's original position and velocity, which tells the DeflectorTrigger class that it should not be triggered.&lt;br /&gt;&lt;br /&gt;My next target should be creating a trigger that can detect interparticle collision, which would not be an easy task. Well, it's easy, but what I mean is that it's not going to be easy to implement it with action trigger structures; at least now I don't have the slightest idea about how to do it. I'll try and figure out a way to do it cleanly and efficiently.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-299031436647676402?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/299031436647676402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=299031436647676402&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/299031436647676402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/299031436647676402'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/boundary-collision-sparks.html' title='Boundary Collision Sparks'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SyOK6gBPPRI/AAAAAAAAAmA/jyzEeUv9kkQ/s72-c/boundary+sparks.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5519482176227565765</id><published>2009-12-10T02:52:00.000-08:00</published><updated>2009-12-10T03:03:51.202-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust + ZedBox Example: Duo Firewheel</title><content type='html'>&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/ZedBox/DuoFirewheel/DuoFirewheel.html"&gt;&lt;img style="cursor: pointer; width: 250px; height: 220px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SyDTXUoalyI/AAAAAAAAAl4/FMiCp4RR-vY/s400/dfw.png" alt="" id="BLOGGER_PHOTO_ID_5413559149728012066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/ZedBox/DuoFirewheel/DuoFirewheel.html"&gt;View SWF&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/ZedBox/DuoFirewheel/"&gt;View source&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've always felt like the ZedBox extension for Stardust has been left out for quite a while, so today I decided to spent some time revising the extension by improving the performance, and add a couple of new features, one of which being the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/threeD/zedbox/actions/ZBBillboardOriented.html"&gt;ZBBillboardOriented&lt;/a&gt; action, which is essentially a ZedBox version of the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/threeD/actions/BillboardOriented.html"&gt;BillboardOriented&lt;/a&gt; action.&lt;br /&gt;&lt;br /&gt;This example demonstrates the use of the ZBBillboardOriented action and the use of a custom gravity fields, the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/ZedBox/DuoFirewheel/VortexField3D.as"&gt;VortexField3D&lt;/a&gt; class. It also makes use of what the native Stardust 3D engine cannot do: hierarchical object structures. The two wheels are actually rotated "disk" ZedSprite objects added to the display list of a parent ZedSprite. These two disks originally lied on the XZ plane ,Y axis being the horizontal axis on the screen.&lt;br /&gt;&lt;br /&gt;I'm planning on using the ZBBillboardOriented action heavily on one of my personal projects. I'll bring it into public once it's finished.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5519482176227565765?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5519482176227565765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5519482176227565765&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5519482176227565765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5519482176227565765'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/stardust-zedbox-example-duo-firewheel.html' title='Stardust + ZedBox Example: Duo Firewheel'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/SyDTXUoalyI/AAAAAAAAAl4/FMiCp4RR-vY/s72-c/dfw.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6917942390401069217</id><published>2009-12-07T00:51:00.000-08:00</published><updated>2009-12-07T01:57:45.694-08:00</updated><title type='text'>Asynchronous Computation</title><content type='html'>&lt;a href="http://www.senocular.com/"&gt;Trevor McCauley&lt;/a&gt;'s &lt;a href="http://www.senocular.com/flash/tutorials/asyncoperations/"&gt;article&lt;/a&gt; about asynchronous ActionScript execution provides a brilliant way to distribute CPU-consuming computation from one frame to multiple frames. I was so excited when I first read this article, eager to try it out so much, and finally, today I had the chance to give it a try.&lt;br /&gt;&lt;br /&gt;One of my classmate was working on a project for a course on social networks. He used ActionScript for his project, trying to parse an XML file representing a graph of over 80 thousand nodes and reconstruct the graph using his own classes. If you, whether intentional or not, had somehow make your Flash program enter an infinite loop, you might know that Flash Player throws a time-out error if a single frame takes more than 15 seconds to render.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;His XML file was so big that even parsing it from string to the AS3 internal XML type took a couple of seconds, let alone instantiating his own classes representing nodes and edges for that graph, and as I expected, he was faced with the 15-second-error nightmare.&lt;br /&gt;&lt;br /&gt;I applied Trevor's idea to solve this problem by factoring out the instantiation of his classes and distribute it across multiple frames, and things worked out perfectly and beautifully!&lt;br /&gt;&lt;br /&gt;Thanks Trevor. Love you :)&lt;br /&gt;&lt;br /&gt;Here's some code snippet:&lt;br /&gt;&lt;pre class="brush: as3"&gt;&lt;br /&gt;//loader for loading external XML file&lt;br /&gt;var loader:URLLoader = new URLLoader();&lt;br /&gt;loader.addEventListener(Event.COMPLETE, onLoad);&lt;br /&gt;&lt;br /&gt;//start loading the XML file&lt;br /&gt;loader.load(new URLRequest("myXML.XML"));&lt;br /&gt;&lt;br /&gt;//XML variables&lt;br /&gt;var xml:XML;&lt;br /&gt;var nodes:XMLList;&lt;br /&gt;var edges:XMLList;&lt;br /&gt;&lt;br /&gt;//graph model&lt;br /&gt;var graph:Graph = new Graph();&lt;br /&gt;&lt;br /&gt;//asynchronous computation variables&lt;br /&gt;var currentIndex:int; //this index keeps track of the progress of asynchronous computations&lt;br /&gt;var length:int;&lt;br /&gt;var startTime:int;&lt;br /&gt;var allcatedTimePerFrame:int = 16; //approximately 60fps&lt;br /&gt;&lt;br /&gt;//loader complete event handler&lt;br /&gt;function onLoad(e:Event):void {&lt;br /&gt;    xml = XML(loader.data);&lt;br /&gt;    nodes = xml.node;&lt;br /&gt;    edges = xml.edge;&lt;br /&gt;   &lt;br /&gt;    //initialize asynchronous computation variables&lt;br /&gt;    currentIndex = 0;&lt;br /&gt;    length = nodes.length();&lt;br /&gt;   &lt;br /&gt;    //start building nodes asynchronously&lt;br /&gt;    addEventListener(Event.ENTER_FRAME, buildNodes);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//asynchronous computation for building nodes&lt;br /&gt;function buildNodes(e:Event):void {&lt;br /&gt;    //take a snapshot of the current time&lt;br /&gt;    startTime = getTimer();&lt;br /&gt;   &lt;br /&gt;    for (var i:int = currentIndex; i &amp;lt length; i++) {&lt;br /&gt;        //build nodes in the graph model&lt;br /&gt;        graph.createNode(nodes[i].@name);&lt;br /&gt;        currentIndex++;&lt;br /&gt;       &lt;br /&gt;        //check if the computation is complete&lt;br /&gt;        if (currentIndex == length) {&lt;br /&gt;            //stop this listener&lt;br /&gt;            removeEventListener(Event.ENTER_FRAME, buildNodes);&lt;br /&gt;           &lt;br /&gt;            //initialize asynchronous computation variables&lt;br /&gt;            currentIndex = 0;&lt;br /&gt;            length = edges.length();&lt;br /&gt;           &lt;br /&gt;            //start buliding edges&lt;br /&gt;            addEventListener(Event.ENTER_FRAME, buildEdges);&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;       &lt;br /&gt;        //check if the time spent on this loop exceeds the allocated time per frame&lt;br /&gt;        if (getTimer() - startTime() &amp;gt allocatedTimePerFrame) {&lt;br /&gt;            //display the current progress in a text field&lt;br /&gt;            progress_txt.text = "building nodes: " + 100 * (currentIndex / length) + "%";&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//asynchronous computation for building edges&lt;br /&gt;function buildEdges(e:Event):void {&lt;br /&gt;    //take a snapshot of the current time&lt;br /&gt;    startTime = getTimer();&lt;br /&gt;   &lt;br /&gt;    for (var i:int = currentIndex; i &amp;lt length; i++) {&lt;br /&gt;        //build nodes in the graph model&lt;br /&gt;        graph.createEdge(edges[i].@node1Name, edges[i].@node2Name);&lt;br /&gt;        currentIndex++;&lt;br /&gt;       &lt;br /&gt;        //check if the computation is complete&lt;br /&gt;        if (currentIndex == length) {&lt;br /&gt;            //stop this listener&lt;br /&gt;            removeEventListener(Event.ENTER_FRAME, buildEdges);&lt;br /&gt;           &lt;br /&gt;            //we're done!!&lt;br /&gt;            //display the graph on the stage&lt;br /&gt;            graph.buildView();&lt;br /&gt;            addChild(graph.getView());&lt;br /&gt;           &lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;       &lt;br /&gt;        //check if the time spent on this loop exceeds the allocated time per frame&lt;br /&gt;        if (getTimer() - startTime() &amp;gt allocatedTimePerFrame) {&lt;br /&gt;            //display the current progress in a text field&lt;br /&gt;            progress_txt.text = "building edges: " + 100 * (currentIndex / length) + "%";&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6917942390401069217?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6917942390401069217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6917942390401069217&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6917942390401069217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6917942390401069217'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/asynchronous-computation.html' title='Asynchronous Computation'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8476684154028532632</id><published>2009-12-03T01:04:00.000-08:00</published><updated>2009-12-03T02:00:51.469-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Synchronized Movie Clip</title><content type='html'>&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/SynchronizedMovieClipTest/SynchronizedMovieClipTest.html"&gt;&lt;img src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/Snv2rE_OtJI/AAAAAAAAAZ8/epFhl2_2oq8/s320/turbulent+blast.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/SynchronizedMovieClipTest/SynchronizedMovieClipTest.html"&gt;View SWF&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/SynchronizedMovieClipTest/"&gt;View source&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The new &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/display/SynchronizedMovieClip.html"&gt;SynchronizedMovieClip&lt;/a&gt; class is a &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/display/StardustMovieClip.html"&gt;StardustMovieClip&lt;/a&gt; subclass, which is for "time step synchronization" I mentioned in this &lt;a href="http://cjcat.blogspot.com/2009/12/stardust-movie-clip.html"&gt;article&lt;/a&gt;. In this demo you can notice that there's a slider bar for tweaking the time scale of the particle simulation (which tweaks the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/common/emitters/Emitter.html#stepTimeInterval"&gt;Emitter.stepTimeInterval&lt;/a&gt; property).&lt;br /&gt;&lt;br /&gt;In the absence of the SynchronizedMovieClip class, the movie clips will play at the original speed even if the simulation time is scaled down, which is pretty logical since the frame rate is not changed, only the internal time scale for simulation changed.&lt;br /&gt;&lt;br /&gt;Now the movie clips are SynchronizedMovieClip instances and the emitter has a &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/initializers/StardustSpriteInit.html"&gt;StardustSpriteInit&lt;/a&gt; initializer and &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/actions/StardustSpriteUpdate.html"&gt;StardustSpriteUpdate&lt;/a&gt; action added to it, the movie clips can be synchronized with the particle simulation time scale. The StardustSpriteInit initializer stops the movie clips at the very beginning by calling the init() method defined in the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/display/IStardustSprite.html"&gt;IStardustSprite&lt;/a&gt; interface, which the StardustSpriteMovieClip class implements, and the StardustSpriteUpdate action sets the movie clips' frames according to the simulation time scale through the update() method, also defined in the IStardustSprite interface.&lt;br /&gt;&lt;br /&gt;This is how the synchronization of movie clips and Stardust particle simulation is done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8476684154028532632?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8476684154028532632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8476684154028532632&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8476684154028532632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8476684154028532632'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/synchronized-movie-clip.html' title='Synchronized Movie Clip'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/Snv2rE_OtJI/AAAAAAAAAZ8/epFhl2_2oq8/s72-c/turbulent+blast.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-2712627819575839976</id><published>2009-12-02T00:13:00.000-08:00</published><updated>2009-12-03T01:15:50.334-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Movie Clip</title><content type='html'>&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;br /&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you've played with Stardust for a while, you might notice that there's an &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/common/emitters/Emitter.html#stepTimeInterval"&gt;Emitter.stepTimeInterval&lt;/a&gt; property which allows you to dynamically adjust the particle simulation timescale. Here's one &lt;a href="http://wonderfl.net/code/169e23cef8b6902b472d9f3579ead65266d325c7"&gt;demo&lt;/a&gt; showing you the adjustable timescale feature in action.&lt;br /&gt;&lt;br /&gt;Now that you can adjust the timescale of particle simulation, the next problem is how to synchronize your movie clips with the timescale.&lt;br /&gt;&lt;br /&gt;Originally, there was only a &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/display/StardustSprite.html"&gt;StardustSprite&lt;/a&gt; class that extends the Sprite class. My original intent was simple: allow a display object to respond to each &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/common/emitters/Emitter.html#step()"&gt;Emitter.step()&lt;/a&gt; method call and to have access to timescale information, in turn updating itself correspondingly. If a particle's display object is a subclass of the StardustSprite class, and the emitter has a &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/actions/StardustSpriteUpdate.html"&gt;StardustSpriteUpdate&lt;/a&gt; action added to it, then the display object's update() method is invoked upon each emitter step, with a reference to the emitter, timescale information, and a reference to the particle's data passed in as parameters.&lt;br /&gt;&lt;br /&gt;In order to synchronize movie clips with the dynamically adjusted timescale, I wrote the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/display/StardustMovieClip.html"&gt;StardustMovieClip&lt;/a&gt; class, which pretty much is just a movie clip version of the StardustSprite class, and I extracted the update() method into a separate interface, the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/display/IStardustSprite.html"&gt;IStardustSprite&lt;/a&gt; interface. Now if you use a movie clip that extends the StardustMovieClip class for the particles and add the StardustSpriteUpdate action to the emitter, you can handle timescale change by overriding the update method() in your class. I'll write a base class just for this purpose when I have time. But for now, you can try it yourself if you're interested.&lt;br /&gt;&lt;br /&gt;Another addition to the StardustSprite family is the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/display/IStardustSprite.html#init()"&gt;IStardustSprite.init()&lt;/a&gt; method. My original intention was to provide a way to "reset" recycled display objects for particles initialized by the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/display/IStardustSprite.html"&gt;PooledDisplayObjectClass&lt;/a&gt;. Since used display objects are recycled into a pool and taken out again for future use, they indeed need a way to reset themselves when they are taken out from the pool and used again. For instance, you might want reset the playhead of your movie clips back to the first frame. To invoke the IStardustSprite.init() method, add the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/initializers/StardustSpriteInit.html"&gt;StardustSpriteInit&lt;/a&gt; initializer to the emitter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-2712627819575839976?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/2712627819575839976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=2712627819575839976&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2712627819575839976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2712627819575839976'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/stardust-movie-clip.html' title='Stardust Movie Clip'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8645610485002880302</id><published>2009-12-01T23:49:00.000-08:00</published><updated>2009-12-02T00:13:28.653-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Pooled Display Object Initializer for Stardust</title><content type='html'>&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;br /&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the major CPU consumption cause of Stardust is the display object instantiation, since new display objects are created rather rapidly along the particle simulation. So I think using an object pool to store display objects that are no longer needed for future use is a nice way to improve performance.&lt;br /&gt;&lt;br /&gt;The new &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/initializers/PooledDisplayObjectClass.html"&gt;PooledDisplayObjectClass&lt;/a&gt; and &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/threeD/initializers/PooledDisplayObjectClass3D.html"&gt;PooledDisplayObjectClass3D&lt;/a&gt; initializers are "pooled" versions of their counterparts, the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/initializers/DisplayObjectClass.html"&gt;DisplayObjectClass&lt;/a&gt; and &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/threeD/initializers/DisplayObjectClass3D.html"&gt;DisplayObjectClass3D&lt;/a&gt; initializers, respectively.&lt;br /&gt;&lt;br /&gt;I've run a quick performance test, and found that when using the PooledDisplayObjectClass initializer to initialize particles with display objects, the performance improves by approximately 10%~15%, compared to the original DisplayObjectClass initializer. It's not a significant improvement, but at least it's better :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8645610485002880302?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8645610485002880302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8645610485002880302&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8645610485002880302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8645610485002880302'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/12/pooled-display-object-initializer-for.html' title='Pooled Display Object Initializer for Stardust'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5229381579968223593</id><published>2009-11-18T00:00:00.001-08:00</published><updated>2009-11-18T00:20:15.446-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pyronova'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Pyronova 1.0 Beta &amp; Butterfly Example</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/pyronova/"&gt;&lt;img style="cursor: pointer; width: 250px; height: 140px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SwOp0t04FnI/AAAAAAAAAls/hUcAR8Y8xb8/s400/Pyronova+logo+small.png" alt="" id="BLOGGER_PHOTO_ID_5405350700894393970" border="0" /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/pyronova/"&gt;&lt;br /&gt;&lt;br /&gt;Pyronova project homepage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pyronova.googlecode.com/svn/trunk/docs/index.html"&gt;View documentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I lied. I cannot wait until my midterm ends to finish Pyronova :p&lt;br /&gt;Now it's in 1.0 Beta, and supports XML serialization.&lt;br /&gt;Also, it's currently half-documented. I'll complete the documentation ASAP.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;I've created this example combining Pyronova and &lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust&lt;/a&gt;. I think the outcome looks pretty nice :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://pyronova.googlecode.com/svn/trunk/examples/Butterflies/Butterflies.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SwOp0b3KznI/AAAAAAAAAlk/f5f21IlmoqA/s400/butterflies.png" alt="" id="BLOGGER_PHOTO_ID_5405350696072171122" border="0" /&gt;&lt;/a&gt;&lt;a href="http://pyronova.googlecode.com/svn/trunk/examples/Butterflies/Butterflies.html"&gt;&lt;br /&gt;&lt;br /&gt;View SWF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The logics behind this effect is rather simple: the butterflies are created using Stardust (well, that's another story); the HueNode shifts the hue of the butterflies, and the BlurNode blurs the butterflies to create the glowy effect.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5229381579968223593?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5229381579968223593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5229381579968223593&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5229381579968223593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5229381579968223593'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/11/pyronova-10-beta-butterfly-example.html' title='Pyronova 1.0 Beta &amp; Butterfly Example'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SwOp0t04FnI/AAAAAAAAAls/hUcAR8Y8xb8/s72-c/Pyronova+logo+small.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3433609895237147929</id><published>2009-11-17T08:54:00.001-08:00</published><updated>2009-11-17T08:58:14.743-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pyronova'/><title type='text'>Pyronova Logo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/pyronova/"&gt;&lt;img style="cursor: pointer; width: 250px; height: 140px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SwLVoR2tQuI/AAAAAAAAAlc/lhRsO7N5hO8/s400/Pyronova+logo+small.png" alt="" id="BLOGGER_PHOTO_ID_5405117390762361570" border="0" /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/pyronova/"&gt;&lt;br /&gt;&lt;br /&gt;Pyronova project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cjcat2266.googlepages.com/Pyronovalogolarge.png"&gt;View logo in full size&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Whew, I'm kind of all-thumbs with Illustartor. It took me quite a while to get this lousy logo done :p&lt;br /&gt;&lt;br /&gt;How do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3433609895237147929?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3433609895237147929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3433609895237147929&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3433609895237147929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3433609895237147929'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/11/pyronova-logo.html' title='Pyronova Logo'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SwLVoR2tQuI/AAAAAAAAAlc/lhRsO7N5hO8/s72-c/Pyronova+logo+small.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3171610884277430542</id><published>2009-11-13T10:31:00.000-08:00</published><updated>2009-11-18T08:56:27.253-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pyronova'/><title type='text'>New Project for Post-Processing FX</title><content type='html'>&lt;a href="http://pyronova.googlecode.com/svn/trunk/examples/DisplacementGlow/DisplacementGlow.html"&gt;&lt;img style="cursor: pointer; width: 285px; height: 285px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/Sv2nLszfV8I/AAAAAAAAAks/YelCLKS1L5w/s320/postfx.png" alt="" id="BLOGGER_PHOTO_ID_5403658947361986498" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;View SWF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm starting a new project called &lt;a href="http://code.google.com/p/pyronova"&gt;Pyronova&lt;/a&gt;, which is a post-processing FX framework. It features a network-based design, which allows you to connect "Pyro nodes" as you like to create your own post-processing effects. The project is still under development, so the source you find in the repository is just its prototype.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Here's the network diagram for this example.&lt;br /&gt;&lt;img src="http://pyronova.googlecode.com/svn/trunk/tests/displacement%20map/illustration/illustration.png" /&gt;&lt;br /&gt;&lt;br /&gt;A BitmapDataNode represents a BitmapData object. A PerlinNoiseNode generates Perlin noise bitmaps. A DisplacementNode takes two inputs: one regular input and one as a displacement map. A BlurNode, as its name suggests, blurs a bitmap up. A RedrawNode redraws a bitmap with additional settings such as transformation matrices and color transforms. "Pyro layers" are final destinations for post-processing networks, each layer having one single root node as its "final appearance".&lt;br /&gt;&lt;br /&gt;In this example, a BitmapDataNode is used to hold reference to the Bunny-In-Black (BIB) bitmap data. The BlurNode blurs the BIB bitmap (previously processed by the DisplacementNode with Perlin noise distortion) and then pass it to the RedrawNode. The RedrawNode is assigned a ColorTransform object with RGB multipliers of values 1.3, essentially lightening things up. Finally, Layer 2 presents this final "blurred and lightened-up" bitmap and is assigned an ADD blend mode, serving as a "glow overlay" to the original bitmap, which is displayed through Layer 1.&lt;br /&gt;&lt;br /&gt;Here's some sample code that sets up the network:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;var bmpdNode:BitmapDataNode = new BitmapDataNode(new BIB(300, 300));&lt;br /&gt;var perlinNode:PerlinNoiseNode = new PerlinNoiseNode(6, 6, 1, 0, true, true, 3);&lt;br /&gt;var displacementNode:DisplacementNode = new DisplacementNode(bmpdNode, perlinNode);&lt;br /&gt;var blurNode:BlurNode = new BlurNode(displacemenNode, 20, 20, 2);&lt;br /&gt;var lightenNode:RedrawNode = new RedrawNode(blurNode);&lt;br /&gt;&lt;br /&gt;perlinNode.baseX = perlinNode.baseY = 6;&lt;br /&gt;perlinNode.channelOptions = 1 | 2;&lt;br /&gt;blurNode.blurX = blurNode.blurY = 20;&lt;br /&gt;blurNode.quality = 2;&lt;br /&gt;lightenNode.colorTransform = new ColorTransform(1.3, 1.3, 1.3);&lt;br /&gt;&lt;br /&gt;var canvas:PyroCanvas = new PyroCanvas();&lt;br /&gt;var layer1:PyroLayer = new PyroLayer(displacementNode);&lt;br /&gt;var layer2:PyroLayer = new PyroLayer(lightenNode);&lt;br /&gt;&lt;br /&gt;layer2.blendMode = BlendMode.ADD;&lt;br /&gt;&lt;br /&gt;canvas.addLayer(layer1);&lt;br /&gt;cnavas.addLayer(layer2);&lt;br /&gt;&lt;br /&gt;addChild(canvas);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;I'll push this project into Beta as soon as possible.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3171610884277430542?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3171610884277430542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3171610884277430542&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3171610884277430542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3171610884277430542'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/11/new-project-for-post-processing-fx.html' title='New Project for Post-Processing FX'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4-LtXwX7Yuo/Sv2nLszfV8I/AAAAAAAAAks/YelCLKS1L5w/s72-c/postfx.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4974344611147435175</id><published>2009-11-08T08:26:00.000-08:00</published><updated>2009-12-09T09:01:07.969-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PushButtonEngine'/><title type='text'>PushButton Game Engine Example: Arrow Walker</title><content type='html'>&lt;a href="http://pushbuttonengine.com"&gt;&lt;img src="http://pushbuttonengine.com/wp-content/themes/pbe/images/pushbutton-engine.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PushButton%20Engine/ArrowWalker/bin/ArrowWalker.html"&gt;&lt;img style="cursor: pointer; width: 245px; height: 69px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SvbxhqEQobI/AAAAAAAAAkM/MtGiwsB7HgY/s320/arrowwalker.png" alt="" id="BLOGGER_PHOTO_ID_5401770363607622066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PushButton%20Engine/ArrowWalker/bin/ArrowWalker.html"&gt;View SWF&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PushButton%20Engine/ArrowWalker/src/"&gt;View Source&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This example is my first attempt to try out &lt;a href="http://pushbuttonengine.com/"&gt;PushButton Engine&lt;/a&gt;, an AS3 component-based game engine. I must say that the guys working on this project really have done a fantastic work. This engine is highly flexible, highly extensible; moreover, it supports XML serialization and advanced asset management (such as run-time loading).&lt;br /&gt;&lt;span id='fullpost'&gt;&lt;br /&gt;In a component-based game engine, everything is regarded as an &lt;span style="font-weight: bold;"&gt;entity&lt;/span&gt;, be it as concrete as  characters, obstacles, or as abstract as scene, renderer. If, you might ask, everything is regarded as equal, how may their behaviors differ? The answer is &lt;span style="font-weight: bold;"&gt;component&lt;/span&gt;. Each entity can possess different set of components, which can store properties like position, and carry out behaviors such as moving. This component-based structure would solve the problems present in inheritance-based designs. If you are interested what problems can be caused by inheritance-based designs, you can check out &lt;a href="http://www.youtube.com/watch?v=auaqZzcjl-Y&amp;amp;feature=player_embedded"&gt;this video&lt;/a&gt; by Ben Garney, the lead developer for PushButton Engine.&lt;br /&gt;&lt;br /&gt;Alright, that's enough for the introduction. Now let's get down to the example. This example , called Arrow Walker, is basically just an arrow that can move around, controlled by the arrow keys.&lt;br /&gt;&lt;br /&gt;NOTE: This example is built with the latest PushButton Engine, revision 615 so far. And the code shown in this post is partially stripped out and modified from the original source for clarity. You can check out the complete source code &lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PushButton%20Engine/ArrowWalker/src/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First off, use the &lt;span style="font-family:courier new;"&gt;PBE.startup()&lt;/span&gt; method to start up the engine. This method essentially tells the engine which &lt;span style="font-family:courier new;"&gt;Stage&lt;/span&gt; instance is the main stage. Then for a most minimalistic example,  at least a scene and an object are needed. In this example, I split the codes for these two entities apart for clarity (the &lt;span style="font-family:courier new;"&gt;setupScene()&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;setupArrow()&lt;/span&gt; method).&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;PBE.startup(this);&lt;br /&gt;setupScene();&lt;br /&gt;setupArrow();&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The&lt;span style="font-family:courier new;"&gt; allocateEntity()&lt;/span&gt; method is the method that must be used whenever you want to create a new entity.&lt;br /&gt;&lt;br /&gt;Now lets look at the &lt;span style="font-family:courier new;"&gt;setupScene()&lt;/span&gt; method. All that we need for a scene is a &lt;span style="font-family:courier new;"&gt;DisplayObjectScene&lt;/span&gt; component. This component renders entities with a spatial component, which stores spatial information including position and rotation, and a &lt;span style="font-family:courier new;"&gt;DisplayObjectRenderer&lt;/span&gt; component. A &lt;span style="font-family:courier new;"&gt;SceneView&lt;/span&gt; object is a sprite the renderer can render onto.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;private function setupScene():void{&lt;br /&gt;    var sceneEntity:IEntity = allocateEntity();&lt;br /&gt;    sceneEntity.initialize("sceneEntity");&lt;br /&gt;   &lt;br /&gt;    scene = new DisplayObjectScene();&lt;br /&gt;   &lt;br /&gt;    var sceneView:SceneView = new SceneView();&lt;br /&gt;    sceneView.width = 640;&lt;br /&gt;    sceneView.height = 480;&lt;br /&gt;    scene.sceneView = sceneView;&lt;br /&gt;   &lt;br /&gt;    sceneEntity.addComponent(scene, "renderer");&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Next, let's look at the &lt;span style="font-family: courier new;"&gt;setupArrow()&lt;/span&gt; method. The &lt;span style="font-family: courier new;"&gt;DisplayObjectRenderer&lt;/span&gt; component points to a movie clip named &lt;span style="font-family: courier new;"&gt;arrow_mc&lt;/span&gt;, which would be constantly rendered by the scene entity after the &lt;span style="font-family: courier new;"&gt;DisplayObjectRenderer&lt;/span&gt; component is added to the &lt;span style="font-family: courier new;"&gt;DisplayObjectScene &lt;/span&gt;component of the scene entity. The &lt;span style="font-family: courier new;"&gt;PropertyReference&lt;/span&gt; objects tell the renderer to query a specified spatial component for position and rotation information. For instance a property reference with a string &lt;span style="font-family: courier new;"&gt;"@spatial.position"&lt;/span&gt; assigned to it tells the renderer to look for a component named &lt;span style="font-family: courier new;"&gt;"spatial"&lt;/span&gt; and check the component's &lt;span style="font-family: courier new;"&gt;"position"&lt;/span&gt; property, in order to obtain the entity's position information. The same logic applies to a property reference with a string &lt;span style="font-family: courier new;"&gt;"@spatial.rotation"&lt;/span&gt; assigned to it.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;private function setupArrow():void{&lt;br /&gt;    var arrowEntity:IEntity = allocateEntity();&lt;br /&gt;    arrowEntity.initialize("arrowEntity");&lt;br /&gt; &lt;br /&gt;    var spatial:SimpleSpatialComponent = new SimpleSpatialComponent();&lt;br /&gt;    var renderer:DisplayObjectRenderer = new DisplayObjectRenderer();&lt;br /&gt;    var controller:SimpleController = new SimpleController();&lt;br /&gt; &lt;br /&gt;    //setup renderer componenet (arrow_mc is a sprite in the FLA file)&lt;br /&gt;    renderer.displayObject = arrow_mc;&lt;br /&gt;    renderer.positionProperty = new PropertyReference("@spatial.position");&lt;br /&gt;    renderer.rotationProperty = new PropertyReference("@spatial.rotation");&lt;br /&gt;    scene.add(renderer);&lt;br /&gt; &lt;br /&gt;    arrowEntity.addComponent(spatial, "spatial");&lt;br /&gt;    arrowEntity.addComponent(renderer, "renderer");&lt;br /&gt;    arrowEntity.addComponent(controller, "controller");&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Finally, let's look at the &lt;span style="font-family: courier new;"&gt;SimpleController&lt;/span&gt; component, which controls the arrow's moving behavior and handles border conditions, confining the arrow within a 640x480 rectangle region. This component extends the &lt;span style="font-family: courier new;"&gt;TickedComponent&lt;/span&gt; class, whose &lt;span style="font-family: courier new;"&gt;onTick()&lt;/span&gt; method is called every "frame". The &lt;span style="font-family: courier new;"&gt;_keyMap&lt;/span&gt; property is a dictionary object for storing key data (whether a key is pressed). You can check out &lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PushButton%20Engine/ArrowWalker/src/idv/cjcat/arrowwalker/components/SimpleController.as"&gt;the source code for this class&lt;/a&gt; to see it's complete implementation.&lt;br /&gt;&lt;br /&gt;Note that the "frame" here doesn't mean the frame in Flash Player, but the PushButton Engine's own internal frame system handled by the &lt;span style="font-family: courier new;"&gt;ProcessManager&lt;/span&gt; class. It's designed this way so that the game's numeric data can update independently of the Flash Player's current framerate.&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: as3"&gt;&lt;![CDATA[&lt;br /&gt;override public function onTick(tickRate:Number):void {&lt;br /&gt;    var dx:Number = 0;&lt;br /&gt;    var dy:Number = 0;&lt;br /&gt;   &lt;br /&gt;    //handle vertical displacement&lt;br /&gt;    if (_keyMap[UP]) dy -= speed;&lt;br /&gt;    if (_keyMap[DOWN]) dy += speed;&lt;br /&gt;   &lt;br /&gt;    //handle horizontal displacement&lt;br /&gt;    if (_keyMap[LEFT]) dx -= speed;&lt;br /&gt;    if (_keyMap[RIGHT]) dx += speed;&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;    if (dx &amp;amp; dy) {&lt;br /&gt;        dx *= Math.SQRT1_2;&lt;br /&gt;        dy *= Math.SQRT1_2;&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    //time alignment&lt;br /&gt;    dx *= tickRate;&lt;br /&gt;    dy *= tickRate;&lt;br /&gt;   &lt;br /&gt;    //get position&lt;br /&gt;    var position:Point = owner.getProperty(new PropertyReference("@spatial.position")) as Point;&lt;br /&gt;   &lt;br /&gt;    //set position &amp;amp; rotation&lt;br /&gt;    position.x += dx;&lt;br /&gt;    position.y += dy;&lt;br /&gt;    if (position.x &gt; 320) position.x = 320;&lt;br /&gt;    else if (position.x &lt; -320) position.x = -320;&lt;br /&gt;    if (position.y &gt; 240) position.y = 240;&lt;br /&gt;    else if (position.y &lt; -240) position.y = -240;&lt;br /&gt;    owner.setProperty(ArrowWalker.POSITION_REF, position);&lt;br /&gt;    if (dx | dy) owner.setProperty(new PropertyReference("@spatial.rotation"), RADIAN_TO_DEGREE * Math.atan2(dx, -dy));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Alright, we're done. You can view the result &lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PushButton%20Engine/ArrowWalker/bin/ArrowWalker.html"&gt;here&lt;/a&gt; and check out the source code &lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PushButton%20Engine/ArrowWalker/src/"&gt;here&lt;/a&gt;.&lt;br /&gt;For those advanced PushButton Engine users, this example seems to be way too easy.&lt;br /&gt;But for those who are interested in this engine and are about to try it out, I hope this example helps understand the basic usage of PushButton Enigne.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4974344611147435175?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4974344611147435175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4974344611147435175&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4974344611147435175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4974344611147435175'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/11/pushbutton-game-engine-example-arrow.html' title='PushButton Game Engine Example: Arrow Walker'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SvbxhqEQobI/AAAAAAAAAkM/MtGiwsB7HgY/s72-c/arrowwalker.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1511392904400772604</id><published>2009-11-04T08:47:00.000-08:00</published><updated>2009-11-10T08:15:20.032-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Video Tutorial on Actual Coding</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=ZLV0Lrt2GSI&amp;amp;feature=PlayList&amp;amp;p=79300CF812C795F9&amp;amp;index=3"&gt;&lt;img style="cursor: pointer; width: 300px; height: 243px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SvGwrOyeNWI/AAAAAAAAAkE/mNtBm9Tu7yY/s320/vid.png" alt="" id="BLOGGER_PHOTO_ID_5400291684944590178" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.youtube.com/watch?v=ZLV0Lrt2GSI&amp;amp;feature=PlayList&amp;amp;p=79300CF812C795F9&amp;amp;index=3"&gt;&lt;br /&gt;&lt;br /&gt;04 - Basic Workflow part 1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=INf_ssxFhb4&amp;amp;feature=PlayList&amp;amp;p=79300CF812C795F9&amp;amp;index=4"&gt;05 - Basic Workflow part 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/view_play_list?p=79300CF812C795F9"&gt;View Complete Playlist&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At last, the video tutorials have begun covering actual coding. If you've watched the video of my speech for the 2009 PTT Flash Workshop, you might have noticed that I used a tablet to hand-write in OpenCanvas, using it as a digital whiteboard. The second half of the 4th episode of the video tutorials is actually a remake of the whiteboard hand-writing, in a form of an *cough* elaborate *cough* PowerPoint animation.&lt;br /&gt;&lt;br /&gt;Enjoy :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1511392904400772604?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1511392904400772604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1511392904400772604&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1511392904400772604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1511392904400772604'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/11/stardust-video-tutorial-on-actual.html' title='Stardust Video Tutorial on Actual Coding'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/SvGwrOyeNWI/AAAAAAAAAkE/mNtBm9Tu7yY/s72-c/vid.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-882840545433479769</id><published>2009-11-01T08:19:00.001-08:00</published><updated>2009-11-10T08:15:28.367-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Video Tutorials!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/user/cjcat2266#p/c/79300CF812C795F9/0/9Fr7S9IGyhs"&gt;&lt;img style="cursor: pointer; width: 77px; height: 30px;" src="http://www.sabredefence.com/images/youtube_logo.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/user/cjcat2266#p/c/79300CF812C795F9/0/9Fr7S9IGyhs"&gt;01 - Introduction&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/user/cjcat2266#p/c/79300CF812C795F9/1/Pik7xxWrGNk"&gt;02 - Class Responsibilities&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/user/cjcat2266#p/c/79300CF812C795F9/2/182hRfEI70s"&gt;03 - Getting Started&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally! I've started recording video tutorials for Stardust.&lt;br /&gt;&lt;br /&gt;This is my first time trying to use PowerPoint in video tutorials. I think using premade slides does make the videos look better, and, more importantly, helps me remember what I should say :p&lt;br /&gt;&lt;br /&gt;I haven't gone to the parts where actual coding takes place, but still, these videos are worth watching, since they give you a full understanding of Stardust features and class responsibilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-882840545433479769?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/882840545433479769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=882840545433479769&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/882840545433479769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/882840545433479769'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/11/stardust-video-tutorials.html' title='Stardust Video Tutorials!'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4756376647216024803</id><published>2009-10-26T09:31:00.000-07:00</published><updated>2009-10-26T09:39:09.064-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>My Speech on Stardust for PTT Flash Workshop 2009</title><content type='html'>Actually this workshop was held a couple of months ago (Aug 31st to be specific).&lt;br /&gt;&lt;br /&gt;PTT is the most popular bulletin-board system in Taiwan. This workshop was for the PTT Flash forum members and people from the Taiwan RIA industry. I gave an one-hour speech on Stardust for this workshop. And here's the vid: &lt;a href="http://www.youtube.com/watch?v=xla4M9f2j34&amp;amp;feature=PlayList&amp;amp;p=4E8EC9A943F51571"&gt;WATCH VIDEO&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This was a workshop in Taiwan, so I spoke in Chinese :p&lt;br /&gt;I'll start recording video tutorials on Stardust in English as soon as I have time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4756376647216024803?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4756376647216024803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4756376647216024803&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4756376647216024803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4756376647216024803'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/10/my-speech-on-stardust-for-ptt-flash.html' title='My Speech on Stardust for PTT Flash Workshop 2009'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5595138330776149150</id><published>2009-10-22T08:59:00.000-07:00</published><updated>2009-10-22T09:15:28.871-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Papervision3D'/><title type='text'>Stardust Tutorial And Examples by Matt Eley</title><content type='html'>&lt;a href="http://matteley.wordpress.com/"&gt;Matt Eley&lt;/a&gt; has recently written a tutorial and some examples for Stardust!&lt;br /&gt;Thanks a lot, Matt :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://matteley.wordpress.com/2009/10/17/creating-a-simple-particle-effect-using-the-stardust-particle-engine/"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SuCCkY2oXtI/AAAAAAAAAiU/sRu66d2ust0/s320/blurred+smoke.png" alt="" id="BLOGGER_PHOTO_ID_5395455915248344786" border="0" /&gt;&lt;/a&gt;&lt;a href="http://matteley.wordpress.com/2009/10/17/creating-a-simple-particle-effect-using-the-stardust-particle-engine/"&gt;&lt;br /&gt;&lt;br /&gt;View tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Check it out! Matt has written this very detailed tutorial on the nitty-gritty of Stardust. He covered all the things you need to know to build a Stardust particle effect from the ground up, including initializers, actions, emitters, clocks, and renderers. I think reading this tutorial might help learning Stardust even more easily than reading the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt;Stardust Manual&lt;/a&gt;. It's probably because I'm not a native English speaker...oh well, this gives me a rather nice motivation to practice English harder :p&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://matteley.wordpress.com/2009/10/21/stardust-particle-effects-2d-spaceship-demo/"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SuCCkLqWk4I/AAAAAAAAAiM/ADl9eTg4hbM/s320/stardust+ship.png" alt="" id="BLOGGER_PHOTO_ID_5395455911707186050" border="0" /&gt;&lt;/a&gt;&lt;a href="http://matteley.wordpress.com/2009/10/21/stardust-particle-effects-2d-spaceship-demo/"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this example, Matt showed the magic of combining bitmap filters with Stardust, creating this fantastic glowy spaceship thruster effect.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://matteley.wordpress.com/2009/10/21/stardust-particle-effects-x-wing-demo/"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SuCCj4l8TNI/AAAAAAAAAiE/6OnXmZXlIf8/s320/x+wing.png" alt="" id="BLOGGER_PHOTO_ID_5395455906588413138" border="0" /&gt;&lt;/a&gt;&lt;a href="http://matteley.wordpress.com/2009/10/21/stardust-particle-effects-x-wing-demo/"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have to admire Matt for creating this example. He's done a brilliant job on integrating Stardust with Papervision3D, using particle effects to bring 3D Flash into an even higher level!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5595138330776149150?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5595138330776149150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5595138330776149150&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5595138330776149150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5595138330776149150'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/10/stardust-tutorial-and-examples-by-matt.html' title='Stardust Tutorial And Examples by Matt Eley'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SuCCkY2oXtI/AAAAAAAAAiU/sRu66d2ust0/s72-c/blurred+smoke.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8314666802462799943</id><published>2009-10-22T08:22:00.000-07:00</published><updated>2009-11-10T08:22:08.991-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Thinner Builder, Smaller Stardust</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img style="cursor: pointer; width: 320px; height: 101px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SuB5RddAAxI/AAAAAAAAAh8/AI7rIDOSawM/s320/register.png" alt="" id="BLOGGER_PHOTO_ID_5395445694460855058" border="0" /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt;Stardust Manual&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt; (PDF)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I should have done this long time ago.&lt;br /&gt;&lt;br /&gt;As listed in the feature list, Stardust supports XML serialization. The &lt;span style="font-family:courier new;"&gt;XMLBuilder&lt;span style="font-family:arial;"&gt; &lt;/span&gt;&lt;/span&gt;class is in charge of converting a particle system to XML representation and reconstructing a particle system from a give XML representation.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;How does the &lt;span style="font-family:courier new;"&gt;XMLBuilder&lt;/span&gt; class know the mapping from an XML tag's name to an actual Stardust class? The answer is the &lt;span style="font-family:courier new;"&gt;registerClass()&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;registerClasses()&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;registerClassesFromClassPackage()&lt;/span&gt; methods. The XMLBuilder relies on these methods to acquire the knowledge of which XML tag name maps to which actual class.&lt;br /&gt;&lt;br /&gt;These methods have to be called by the programmer: the more classes you wish the builder to build from XML data, the more classes you must register. The more classes you register, the larger the compiled file size, since more classes are linked together.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family:courier new;"&gt;registerClassesFromClassPackage() &lt;/span&gt;method is worth mentioning in particular. Subclasses of the &lt;span style="font-family:courier new;"&gt;ClassPackage&lt;/span&gt; class, which is essentially a collection of classes for convenience, all override the &lt;span style="font-family:courier new;"&gt;populateClasses()&lt;/span&gt; method to populate the &lt;span style="font-family:courier new;"&gt;classes&lt;/span&gt; (an array) property with class references. The &lt;span style="font-family:courier new;"&gt;registerClassesFromClassPackage()&lt;/span&gt; would register all the classes in a ClassPackage object in just one line of code. There are already several build-in class packages at your disposal: &lt;span style="font-family:courier new;"&gt;CommonClassPackage&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;TwoDClassPacakge&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;ThreeDClassPackage&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;ZBClassPackage&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;PV3DClassPackage&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;ND3DClassPackage&lt;/span&gt;. All these class packages provide a &lt;span style="font-family:courier new;"&gt;getInstance()&lt;/span&gt; method to return a singleton object, since it's not necessary to instantiate a collection with a fixed set of elements yourself.&lt;br /&gt;&lt;br /&gt;Class packages are convenient. But please beware: it's very likely that you would not use all the classes in a class package during XML deserialization, thus wasting some file size. It doesn't matter when the file size is of no concern; however, when you are working with a file-size-sensitive project, such as banner, file size becomes critically. In such circumstances, I would highly recommend you register classes one by one through the &lt;span style="font-family:courier new;"&gt;registerClass() &lt;/span&gt;method, just registering the class you would like to use when deserializing from XML data.&lt;br /&gt;&lt;br /&gt;Originally, the &lt;span style="font-family:courier new;"&gt;XMLBuilder&lt;/span&gt; class registers the &lt;span style="font-family:courier new;"&gt;CommonClassPackage&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;TwoDClassPacakge&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;ThreeDClassPackage&lt;/span&gt; by default. I've removed this default action in the latest revision (1.0.110 Beta), which I should have done long time ago.&lt;br /&gt;&lt;br /&gt;You can see this class registering process in action in the 6th step of the XML reconstruction example in the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt;Stardust Manual&lt;/a&gt; on page 41, which I just updated today.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8314666802462799943?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8314666802462799943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8314666802462799943&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8314666802462799943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8314666802462799943'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/10/thinner-builder-smaller-stardust.html' title='Thinner Builder, Smaller Stardust'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SuB5RddAAxI/AAAAAAAAAh8/AI7rIDOSawM/s72-c/register.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6172091832271376041</id><published>2009-10-12T11:20:00.000-07:00</published><updated>2009-11-10T08:19:18.214-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>CJLibrary Java - Client/Server and Signals</title><content type='html'>I chose Java as primary language for my Internet &amp;amp; Multimedia Lab class, and I decided to start the &lt;a href="http://code.google.com/p/cjcat-java/"&gt;CJLibrary Java&lt;/a&gt; project. Eventually, I'll port some useful code from my &lt;a href="http://code.google.com/p/cjlibrarycs4/"&gt;CJLibrary&lt;/a&gt; (for AS3) to CJLibrary Java.&lt;br /&gt;&lt;br /&gt;Here's the &lt;a href="http://cjcat-java.googlecode.com/svn/trunk/docs/index.html"&gt;documentation&lt;/a&gt; for CJLibrary Java.&lt;br /&gt;&lt;br /&gt;Currently the project mainly consists of the &lt;span style="font-family:courier new;"&gt;idv.cjcat.net&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;and the &lt;span style="font-family:courier new;"&gt;i&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dv.cjcat.signals&lt;/span&gt; packages; the former is for client-server connection and the latter is an Observer Pattern framework inspired by Robert Penner's &lt;a href="http://github.com/robertpenner/as3-signals"&gt;AS3 Signals&lt;/a&gt; project.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family:courier new;"&gt;idv.cjcat.net&lt;/span&gt; package encapsulates complex client-server connection handling and exposes a set of user-friendly interface, including the use of the &lt;span style="font-family:courier new;"&gt;idv.cjcat.signals&lt;/span&gt; package.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Here's a quick look at how the &lt;span style="font-family:courier new;"&gt;idv.cjcat.net&lt;/span&gt; package works.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;//creates an EchoServer object and starts the server on port 2266&lt;br /&gt;Sever server = new EchoServer(2266);&lt;br /&gt;server.start();&lt;br /&gt;&lt;br /&gt;//creates two clients that connects to the server&lt;br /&gt;Client client1 = new EchoClient();&lt;br /&gt;Client client2 = new EchoClient();&lt;br /&gt;client1.connect("localhost", 2266);&lt;br /&gt;client2.connect("localhost", 2266);&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Note that the &lt;span style="font-family:courier new;"&gt;Server &lt;/span&gt;and &lt;span style="font-family:courier new;"&gt;Client &lt;/span&gt;classes are both abstract. You have to extend them to create concrete subclasses. The &lt;span style="font-family:courier new;"&gt;createListener()&lt;/span&gt; method is the only method that has to be implemented. In this method you should return your desired &lt;span style="font-family:courier new;"&gt;SocketListener &lt;/span&gt;object, which is also abstract and whose &lt;span style="font-family:courier new;"&gt;mainLoop()&lt;/span&gt; method should be implemented.&lt;br /&gt;&lt;br /&gt;Here's the EchoServer class:&lt;br /&gt;(Sorry for the ugly intending. I'm still unable to get the code highlighter to work properly.)&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class EchoServer extends Server {&lt;br /&gt;public EchoServer(int port) {&lt;br /&gt; super(port);&lt;br /&gt;}&lt;br /&gt;@Override&lt;br /&gt;protected SocketListener createListener() {&lt;br /&gt;  return new EchoSocketListener();&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;As you can see, this concrete class is only overriding the &lt;span style="font-family:courier new;"&gt;createListener()&lt;/span&gt; method to tell this server which socket listener it should use, which listens to socket input.&lt;br /&gt;&lt;br /&gt;The same logic is the same for the &lt;span style="font-family:courier new;"&gt;EchoClient&lt;/span&gt; class:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class EchoClient extends Client {&lt;br /&gt;@Override&lt;br /&gt;protected SocketListener createListener() {&lt;br /&gt;  return new PrinterSocketListener();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now let's take a look at the &lt;span style="font-family:courier new;"&gt;EchoSocketListener&lt;/span&gt;, which sends back, i.e. echoes,  whatever it receives.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class EchoSocketListener extends LazySocketListener {&lt;br /&gt;public EchoSocketListener() {&lt;br /&gt;  onReceive().add(new SignalListener&lt;signal&gt;() {&lt;br /&gt;    @Override&lt;br /&gt;    public void update(Signal signal) {&lt;br /&gt;      getWriter().println(signal.getMessage());&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;}&lt;br /&gt;}&lt;/signal&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;This class extends the &lt;span style="font-family:courier new;"&gt;LasySocketListener &lt;/span&gt;class instead of &lt;span style="font-family:courier new;"&gt;SocketListener&lt;/span&gt;, because the &lt;span style="font-family:courier new;"&gt;LasySocketListener &lt;/span&gt;class further encapsulates the socket IO, providing a &lt;span style="font-family:courier new;"&gt;getReader()&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;getWriter() &lt;/span&gt;accessors to give user an even easier way of socket IO handling.&lt;br /&gt;&lt;br /&gt;This class also demonstrates the usage of the &lt;span style="font-family:courier new;"&gt;idv.cjcat.signals&lt;/span&gt; package.  The &lt;span style="font-family:courier new;"&gt;onReceive()&lt;/span&gt; accessor returns a&lt;span style="font-family:courier new;"&gt; Signaller&lt;signal&gt;&lt;/signal&gt;&lt;/span&gt; object that dispatches signal objects of the &lt;span style="font-family:courier new;"&gt;Signal &lt;/span&gt;class. The &lt;span style="font-family:courier new;"&gt;add()&lt;/span&gt; method adds a listener that listens to signals of the &lt;span style="font-family:courier new;"&gt;Signal &lt;/span&gt;class, therefore the listener must implement the &lt;span style="font-family:courier new;"&gt;SignalListener&lt;signal&gt;&lt;/signal&gt;&lt;/span&gt; interface and implement the &lt;span style="font-family:courier new;"&gt;update(Signal signal)&lt;/span&gt; method. This listener object simply tells the writter to print whatever message the signal is containing, which is the direct message sent over by the other end of the socket.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finally, here's the &lt;span style="font-family:courier new;"&gt;PrinterSocketListener &lt;/span&gt;class for the client, which simply prints out whatever message received.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class PrinterSocketListener extends LazySocketListener {&lt;br /&gt;public PrinterSocketListener() {&lt;br /&gt;  onReceive().add(new SignalListener&lt;signal&gt;() {&lt;br /&gt;    @Override&lt;br /&gt;    public void update(Signal signal) {&lt;br /&gt;      System.out.println("client received: "+ signal.getMessage());&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;}&lt;br /&gt;}&lt;/signal&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now in the main program, the following additional lines of code would cause the two clients to send messages to the server and receive messages that are echoed back.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;//sends messages to the server&lt;br /&gt;client1.send("Hello. I'm client #1.");&lt;br /&gt;client2.send("Hello. I'm client #2.");&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And this is what you'll get from the console output:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;Hello. I'm client #1.&lt;br /&gt;Hello. I'm client #2.&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;These are messages that are echoed back by the server, and the order might be reversed, since the two clients have independent socket listener threads.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6172091832271376041?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6172091832271376041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6172091832271376041&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6172091832271376041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6172091832271376041'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/10/cjlibrary-java-clientserver-and-signals.html' title='CJLibrary Java - Client/Server and Signals'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3748096332805676789</id><published>2009-09-24T09:12:00.001-07:00</published><updated>2009-09-24T09:29:22.240-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Star Fish - A Game That Uses Stardust</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.robotjamgames.com/flash-games/StarFish"&gt;&lt;img style="cursor: pointer; width: 100px; height: 100px;" src="http://www.photonstorm.com/wp-content/uploads/2009/09/starfish-thumbnail-100.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.robotjamgames.com/flash-games/StarFish"&gt;&lt;br /&gt;&lt;br /&gt;Play this game&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.photonstorm.com/"&gt;Richard Davey&lt;/a&gt; created this fantastic game. The gameplay is very smooth, and the graphics is very appealing. The game rule is rather simple: get all the starfishes without hitting other fishes.&lt;br /&gt;&lt;br /&gt;The bubbles in the background is created with &lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust Particle Engine&lt;/a&gt;. The bubble's motion is controlled by a &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html?idv/cjcat/stardust/twoD/actions/Gravity.html&amp;amp;idv/cjcat/stardust/twoD/actions/class-list.html"&gt;Gravity&lt;/a&gt; action and a &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html?idv/cjcat/stardust/twoD/actions/RandomDrift.html&amp;amp;idv/cjcat/stardust/twoD/actions/class-list.html"&gt;RandomDrift&lt;/a&gt; action. When the bubbles hit the stage boundary, they're killed by the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html?idv/cjcat/stardust/twoD/actions/DeathZone.html&amp;amp;idv/cjcat/stardust/twoD/actions/class-list.html"&gt;DeathZone&lt;/a&gt; action with a &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html?idv/cjcat/stardust/twoD/zones/RectZone.html&amp;amp;idv/cjcat/stardust/twoD/zones/class-list.html"&gt;RectZone&lt;/a&gt; as the death zone. Richard also added a little details to the bubbles in the menu scene: the bubbles bounce off the fish upon collision. This is probably achieved by using a &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/idv/cjcat/stardust/twoD/deflectors/CircleDeflector.html"&gt;CircleDeflector&lt;/a&gt; that follows the position of the fish.&lt;br /&gt;&lt;br /&gt;Cute as the fishes may seem, the game is actually kind of hard to play as it gets to later levels, or it's just because I suck at playing games :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3748096332805676789?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3748096332805676789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3748096332805676789&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3748096332805676789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3748096332805676789'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/09/star-fish-game-that-uses-stardust.html' title='Star Fish - A Game That Uses Stardust'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3741085678805013704</id><published>2009-09-23T12:39:00.000-07:00</published><updated>2009-09-23T12:47:43.026-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WonderFL'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Brilliant Fireworks</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wonderfl.net/code/169e23cef8b6902b472d9f3579ead65266d325c7"&gt;&lt;img style="cursor: pointer; width: 150px; height: 195px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/Srp51GLaqTI/AAAAAAAAAh0/4zB-bq2uUO4/s320/FW.png" alt="" id="BLOGGER_PHOTO_ID_5384750257573374258" border="0" /&gt;&lt;/a&gt;&lt;a href="http://wonderfl.net/code/169e23cef8b6902b472d9f3579ead65266d325c7"&gt;&lt;br /&gt;&lt;br /&gt;View SWF and source&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is my entry for the 3rd WonderFL Checkmate Contest.&lt;br /&gt;&lt;br /&gt;What could be better than a fireworks effect to show the power of Stardust?&lt;br /&gt;&lt;br /&gt;I've subclassed an initializer (or spawn action) and an action for each of the four particles: Seed, Streak, Fireworks, and Spark. I've also extended the Renderer class to create a LineRenderer class, taking charge of drawing particle trails.&lt;br /&gt;&lt;br /&gt;I think this is a good example to demonstrate the flexibility and extensibility of Stardust.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3741085678805013704?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3741085678805013704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3741085678805013704&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3741085678805013704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3741085678805013704'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/09/brilliant-fireworks.html' title='Brilliant Fireworks'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/Srp51GLaqTI/AAAAAAAAAh0/4zB-bq2uUO4/s72-c/FW.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5483117156896935347</id><published>2009-09-09T11:42:00.001-07:00</published><updated>2009-09-22T08:36:42.787-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WonderFL'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Now Available on WonderFL</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wonderfl.net/"&gt;&lt;img style="cursor: pointer; width: 230px; height: 170px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/Sqf3Imcm4yI/AAAAAAAAAhs/diawAnGCbJk/s320/wonderfl+stardust.png" alt="" id="BLOGGER_PHOTO_ID_5379540007048897314" border="0" /&gt;&lt;/a&gt;&lt;a href="http://wonderfl.net/"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://wonderfl.net/"&gt;WonderFL homepage&lt;/a&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yep, you're right. Stardust is now available on WonderFL!!&lt;br /&gt;I've created a couple of easy examples. You can check them out &lt;a href="http://wonderfl.net/user/cjcat2266/codes"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Being in a rush, I only created 2D examples.&lt;br /&gt;I'll be working on some 3D examples when I have enough time :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5483117156896935347?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5483117156896935347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5483117156896935347&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5483117156896935347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5483117156896935347'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/09/stardust-now-available-on-wonderfl.html' title='Stardust Now Available on WonderFL'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/Sqf3Imcm4yI/AAAAAAAAAhs/diawAnGCbJk/s72-c/wonderfl+stardust.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-352685726454181568</id><published>2009-09-07T10:12:00.000-07:00</published><updated>2009-09-07T10:22:27.236-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Particle Snapshot Restoration</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/SnapshotRestoration/SnapshotRestoration.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SqU_NeoyqxI/AAAAAAAAAhk/Uj-SGjUzRHc/s320/snapshot+restoration.png" alt="" id="BLOGGER_PHOTO_ID_5378774830758931218" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/SnapshotRestoration/SnapshotRestoration.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click anywhere in the demo to explode particles, and click the "Restore Image" button to see the magic of snapshot restoration!&lt;br /&gt;&lt;br /&gt;I mentioned this "snapshot" restoration stuff on my &lt;a href="http://cjcat.blogspot.com/2009/09/left-out-stardust-template-random.html"&gt;previous blog post&lt;/a&gt;.&lt;br /&gt;This feature is now complete. You can grab it from the SVN repository.&lt;br /&gt;&lt;br /&gt;The logics behind are pretty simple: the Snapshot class stores particle states (i.e. "snapshots") using an internal VO (value object) class, SnapshotData, and the SnapshotRestore class simply uses the easing equations to tween particles back to the previous taken snapshots.&lt;br /&gt;&lt;br /&gt;I've also provided a ParticleRestoreFlag class for you to specify whether you want to restore the positions, rotations, scales, or more than one of these properties of the particles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-352685726454181568?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/352685726454181568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=352685726454181568&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/352685726454181568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/352685726454181568'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/09/particle-snapshot-restoration.html' title='Particle Snapshot Restoration'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SqU_NeoyqxI/AAAAAAAAAhk/Uj-SGjUzRHc/s72-c/snapshot+restoration.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5189072695978493217</id><published>2009-09-04T09:36:00.000-07:00</published><updated>2009-09-04T09:50:32.571-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Left Out Stardust Template: Random</title><content type='html'>&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/FlashDevelop%20templates/"&gt;&lt;img style="cursor: pointer; width: 278px; height: 158px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SqFC2aZm0NI/AAAAAAAAAhc/JESsp_DGHSo/s320/random.png" alt="" id="BLOGGER_PHOTO_ID_5377652932624175314" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Get Stardust templates for FlashDevelop&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Oopsy. I just found out that I've left out a template for the Stardust template pack for FlashDevelop: the Random template. I've added the template and committed it to the SVN repository.&lt;br /&gt;&lt;br /&gt;And for some info on the Stardust current development, I'm now working on a "snapshot" functionality for Stardust, which allows you to take "snapshots" of the current particle states, and then tweening particles back to this state afterwardg. You can optionally choose your restoration to work on position, velocity, rotation, angular velocity, or scale, and you can choose the easing equation at work as well.&lt;br /&gt;&lt;br /&gt;My motivation for this functionality came out of a talk with &lt;a href="http://mark-vann.blogspot.com/"&gt;Mark Vann&lt;/a&gt; from the ActionScript division at &lt;a href="http://medialand.com.tw/"&gt;Medialand&lt;/a&gt;, back in the middle of August. He said he would like to create an effect using Stardust, causing shattered pieces of a bitmap to regroup. It involves no pro coding to create such effect, but he would like to have it done in Stardust; so I'm working on it now, trying to push the limit of Stardust another step further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5189072695978493217?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5189072695978493217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5189072695978493217&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5189072695978493217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5189072695978493217'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/09/left-out-stardust-template-random.html' title='Left Out Stardust Template: Random'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SqFC2aZm0NI/AAAAAAAAAhc/JESsp_DGHSo/s72-c/random.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7190071842537447408</id><published>2009-09-01T11:15:00.001-07:00</published><updated>2009-09-01T11:46:17.626-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Linked List Failure for Stardust</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img style="cursor: pointer; width: 250px; height: 200px;" src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is my second attempt to try using a linked list for particle engine. The first attempt was for Emitter, and this time it's for Stardust.&lt;br /&gt;&lt;br /&gt;Theoretically, a liked list data structure is the best choice for a particle engine. Linked lists are well-known for their efficient removal of arbitrary nodes from the list. There's no way knowing the dying order of particles in a particle list, hence no way knowing the order of particle removal from the list. It seems that using a linked list for a particle engine's particle list is a good idea, but after my experiments, it turned out not to be the case.&lt;br /&gt;&lt;br /&gt;I've tried to use a linked list for Stardust's particle list, and then recompile some of my existing examples. The result showed that the performance didn't improve; actually, it's quite the opposite: the CPU consumption got even higher (approximately 5% higher than the original).&lt;br /&gt;&lt;br /&gt;I'm pretty sure when the number of particles is large enough, linked lists shall yield far better performance than arrays, but for common particle effects and daily uses, the number is simply not that large, thus the result. I got the exact same result from the attempt to use linked lists for Emitter.&lt;br /&gt;&lt;br /&gt;The original array version of Stardust makes use of object pools to improve performance; however, I encountered some difficulty in implementing object pools for the linked list version (yeah, I'm just an amateur programmer). I think the performance gained by  using object pools compensate for not using linked lists. I'll just stick with arrays for Stardust, unless I somehow get motivated to make my third attempt to try linked lists for particle engines (this really is time-consuming).&lt;br /&gt;&lt;br /&gt;If you are interested, I've saved a copy of the linked list version in the SVN repository. &lt;a href="http://stardust-particle-engine.googlecode.com/svn/archive/Stardust%201.0.92%20Beta%20linked%20list%20version%20%28worse%20performance%29.rar"&gt;Click here to download the RAR archive&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7190071842537447408?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7190071842537447408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7190071842537447408&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7190071842537447408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7190071842537447408'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/09/linked-list-failure-for-stardust.html' title='Linked List Failure for Stardust'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6528477578351187837</id><published>2009-08-28T10:09:00.001-07:00</published><updated>2009-08-28T10:14:40.091-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PureMVC'/><title type='text'>PureMVC Painter</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cjcat.googlecode.com/svn/trunk/studies/PureMVC/PureMVCPainter/bin/PureMVCPainter.html"&gt;&lt;img style="cursor: pointer; width: 320px; height: 66px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SpgPSiE97oI/AAAAAAAAAhU/HYV7NpyLUhk/s320/PureMVCPainter.png" alt="" id="BLOGGER_PHOTO_ID_5375062966326390402" border="0" /&gt;&lt;/a&gt;&lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PureMVC/PureMVCPainter/bin/PureMVCPainter.html"&gt;&lt;br /&gt;&lt;br /&gt;View demo&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cjcat.googlecode.com/svn/trunk/studies/PureMVC/PureMVCPainter/"&gt;View source&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Whew...I just finished my very first &lt;a href="http://puremvc.org"&gt;PureMVC&lt;/a&gt; project. It's just a simple painter application, with standard pen, eraser, and clear functions, not appealing at all.&lt;br /&gt;&lt;br /&gt;I've gone through PureMVC classes and documentations a couple of times, but never taken my time to actually try using it to build a complete application. Finally, I've put things together and create this little app. You can take a look in the source files if you're interested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6528477578351187837?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6528477578351187837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6528477578351187837&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6528477578351187837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6528477578351187837'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/puremvc-painter.html' title='PureMVC Painter'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/SpgPSiE97oI/AAAAAAAAAhU/HYV7NpyLUhk/s72-c/PureMVCPainter.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1343804434282673878</id><published>2009-08-28T00:07:00.000-07:00</published><updated>2009-08-28T00:13:11.967-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='FlashDevelop'/><title type='text'>Stardust FlashDevelop Templates</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/FlashDevelop%20templates/"&gt;&lt;img style="cursor: pointer; width: 275px; height: 320px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SpeCtuUQF1I/AAAAAAAAAhM/NINHDYqnVVc/s320/stardust+templates.png" alt="" id="BLOGGER_PHOTO_ID_5374908402328672082" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/FlashDevelop%20templates/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/FlashDevelop%20templates/"&gt;&lt;br /&gt;Get Stardust FlashDevelop templates&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've created a FlashDevleop template pack for Stardust. Now you can extend Stardust at ease without worrying about forgetting which methods to override. The templates include all abstract methods that need to be overridden for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1343804434282673878?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1343804434282673878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1343804434282673878&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1343804434282673878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1343804434282673878'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stardust-flashdevelop-templates.html' title='Stardust FlashDevelop Templates'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SpeCtuUQF1I/AAAAAAAAAhM/NINHDYqnVVc/s72-c/stardust+templates.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8471856860444949300</id><published>2009-08-25T03:31:00.000-07:00</published><updated>2009-08-25T03:35:47.417-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Particle System XML Reconstruction Example</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt;&lt;img style="cursor: pointer; width: 300px; height: 148px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SohW_NZ1uTI/AAAAAAAAAcI/xBllqxD5-p0/s320/SD+manual.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt;&lt;br /&gt;&lt;br /&gt;View manual (PDF)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've added an &lt;span style="font-weight: bold;"&gt;XML Reconstruction&lt;/span&gt; example chapter after the &lt;span style="font-weight: bold;"&gt;Working with XML&lt;/span&gt; chapter. This chapter gives a brief example demonstrating how to reconstruct a Stardust particle system from XML data. And at the end it shows you the power of tweaking parameters of a particle system without recompilation, simply by modifying the external XML file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8471856860444949300?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8471856860444949300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8471856860444949300&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8471856860444949300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8471856860444949300'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/particle-system-xml-reconstruction.html' title='Particle System XML Reconstruction Example'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SohW_NZ1uTI/AAAAAAAAAcI/xBllqxD5-p0/s72-c/SD+manual.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7074462852254386615</id><published>2009-08-24T23:58:00.000-07:00</published><updated>2009-08-25T00:06:09.064-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Blizzard</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Blizzard/Blizzard.html"&gt;&lt;img style="cursor: pointer; width: 155px; height: 155px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SpOLu6b65gI/AAAAAAAAAgk/ECw4YO501Qw/s320/Blizzard.png" alt="" id="BLOGGER_PHOTO_ID_5373792418459739650" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Blizzard/Blizzard.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Believe me, it looks much better in motion.&lt;br /&gt;&lt;br /&gt;This example uses Perlin noise to create turbulence and a UniformField to pull particles toward the bottom left, preventing particles from being "blown" too far away from the intended direction by the turbulence. To add some flavor to the interactivity, I've also created a circle deflector following the mouse cursor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7074462852254386615?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7074462852254386615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7074462852254386615&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7074462852254386615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7074462852254386615'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/blizzard.html' title='Blizzard'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SpOLu6b65gI/AAAAAAAAAgk/ECw4YO501Qw/s72-c/Blizzard.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-450729988081599408</id><published>2009-08-24T20:05:00.001-07:00</published><updated>2009-08-24T20:09:32.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stars &amp; Sprinkles</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/DampedStars/DampedStars.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SpNVEM0wl-I/AAAAAAAAAgc/zizF-E64UJw/s320/sprinkles.png" alt="" id="BLOGGER_PHOTO_ID_5373732311033485282" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/DampedStars/DampedStars.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Sprinkles/Sprinkles.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SpNVDoOO5AI/AAAAAAAAAgU/bDlY7eu5THM/s320/damped+stars.png" alt="" id="BLOGGER_PHOTO_ID_5373732301208216578" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Sprinkles/Sprinkles.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've ported these two basic examples from &lt;a href="http://code.google.com/p/emitter/"&gt;Emitter&lt;/a&gt;.&lt;br /&gt;I think these effects are also very common.&lt;br /&gt;&lt;br /&gt;The first one involves a SinglePoint zone following the mouse cursor, acting as the zone for the Position initializer.&lt;br /&gt;&lt;br /&gt;The second example uses the Damping action to slow stars down, creating a damping effect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-450729988081599408?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/450729988081599408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=450729988081599408&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/450729988081599408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/450729988081599408'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stars-sprinkles.html' title='Stars &amp; Sprinkles'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/SpNVEM0wl-I/AAAAAAAAAgc/zizF-E64UJw/s72-c/sprinkles.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3558878130325446105</id><published>2009-08-24T09:27:00.000-07:00</published><updated>2009-08-24T09:42:41.281-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Example: Drips</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Drips/Drips.html"&gt;&lt;img style="cursor: pointer; width: 159px; height: 159px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SpK_fp5ZQLI/AAAAAAAAAgM/OVBYMH2h-Oo/s320/drips.png" alt="" id="BLOGGER_PHOTO_ID_5373567855949856946" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Drips/Drips.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I saw &lt;a href="http://www.flashandmath.com/flashcs4/rain/"&gt;this Flash &amp;amp; Math&lt;/a&gt;&lt;a href="http://www.flashandmath.com/flashcs4/rain/"&gt; article&lt;/a&gt;, and tried to use Stardust to imitate the dripping &amp;amp; splashing effect :p&lt;br /&gt;&lt;br /&gt;I though I could go back and make some simple Stardust examples unlike the recent fancy ones. After all, we all do need easy examples to help us get started, don't we? So here it is, a very simple drip-and-splash particle effect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3558878130325446105?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3558878130325446105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3558878130325446105&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3558878130325446105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3558878130325446105'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/drips-splashes.html' title='Stardust Example: Drips'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SpK_fp5ZQLI/AAAAAAAAAgM/OVBYMH2h-Oo/s72-c/drips.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8018481332615333923</id><published>2009-08-23T08:08:00.000-07:00</published><updated>2009-08-23T08:14:41.822-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Waypoints</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Waypoints/Waypoints.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SpFborUO-YI/AAAAAAAAAgE/4VaGMDduFJs/s320/waypoints.png" alt="" id="BLOGGER_PHOTO_ID_5373176584810199426" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Waypoints/Waypoints.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've added a new action: FollowWaypoints.&lt;br /&gt;&lt;br /&gt;Used along with the Waypoint class, this action causes particles to follow waypoints in series, creating a path-finding behavior. There's also an option for whether particles loop back to the first waypoint after passing through the last waypoint. A 3D version is available as well: the FollowWaypoints3D class.&lt;br /&gt;&lt;br /&gt;The algorithm used by the FollowWaypoints class was inspired by the Path Finding section in the Steering Behavior chapter of AdvancED ActionScript 3.0 Animation, by &lt;a href="http://www.bit-101.com/blog/"&gt;Keith Peters&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8018481332615333923?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8018481332615333923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8018481332615333923&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8018481332615333923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8018481332615333923'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/waypoints.html' title='Waypoints'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SpFborUO-YI/AAAAAAAAAgE/4VaGMDduFJs/s72-c/waypoints.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4134993145063254762</id><published>2009-08-22T09:48:00.000-07:00</published><updated>2009-08-22T10:01:40.971-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Masked Collision &amp; Turbulent Pixels</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/MaskedCollision/MaskedCollision.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SpAipSLbwZI/AAAAAAAAAf8/BrwCpJi6-wY/s320/masked+collision.png" alt="" id="BLOGGER_PHOTO_ID_5372832448102777234" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/MaskedCollision/MaskedCollision.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/TurbulentPixels/TurbulentPixels.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SpAipJlKT7I/AAAAAAAAAf0/iCjFAwkKy_Q/s320/turbulent+pixels.png" alt="" id="BLOGGER_PHOTO_ID_5372832445794766770" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/TurbulentPixels/TurbulentPixels.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are two more examples for Stardust.&lt;br /&gt;&lt;br /&gt;The first one demonstrates the particle masking feature: each particle is assigned an integer mask, and two particles would only collide against each other if the bitwise-AND of their masks is non-zero. In this example, red particles are given a mask of (1 | 2 | 4), green ones 2, and blue ones 4. The result is that each particle collides with others of the same color; moreover, red particles also collide with particles of the other two colors. You can notice that a green particle does not collide with a blue particle, since the bitwise-AND of 2 and 4 is zero.&lt;br /&gt;&lt;br /&gt;The second example shows the PixelRenderer class in action. This class renders pixels into a BitmapData object. The turbulence effect is created using Perlin noise along with a BitmapField object used as a gravity field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4134993145063254762?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4134993145063254762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4134993145063254762&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4134993145063254762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4134993145063254762'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/masked-collision-turbulent-pixels.html' title='Masked Collision &amp; Turbulent Pixels'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SpAipSLbwZI/AAAAAAAAAf8/BrwCpJi6-wY/s72-c/masked+collision.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-24633674641325886</id><published>2009-08-21T11:53:00.001-07:00</published><updated>2009-08-22T02:51:25.619-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><title type='text'>ZedBox Carousel Effect with Depth-of-Field</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://event.taiwanmobile.com/android/"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/So7tQhMBvUI/AAAAAAAAAfE/P8K0sZYzSbI/s320/ZedBox+Android+Carousel+with+DOF.png" alt="" id="BLOGGER_PHOTO_ID_5372492273542085954" border="0" /&gt;&lt;/a&gt;&lt;a href="http://event.taiwanmobile.com/android/"&gt;&lt;br /&gt;&lt;br /&gt;Launch Site&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/zedbox/"&gt;ZedBox project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://milkmidi.blogspot.com/"&gt;Milkmidi&lt;/a&gt; at &lt;a href="http://medialand.com.tw/"&gt;Medialand&lt;/a&gt; created this carousel effect using ZedBox, my 3D billboard engine.&lt;br /&gt;He also used the BlurZFilter class to create a depth-of-field effect.&lt;br /&gt;&lt;br /&gt;Using ZedBox, to create this carousel effect simply involves placing objects into a parent container, and tweaking the parent container's rotationY property.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-24633674641325886?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/24633674641325886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=24633674641325886&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/24633674641325886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/24633674641325886'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/zedbox-carousel-effect-with-depth-of.html' title='ZedBox Carousel Effect with Depth-of-Field'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/So7tQhMBvUI/AAAAAAAAAfE/P8K0sZYzSbI/s72-c/ZedBox+Android+Carousel+with+DOF.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8325361736258471730</id><published>2009-08-18T23:33:00.000-07:00</published><updated>2009-08-18T23:51:35.437-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Flint'/><title type='text'>Pixel Star Fireworks</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/StarFireworks/StarFireworks.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SoudDNyvwPI/AAAAAAAAAcY/q9NLNjw78eY/s320/pixel+star.png" alt="" id="BLOGGER_PHOTO_ID_5371559659137122546" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/StarFireworks/StarFireworks.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've added a Color initializer and PixelRenderer renderer.&lt;br /&gt;As the renderer's class name suggests, it draws pixels into a BitmapData object.&lt;br /&gt;This example was inspired by &lt;a href="http://flintparticles.org/examples/logo-firework"&gt;this Flint example&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8325361736258471730?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8325361736258471730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8325361736258471730&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8325361736258471730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8325361736258471730'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/pixel-star-fireworks.html' title='Pixel Star Fireworks'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4-LtXwX7Yuo/SoudDNyvwPI/AAAAAAAAAcY/q9NLNjw78eY/s72-c/pixel+star.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7864012421112517993</id><published>2009-08-17T01:33:00.000-07:00</published><updated>2009-08-17T07:19:57.506-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Class Inheritance Diagram for Kids</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/diagrams/bin/Class%20Inheritance%20Diagram.png"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SokWGc6r_eI/AAAAAAAAAcQ/5xbInLb3YVw/s320/Stardust+Class+Inheritance+Diagram.png" alt="" id="BLOGGER_PHOTO_ID_5370848330713398754" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/diagrams/bin/Class%20Inheritance%20Diagram.png"&gt;&lt;br /&gt;&lt;br /&gt;View diagram&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's it. I've had enough of UML class diagrams.&lt;br /&gt;They look professiona, but are visually...uh...tasteless.&lt;br /&gt;So I decided to create class diagrams of my own style for &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt;the Stardust manual&lt;/a&gt;.&lt;br /&gt;This is the class inheritance diagram in the manual.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7864012421112517993?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7864012421112517993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7864012421112517993&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7864012421112517993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7864012421112517993'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stardust-class-inheritance-diagram-for.html' title='Stardust Class Inheritance Diagram for Kids'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SokWGc6r_eI/AAAAAAAAAcQ/5xbInLb3YVw/s72-c/Stardust+Class+Inheritance+Diagram.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1339669853099711692</id><published>2009-08-16T11:58:00.000-07:00</published><updated>2009-08-16T12:01:08.269-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Manual</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt;&lt;img style="cursor: pointer; width: 300px; height: 148px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SohW_NZ1uTI/AAAAAAAAAcI/xBllqxD5-p0/s320/SD+manual.png" alt="" id="BLOGGER_PHOTO_ID_5370638199569103154" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/manual/Stardust%20Particle%20Engine%20Manual.pdf"&gt;&lt;br /&gt;&lt;br /&gt;View manual (PDF)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Behold! It's the Stardust manual!&lt;br /&gt;Although it's still not complete, it has already covered the features and class responsibilites of the engine.&lt;br /&gt;And it also includes a minimalistic example at the end. I'm sure this will help understand the basic usage and workflow of Stardust.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1339669853099711692?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1339669853099711692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1339669853099711692&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1339669853099711692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1339669853099711692'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stardust-manual.html' title='Stardust Manual'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SohW_NZ1uTI/AAAAAAAAAcI/xBllqxD5-p0/s72-c/SD+manual.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3752042881916210938</id><published>2009-08-13T21:02:00.000-07:00</published><updated>2009-08-14T02:01:57.754-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Particle Engine Goes Beta</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img style="cursor: pointer; width: 350px; height: 280px;" src="http://cjcat2266.googlepages.com/StardustLogoMediumShadowed.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yes, Stardust goest beta!&lt;br /&gt;There are already a bunch of examples to watch, source files provided.&lt;br /&gt;Check them out on the project homepage or &lt;a href="http://stardust-particle-engine.googlecode.com/files/Stardust%201.0.44%20Beta%20examples.rar"&gt;download them&lt;/a&gt; directly.&lt;br /&gt;I've also added a very abstract class diagram.&lt;br /&gt;I'll make more diagrams and tutorials to help you understand and use Stardust :)&lt;br /&gt;&lt;br /&gt;Here's the class diagram.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/diagrams/bin/class%20diagram.png"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SoUn68nF3lI/AAAAAAAAAbw/J0AJsVd22kU/s320/class+diagram.png" alt="" id="BLOGGER_PHOTO_ID_5369742024365170258" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/diagrams/bin/class%20diagram.png"&gt;&lt;br /&gt;&lt;br /&gt;View Stardust class diagram&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3752042881916210938?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3752042881916210938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3752042881916210938&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3752042881916210938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3752042881916210938'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stardust-particle-engine-goes-beta.html' title='Stardust Particle Engine Goes Beta'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SoUn68nF3lI/AAAAAAAAAbw/J0AJsVd22kU/s72-c/class+diagram.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1210474472596792487</id><published>2009-08-11T09:04:00.000-07:00</published><updated>2009-08-11T09:09:22.161-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Pink Triangles</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Stardust%203D/OrientedBillboards/OrientedBillboards.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SoGWm0aZgII/AAAAAAAAAa8/3Fj8VUHuEH4/s320/pink+triangles.png" alt="" id="BLOGGER_PHOTO_ID_5368737824450904194" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Stardust%203D/OrientedBillboards/OrientedBillboards.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a test for the CalculateScreenVelocity BillboardOriented actions for Stardust 3D (the Stardust native 3D engine). The CalculateScreenVelocity action projects a particle's velocity vector in 3D space onto the screen, yielding a 2D vector. The BillboardOriented action then align 2D display objects' rotation values to these 2D vectors.&lt;br /&gt;You can pause the example by pressing the "Pause" button at the bottom left. The simulation will stop, but the particles will still align to their projected 2D velocities as you rotate the camera.&lt;br /&gt;&lt;br /&gt;The source files for this example can be found &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1210474472596792487?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1210474472596792487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1210474472596792487&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1210474472596792487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1210474472596792487'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/pink-triangles.html' title='Pink Triangles'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SoGWm0aZgII/AAAAAAAAAa8/3Fj8VUHuEH4/s72-c/pink+triangles.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7337168805677961407</id><published>2009-08-10T23:18:00.001-07:00</published><updated>2009-08-11T09:09:40.803-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Papervision3D'/><category scheme='http://www.blogger.com/atom/ns#' term='ZContainer'/><category scheme='http://www.blogger.com/atom/ns#' term='ND3D'/><title type='text'>Stardust Sakura 3D</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Stardust%203D/Sakura/Sakura.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SoENRcBgPVI/AAAAAAAAAa0/9ZGDE6_qlNs/s320/sakura.png" alt="" id="BLOGGER_PHOTO_ID_5368586824033779026" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Stardust%203D/Sakura/Sakura.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After the Sakura examples for ZContainer and Emitter, this is the third generation of Sakura example, for Stardust! It's seems that Sakura demo is a must for all my engines now.&lt;br /&gt;I didn't use the ZedBox, Papervision3D, or ND3D extension. Stardust has a native 3D rendering engine.&lt;br /&gt;&lt;br /&gt;You can press the "Pause" button at the bottom left to pause the petals, and rotate around the camera to look around. Enjoy the bullet time :p&lt;br /&gt;&lt;br /&gt;The source files for this example can be found &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7337168805677961407?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7337168805677961407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7337168805677961407&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7337168805677961407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7337168805677961407'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stardust-sakura-3d.html' title='Stardust Sakura 3D'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4-LtXwX7Yuo/SoENRcBgPVI/AAAAAAAAAa0/9ZGDE6_qlNs/s72-c/sakura.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7528911501827795457</id><published>2009-08-09T22:03:00.001-07:00</published><updated>2009-08-11T09:09:43.814-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Flint'/><title type='text'>Exploding Image</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/ExplodingImage/ExplodingImage.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/Sn-qP2fQS9I/AAAAAAAAAas/SyhlrxnDtiA/s320/exploding+image.png" alt="" id="BLOGGER_PHOTO_ID_5368196470150286290" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/ExplodingImage/ExplodingImage.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looks familiar? Yes, it's imitating &lt;a href="http://flintparticles.org/examples/explode-image"&gt;this example&lt;/a&gt; from &lt;a href="http://flintparticles.org/"&gt;Flint Paritcle System&lt;/a&gt;.&lt;br /&gt;The only difference is that Flint uses a static method defined in the Particle2DUtils class to create particles from a bitmap, and Stardust uses the BitmapBurster class, a subclass of Burster, to do the same thing.&lt;br /&gt;&lt;br /&gt;The source files for this example can be found &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7528911501827795457?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7528911501827795457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7528911501827795457&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7528911501827795457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7528911501827795457'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/exploding-image.html' title='Exploding Image'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4-LtXwX7Yuo/Sn-qP2fQS9I/AAAAAAAAAas/SyhlrxnDtiA/s72-c/exploding+image.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5756669984329635963</id><published>2009-08-09T05:32:00.000-07:00</published><updated>2009-08-11T09:09:46.876-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Uniburst Is Back in Stardust!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/PointUniburst/PointUniburst.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/Sn7COkKcN7I/AAAAAAAAAak/SPLy4Ekwd10/s320/point+uniburst.png" alt="" id="BLOGGER_PHOTO_ID_5367941361353635762" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/PointUniburst/PointUniburst.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As a left-out feature from the upgrade of Emitter 1.0 to 2.0, Uniburst is back in Stardust!&lt;br /&gt;Now there's a Burster class whose sole responsibility is to allow user to create custom particles with full control over the particle properties, which means you can create particles that shows randomness (which is pretty much what Stardust is doing) or particles whose properties conform to a regular, uniform pattern. The latter is what Burster is mainly meant for. So far there's only one subclass, the PointUniburster class. It works just like the uniburst() method of the PointSource in Emitter 1.0: it bursts out particles spreading out at uniformly distributed angles. I'll make more Burster subclasses in the future.&lt;br /&gt;&lt;br /&gt;The source files for the example can be found &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5756669984329635963?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5756669984329635963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5756669984329635963&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5756669984329635963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5756669984329635963'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/uniburst-is-back-in-stardust.html' title='Uniburst Is Back in Stardust!'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/Sn7COkKcN7I/AAAAAAAAAak/SPLy4Ekwd10/s72-c/point+uniburst.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6448757429379585932</id><published>2009-08-08T00:09:00.001-07:00</published><updated>2009-08-08T00:42:09.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Example Screenshot Wall</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/stardust-particle-engine/"&gt;&lt;img style="cursor: pointer; width: 300px; height: 240px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/Sn0kxdOSPSI/AAAAAAAAAac/vKp5Vy-EyFE/s320/stardust+example+tiles.png" alt="" id="BLOGGER_PHOTO_ID_5367486762972232994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Right on! This "wall of examples" sure looks attractive, doesn't it? And I'll add more tiles to it!&lt;br /&gt;Things to do: complete documentation and official tutorial website.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6448757429379585932?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6448757429379585932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6448757429379585932&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6448757429379585932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6448757429379585932'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stardust-examples-screenshots-on.html' title='Stardust Example Screenshot Wall'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/Sn0kxdOSPSI/AAAAAAAAAac/vKp5Vy-EyFE/s72-c/stardust+example+tiles.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6469361839793533286</id><published>2009-08-08T00:02:00.001-07:00</published><updated>2009-08-08T00:44:14.462-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Two More Stardust Examples</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Fireworks/Fireworks.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/Sn0jEZ7on1I/AAAAAAAAAaU/IbIpXEFqpwc/s320/fireworks.png" alt="" id="BLOGGER_PHOTO_ID_5367484889482960722" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Fireworks/Fireworks.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/ZedBox/DepthOfField/DepthOfField.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/Sn0jEPWyhlI/AAAAAAAAAaM/CVtk86IxS-U/s320/DOF.png" alt="" id="BLOGGER_PHOTO_ID_5367484886644065874" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/ZedBox/DepthOfField/DepthOfField.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the best features of Stardust is the Spawn action (and yes, there's a 3D version, I'll make an example of it as soon as possible), and I made a fireworks example out of it.&lt;br /&gt;&lt;br /&gt;Also, the ZedBox extension is now complete, so I made use of the BlurZFilter provided by ZedBox to create the depth-of-field example.&lt;br /&gt;If you are using a debug Flash Player, you'll notice that there're some errors being thrown, something concerning FocusManager class in the fl.* package. This happens when you use Flash UI components with ZedBox. I have no idea how this happens, but you can simply ignore the error since it has no impact on the Flash movie.&lt;br /&gt;&lt;br /&gt;The source files for these examples can be found &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6469361839793533286?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6469361839793533286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6469361839793533286&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6469361839793533286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6469361839793533286'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/two-more-stardust-examples.html' title='Two More Stardust Examples'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4-LtXwX7Yuo/Sn0jEZ7on1I/AAAAAAAAAaU/IbIpXEFqpwc/s72-c/fireworks.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-9207336766027459279</id><published>2009-08-07T08:06:00.000-07:00</published><updated>2009-08-07T08:15:08.846-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Documentation</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SnxDIFUFDFI/AAAAAAAAAaE/QzV8p2vImNc/s320/stardust+docs.png" alt="" id="BLOGGER_PHOTO_ID_5367238662063197266" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/docs/index.html"&gt;&lt;br /&gt;&lt;br /&gt;View Documentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, the first documentation of Stardust has come out. Although it's not fully documented, it's there, and you can still browse the available classes, proeprties, and methods much easier than directly staring at AS source files. Whew, there are in total 214 classes so far - the biggest project I've ever done.&lt;br /&gt;&lt;br /&gt;I'd had some problems dealing with ASDoc. The "-doc-sources" and "-exclude-dependencies" options cannot be used together, which means I had two options: either including all related classes in the documentation (ZedBox, Papervision3D, and ND3D), or using the "-exclude-classes" option to filter out classes ONE BY ONE (there are hundreds of unwanted classes). Fortunately, later on I discovered that using compiled SWC libraries as sources, the classes in the SWCs would not be included in the final documentation by ASDoc. ZedBox and Papervision3D already had compiled SWCs provided, so I compiled the SWC file for ND3D my self using the compc.exe compiler shipping within Flex SDK.&lt;br /&gt;&lt;br /&gt;After hours of struggle, I've finally got everything right and here's the documentation. Enjoy :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-9207336766027459279?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/9207336766027459279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=9207336766027459279&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/9207336766027459279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/9207336766027459279'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stardust-documentation.html' title='Stardust Documentation'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SnxDIFUFDFI/AAAAAAAAAaE/QzV8p2vImNc/s72-c/stardust+docs.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8891167932327518823</id><published>2009-08-07T02:40:00.000-07:00</published><updated>2009-08-07T02:45:49.621-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Turbulent Blast</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/TurbulentBlast/TurbulentBlast.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/Snv2rE_OtJI/AAAAAAAAAZ8/epFhl2_2oq8/s320/turbulent+blast.png" alt="" id="BLOGGER_PHOTO_ID_5367154600875832466" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/TurbulentBlast/TurbulentBlast.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After some experiment with the BitmapField class, I made this turbulent fiery thing. It looks cool, and the performance seems to be pretty decent.&lt;br /&gt;&lt;br /&gt;The source files for this example can be found &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8891167932327518823?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8891167932327518823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8891167932327518823&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8891167932327518823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8891167932327518823'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/turbulent-blast.html' title='Turbulent Blast'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/Snv2rE_OtJI/AAAAAAAAAZ8/epFhl2_2oq8/s72-c/turbulent+blast.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7443226272531975825</id><published>2009-08-07T02:07:00.000-07:00</published><updated>2009-08-07T02:45:23.641-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Text Spark</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/TextSpark/TextSpark.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SnvvGrtZW8I/AAAAAAAAAZ0/vY1A_qYGi0w/s320/text+spark.png" alt="" id="BLOGGER_PHOTO_ID_5367146279033461698" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/TextSpark/TextSpark.html"&gt;&lt;br /&gt;&lt;br /&gt;View Example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;GMG (sorry I don't know your real name) asked me if it's possible to use Stardust to create effects like &lt;a href="http://bitfade.com/swf/intro.swf"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The answer is yes.&lt;br /&gt;Now Stardust supports fields and zones based on bitmaps, so you can make particles spawn at positions corresponding to non-transparent areas of a bitmap.&lt;br /&gt;&lt;br /&gt;The source files for this example can be found &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7443226272531975825?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7443226272531975825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7443226272531975825&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7443226272531975825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7443226272531975825'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/text-spark.html' title='Text Spark'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4-LtXwX7Yuo/SnvvGrtZW8I/AAAAAAAAAZ0/vY1A_qYGi0w/s72-c/text+spark.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7218052779754371329</id><published>2009-08-06T23:16:00.000-07:00</published><updated>2009-08-07T02:45:20.052-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Bitmap Turbulence</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Turbulence/Turbulence.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SnvG-D72U1I/AAAAAAAAAZs/fyfpuWgtJVY/s320/arrows.png" alt="" id="BLOGGER_PHOTO_ID_5367102150452597586" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Turbulence/Turbulence.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Inspired by the algorithm from &lt;a href="http://wonderfl.net/code/542dd55e1b151b8eebe422304cf7ee499fad635d"&gt;ClockMaker's work&lt;/a&gt;, I tried to replicate the same effect with Stardust, and this is what turned out. The main idea is very simple: prerendering 360 pieces of bitmap data of a display object rotated at 0~359 degrees. All the visible particles are Bitmap objects, and they change their bitmap data according to their rotation values, each picking up a bitmap data from the 360 prerendered ones.&lt;br /&gt;&lt;br /&gt;Simple, but produces much better performance than using vector graphics alone.&lt;br /&gt;&lt;br /&gt;The source files for this example can be found &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7218052779754371329?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7218052779754371329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7218052779754371329&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7218052779754371329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7218052779754371329'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/bitmap-turbulence.html' title='Bitmap Turbulence'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SnvG-D72U1I/AAAAAAAAAZs/fyfpuWgtJVY/s72-c/arrows.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3061014879015590461</id><published>2009-08-04T10:21:00.001-07:00</published><updated>2009-08-04T10:30:33.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Papervision3D'/><category scheme='http://www.blogger.com/atom/ns#' term='ND3D'/><title type='text'>Stardust ND3D Extension</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.nulldesign.de/nd3d-as3-3d-engine/"&gt;&lt;img style="cursor: pointer; width: 336px; height: 195px;" src="http://www.nulldesign.de/wp-content/uploads/2009/02/nd3d_teaser.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.nulldesign.de/nd3d-as3-3d-engine/"&gt;&lt;br /&gt;&lt;br /&gt;ND3D Official Homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yesterday I mailed Lars, the author of the light-weight 3D engine, ND3D, asking him if it's okay to include an ND3D extension in Stardust, and he agreed. Hence, now I'm working on the ND3D extemsion for Stardst. As soon as I finish all of the four Stardust 3D extensions - Stardst native 3D, ZedBox, Papervision3D, and ND3D - I'll move on to create more demos and examples.&lt;br /&gt;&lt;br /&gt;Stardust is near its completion. Cheers!&lt;br /&gt;&lt;br /&gt;P.S. I'm also under the pressure of the upcoming PTT Flash forum workshop this month. I said I would demonstrate Stardust in the workshop (the COMPLETE Stardust of course) and I WILL do what I promised.&lt;br /&gt;(PTT is the biggest BBS site in Taiwan)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3061014879015590461?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3061014879015590461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3061014879015590461&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3061014879015590461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3061014879015590461'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/08/stardust-nd3d-extension.html' title='Stardust ND3D Extension'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1904076864266278487</id><published>2009-07-30T09:53:00.001-07:00</published><updated>2009-07-30T10:15:04.694-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Oriented3D &amp; Collide3D</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Papervision3D/OrientedCones/OrientedCones.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SnHQFFMQQYI/AAAAAAAAAZk/smgIVb8Y6ps/s320/oriented+cones.png" alt="" id="BLOGGER_PHOTO_ID_5364297416886468994" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Papervision3D/OrientedCones/OrientedCones.html"&gt;&lt;br /&gt;&lt;br /&gt;View demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Papervision3D/CollidingCubes/CollidingCubes.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SnHQE8WO36I/AAAAAAAAAZc/pLP4iLyjuF4/s320/colliding+cubes.png" alt="" id="BLOGGER_PHOTO_ID_5364297414512402338" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Papervision3D/CollidingCubes/CollidingCubes.html"&gt;&lt;br /&gt;&lt;br /&gt;View demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Two important classes for the Stardust 3D version, Oriented3D and Collide3D, are complete. As you can see, the Oriented3D class aligns the 3D objects directoin to their velocities, and the Collide3D class handles what it name suggests, 3D collision.&lt;br /&gt;&lt;br /&gt;The source code for these two examples can be found along with th other examples at the &lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;Stardust example &lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/"&gt;SVN repository&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1904076864266278487?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1904076864266278487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1904076864266278487&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1904076864266278487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1904076864266278487'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/07/oriented3d-collide3d.html' title='Oriented3D &amp; Collide3D'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SnHQFFMQQYI/AAAAAAAAAZk/smgIVb8Y6ps/s72-c/oriented+cones.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6290921573181557172</id><published>2009-07-29T21:29:00.000-07:00</published><updated>2009-07-30T09:53:10.284-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><category scheme='http://www.blogger.com/atom/ns#' term='Papervision3D'/><title type='text'>Stardust Papervision3D Extension Demos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Papervision3D/CubedStars/CubedStars.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SnEypB5JisI/AAAAAAAAAZU/mD1HTLKX6as/s320/cubed+stars.png" alt="" id="BLOGGER_PHOTO_ID_5364124311639132866" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Papervision3D/CubedStars/CubedStars.html"&gt;&lt;br /&gt;&lt;br /&gt;View demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Papervision3D/DisplayObject3DParticles/DisplayObject3DParticles.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SnEyo3CElSI/AAAAAAAAAZM/EAiCi5jcrtE/s320/cubes.png" alt="" id="BLOGGER_PHOTO_ID_5364124308723766562" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/3D/Papervision3D/DisplayObject3DParticles/DisplayObject3DParticles.html"&gt;&lt;br /&gt;&lt;br /&gt;View demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are two &lt;a href="http://code.google.com/p/stardust-particle-engine/"&gt;Stardust&lt;/a&gt; &lt;a href="http://code.google.com/p/papervision3d"&gt;Papervision3D&lt;/a&gt; extendsion demos. This extension supports both billboard and DisplayObject3D particles.&lt;br /&gt;&lt;br /&gt;The basic initializers and actions for 3D particles are complete, including Position3D, Velocity3D, Rotation3D, Omega3D, Move3D, Spin3D. Common initializers and actions also work on 3D particles, such as DeathLife, Alpha, Scale, AlphaCurve, and ScaleCurve. I'll go on finishing the other 3D initializers and actions, and working on the &lt;a href="http://code.google.com/p/zedbox/"&gt;ZedBox&lt;/a&gt; extension. I'm also thinking about developing an &lt;a href="http://www.nulldesign.de/nd3d-as3-3d-engine/"&gt;ND3D&lt;/a&gt; extension.&lt;br /&gt;&lt;br /&gt;There seems to be some memory leak issues with DisplayObject3D. Only the DisplayObject3D demo continues to eat up memory without releasing it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6290921573181557172?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6290921573181557172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6290921573181557172&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6290921573181557172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6290921573181557172'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/07/stardust-papervision3d-extension-demos.html' title='Stardust Papervision3D Extension Demos'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4-LtXwX7Yuo/SnEypB5JisI/AAAAAAAAAZU/mD1HTLKX6as/s72-c/cubed+stars.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4624762117065033730</id><published>2009-07-28T08:11:00.001-07:00</published><updated>2009-07-28T08:15:12.145-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Illustrator'/><category scheme='http://www.blogger.com/atom/ns#' term='Bunnies'/><title type='text'>Bunny Republic</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cjcat2266.deviantart.com/art/Bunny-Republic-Flags-131207421"&gt;&lt;img style="cursor: pointer; width: 300px; height: 287px;" src="http://th08.deviantart.net/fs48/300W/f/2009/209/a/2/Bunny_Republic_Flags_by_cjcat2266.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://cjcat2266.deviantart.com/art/Bunny-Republic-Flags-131207421"&gt;&lt;br /&gt;&lt;br /&gt;View full image&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's my third Illustrator class, and this is what I drew in during the class. The teacher taught us how to use the mesh envelope distortion tool and wanted us to draw a flag in the wind. Other people used either Taiwan's or U.S.'s flag; I decided to do something different: I used the Bunny Republic's flag instead.&lt;br /&gt;&lt;br /&gt;Not bad for a person who has only finished three classes, huh?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4624762117065033730?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4624762117065033730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4624762117065033730&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4624762117065033730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4624762117065033730'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/07/bunny-republic.html' title='Bunny Republic'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4072956111940347439</id><published>2009-07-27T08:20:00.000-07:00</published><updated>2009-07-27T08:48:50.141-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Sneak Peek Examples</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Multisource/Multisource.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/Sm3F90U4LOI/AAAAAAAAAYU/a6YP4UapBe0/s320/multisource.png" alt="" id="BLOGGER_PHOTO_ID_5363160397077032162" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/Multisource/Multisource.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/TrailSparks/TrailSparks.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/Sm3F-BLEGXI/AAAAAAAAAYc/E2gjCBofdYU/s320/trailsparks.png" alt="" id="BLOGGER_PHOTO_ID_5363160400525531506" border="0" /&gt;&lt;/a&gt;&lt;a href="http://stardust-particle-engine.googlecode.com/svn/trunk/examples/2D/TrailSparks/TrailSparks.html"&gt;&lt;br /&gt;&lt;br /&gt;View example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've made two sneak peek examples for my currently working-in-progress particle engine, Stardust. The first one demonstrates the support for multiple particle sources as in Emitter, and the second one shows the new ScaleCurve class that essentially does what the initScale, finalScale, scaleGrowRange, and scaleDecayRange properties do in Emitter. Stardust completely encompasses all Emitter features, and supports a lot more.&lt;br /&gt;&lt;br /&gt;Note that in both examples, there's that "Show XML" button. Click it and it'll show the complete XML representation of the system. Yes, Stardust supports generation of XML representation and parsing of existing XML data for reconstruction of a system. The XML workflow is much easier than in Emitter. I'm very happy about this.&lt;br /&gt;&lt;br /&gt;Oh, and here's a good news: the 2D part of Stardust is now complete. Now I'll move on to the Papervision3D and ZedBox extensions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4072956111940347439?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4072956111940347439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4072956111940347439&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4072956111940347439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4072956111940347439'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/07/stardust-sneak-peek-examples.html' title='Stardust Sneak Peek Examples'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/Sm3F90U4LOI/AAAAAAAAAYU/a6YP4UapBe0/s72-c/multisource.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5329728652881430101</id><published>2009-07-20T09:57:00.000-07:00</published><updated>2009-07-20T10:16:52.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stardust'/><title type='text'>Stardust Particle Engine Logo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SmSiPJQZWxI/AAAAAAAAAX8/ZyXoNBfwXDs/s1600-h/Stardust+logo+medium+shadowed.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 256px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SmSiPJQZWxI/AAAAAAAAAX8/ZyXoNBfwXDs/s320/Stardust+logo+medium+shadowed.png" alt="" id="BLOGGER_PHOTO_ID_5360587837544160018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've decided to develop a whole new particle engine from scratch. It's called Stardust, and that's also the mascot bunny's name.&lt;br /&gt;&lt;br /&gt;I've tried something different for my engine this time: designing a mascot character for it. I hope this will bring the users closer to the engine. Since there's a solid character image, people may visualize the character in mind when thinking of the engine.&lt;br /&gt;&lt;br /&gt;So far the engine's 2D functionality is complete. Now I'm working on the XML and 3D parts. After the engine is finished and a full tutorial &amp;amp; docmentation are ready, I'll bring this engine into public.&lt;br /&gt;&lt;br /&gt;The class structure of Stardust is inspired by &lt;a href="http://flintparticles.org/"&gt;Flint Particle System&lt;/a&gt;. Stardust is designed with flexibility in mind: users can easily extend Stardust to create a custom branch. I'll complete the 3D extension that supports ZedBox and Papervision3D before the initial release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5329728652881430101?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5329728652881430101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5329728652881430101&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5329728652881430101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5329728652881430101'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/07/stardust-particle-engine-logo.html' title='Stardust Particle Engine Logo'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SmSiPJQZWxI/AAAAAAAAAX8/ZyXoNBfwXDs/s72-c/Stardust+logo+medium+shadowed.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1439195979738148505</id><published>2009-07-06T06:16:00.000-07:00</published><updated>2009-07-06T08:34:30.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><category scheme='http://www.blogger.com/atom/ns#' term='CJ'/><title type='text'>The Ray Monster</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://medialand.com.tw/blog/article.asp?id=1054"&gt;&lt;img style="cursor: pointer; width: 300px; height: 170px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SlH5bddEzsI/AAAAAAAAAX0/u21OBQHoKfE/s320/raymonster.PNG" alt="" id="BLOGGER_PHOTO_ID_5355335682078592706" border="0" /&gt;&lt;/a&gt;&lt;a href="http://medialand.com.tw/blog/article.asp?id=1054"&gt;&lt;br /&gt;&lt;br /&gt;View Flash clip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We interns at &lt;a href="http://medialand.com.tw/"&gt;Medialand&lt;/a&gt; are required to write internship diary everyday.&lt;br /&gt;And we have to create some sort of "enter our blogs to view our diary" thing, so they can post it on their official blog.&lt;br /&gt;&lt;br /&gt;Previously, Medialand had never had ActionScript programmer interns. Their links to interns' blogs were just static images. Being their first ActionScript intern, I decided make a difference: a Flash clip.&lt;br /&gt;After some discussion, we decided to use the theme "Medialand intern rangers V.S. The Ray Monster". FYI, Ray is our CEO.&lt;br /&gt;The subtitle below the logo says "You think we're just here for internship?"&lt;br /&gt;&lt;br /&gt;The design interns did the character design, and I did the animation, special effects, and interaction programming.&lt;br /&gt;By the way, the white radiation background was created using my particle engine &lt;a href="http://code.google.com/p/emitter/"&gt;Emitter&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1439195979738148505?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1439195979738148505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1439195979738148505&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1439195979738148505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1439195979738148505'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/07/ray-monster.html' title='The Ray Monster'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4-LtXwX7Yuo/SlH5bddEzsI/AAAAAAAAAX0/u21OBQHoKfE/s72-c/raymonster.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6976340960919257270</id><published>2009-07-03T08:35:00.000-07:00</published><updated>2009-07-03T09:09:33.682-07:00</updated><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='CJ'/><title type='text'>CJ's Internship at Medialand</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://medialand.com.tw/"&gt;&lt;img style="cursor: pointer; width: 175px; height: 61px;" src="http://medialand.com.tw/images/logo.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've got an ActionScript programmer internship at &lt;a href="http://medialand.com.tw/"&gt;Medialand&lt;/a&gt;, which is a company mainly providing RIA solutions for internet promotion. The intern ship will last two month, from July 1st to August 31th. They require us interns to write an internship diary everyday on a blog, so I've created a new blog for that: &lt;a href="http://cjatmedialand.blogspot.com/"&gt;CJ's Internship at Medialand&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Medialand is an easy workplace. People here are nice, and the environment is pretty comfy. I guess I'll have a nice time having internship here during my summer vacation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6976340960919257270?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6976340960919257270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6976340960919257270&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6976340960919257270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6976340960919257270'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/07/cjs-internship-at-medialand.html' title='CJ&apos;s Internship at Medialand'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6950097685236424422</id><published>2009-06-27T08:36:00.000-07:00</published><updated>2009-06-28T00:30:57.753-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SVN'/><title type='text'>Using TortoiseSVN to check out files from Google Code repositories</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tortoisesvn.tigris.org/"&gt;&lt;img style="cursor: pointer; width: 468px; height: 64px;" src="http://tortoisesvn.tigris.org/tortoisesvn_logo_hor468x64.PNG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alright.&lt;br /&gt;I believe there are still many people out there who don't know how to obtain source codes from a Google Code project homepage if the project owner does not provide a download link in the download list.&lt;br /&gt;Project owners may decide to pack a stable release of source codes in a compressed file and upload it to the download list, or provide related files in the list as well. But in some cases, they somehow choose to keep the source files in the SVN repository, without providing the files in the download list.&lt;br /&gt;&lt;br /&gt;What's an SVN repository? SVN stands for Subversion, which is a version control system. SVN repositories are places project owners put there source files in, and these repositories are "version controlled". An project owner can "commit" source files to a repository, "check out" the files to another computer, modify the files in that computer, and "commit" the modified files back to the repository. The complete process is overseen by the SVN system. The system keeps track of every single modification to the source files, and completely backups every older versions after a modification. So it's possible for the owner if he or she wants to "revert" the repository back to an earlier version, or revision.&lt;br /&gt;&lt;br /&gt;Google Code provides two different version control systems: SVN and Mercurial. I only use SVN, so I'm not very familiar with Mercurial. Here I'll just talk about the SVN system.&lt;br /&gt;&lt;br /&gt;A Google Code project owner has a password to the project's SVN repository, which allows the owner to modify the repository. Others can only "check out" files from the repository. But how to check out the files?&lt;br /&gt;&lt;br /&gt;You can either use the commandline method to communicate with the SVN repository (which I certainly do not prefer), or use graphical-interface tools like TortoiseSVN. I use TortoiseSVN to commit and check out files.&lt;br /&gt;&lt;br /&gt;You can get TortoiseSVN &lt;a href="http://tortoisesvn.tigris.org/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ok, here's how you check out files from an SVN repository.&lt;br /&gt;(I use Windows XP)&lt;br /&gt;&lt;br /&gt;1. Download, install TortoiseSVN, and restart your computer.&lt;br /&gt;&lt;br /&gt;2. Create a new folder for checking out files.&lt;br /&gt;&lt;br /&gt;3. Go to the project's SVN repository.&lt;br /&gt;If a Google Code project page's URL is http://code.google.com/p/NAME,&lt;br /&gt;then the repository's root directory URL is http://NAME.googlecode.com/svn&lt;br /&gt;You may want to navigate several layers down in the hierarchy (usually to the "trunk" directory).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SkZEDF0e68I/AAAAAAAAAWc/HHnm_ajAn3g/s1600-h/1.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 48px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SkZEDF0e68I/AAAAAAAAAWc/HHnm_ajAn3g/s320/1.PNG" alt="" id="BLOGGER_PHOTO_ID_5352040027069017026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. Copy the directory's URL.&lt;br /&gt;&lt;br /&gt;5. Right click on the new folder you created in step 2, and select SVN Checkout.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SkZEDR1nOlI/AAAAAAAAAWk/I1WpmQE7x0M/s1600-h/2.PNG"&gt;&lt;img style="cursor: pointer; width: 286px; height: 320px;" src="http://1.bp.blogspot.com/_4-LtXwX7Yuo/SkZEDR1nOlI/AAAAAAAAAWk/I1WpmQE7x0M/s320/2.PNG" alt="" id="BLOGGER_PHOTO_ID_5352040030294981202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6. Paste the directory's URL and click OK.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SkZEDr6JwFI/AAAAAAAAAWs/Gl1eJr6kRn0/s1600-h/3.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 262px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SkZEDr6JwFI/AAAAAAAAAWs/Gl1eJr6kRn0/s320/3.PNG" alt="" id="BLOGGER_PHOTO_ID_5352040037293342802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7. Wait for the files to be checked out.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SkZED94Tt3I/AAAAAAAAAW0/pWJJQ1j3BYU/s1600-h/4.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 253px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SkZED94Tt3I/AAAAAAAAAW0/pWJJQ1j3BYU/s320/4.PNG" alt="" id="BLOGGER_PHOTO_ID_5352040042117445490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8. You're done!! Whenever you want to update the files to the latest revision,&lt;br /&gt;right click on the folder and select SVN Update.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SkZEEKCxUAI/AAAAAAAAAW8/n9gPSwaE8tM/s1600-h/5.PNG"&gt;&lt;img style="cursor: pointer; width: 284px; height: 320px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SkZEEKCxUAI/AAAAAAAAAW8/n9gPSwaE8tM/s320/5.PNG" alt="" id="BLOGGER_PHOTO_ID_5352040045382553602" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6950097685236424422?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6950097685236424422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6950097685236424422&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6950097685236424422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6950097685236424422'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/06/using-tortoisesvn-to-check-out-files.html' title='Using TortoiseSVN to check out files from Google Code repositories'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SkZEDF0e68I/AAAAAAAAAWc/HHnm_ajAn3g/s72-c/1.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7212292829709072365</id><published>2009-06-25T21:00:00.000-07:00</published><updated>2009-06-27T01:56:37.714-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FenoFSM'/><title type='text'>FenoFSM examples</title><content type='html'>I've made some examples for FenoFSM.&lt;br /&gt;Hope this helps understand the usage of FenoFSM.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/fenofsm/"&gt;Project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The examples are available at the &lt;a href="http://code.google.com/p/fenofsm/downloads/list"&gt;download list&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://fenofsm.googlecode.com/svn/trunk/examples/MultistateButton/MultistateButton.html"&gt;Multistate Button&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fenofsm.googlecode.com/svn/trunk/examples/MultistateButton/MultistateButton.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SkRIAUJaA5I/AAAAAAAAAV0/YZlH8r7pIL0/s320/multistate+button.PNG" alt="" id="BLOGGER_PHOTO_ID_5351481427468354450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://fenofsm.googlecode.com/svn/trunk/examples/StateChart/StateChart.html"&gt;State Chart&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fenofsm.googlecode.com/svn/trunk/examples/StateChart/StateChart.html"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SkRIAlc7jLI/AAAAAAAAAV8/DqtXQPraWE0/s320/state+chart.PNG" alt="" id="BLOGGER_PHOTO_ID_5351481432113646770" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7212292829709072365?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7212292829709072365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7212292829709072365&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7212292829709072365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7212292829709072365'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/06/fenofsm-examples.html' title='FenoFSM examples'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/SkRIAUJaA5I/AAAAAAAAAV0/YZlH8r7pIL0/s72-c/multistate+button.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-2424911362080380624</id><published>2009-06-25T03:15:00.001-07:00</published><updated>2009-06-25T03:53:27.347-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='FenoFSM'/><title type='text'>FenoFSM - Finite State Machine Framework</title><content type='html'>&lt;a href="http://code.google.com/p/fenofsm/"&gt;&lt;img src="http://cjcat2266.googlepages.com/FenoFSMLogo.png" /&gt;&lt;br /&gt;&lt;br /&gt;Project homepage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fenofsm.googlecode.com/svn/trunk/docs/index.html"&gt;View Documentation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fenofsm.googlecode.com/files/FenoFSM%201.0.2.rar"&gt;Download source files and docs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've separated the finite state machine framework from CJLibrary CS4's &lt;span style="font-style: italic;"&gt;idv.cjcat.fsm &lt;/span&gt;package.&lt;br /&gt;It's now a new project called FenoFSM!&lt;br /&gt;&lt;br /&gt;Also, I've written some tutorials:&lt;br /&gt;&lt;a href="http://code.google.com/p/fenofsm/wiki/usage"&gt;Basic Usage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/fenofsm/wiki/usingXML"&gt;Using XML&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll create some fancy examples and record video tutorials later on :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-2424911362080380624?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/2424911362080380624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=2424911362080380624&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2424911362080380624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2424911362080380624'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/06/fenofsm-finite-state-machine-framework.html' title='FenoFSM - Finite State Machine Framework'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-7316605916679694492</id><published>2009-06-10T04:49:00.001-07:00</published><updated>2009-06-10T09:13:20.694-07:00</updated><title type='text'>Rabbit Shit</title><content type='html'>I was bored.&lt;br /&gt;And my classmate came up with this stupid idea.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4-LtXwX7Yuo/Si-d0nij8EI/AAAAAAAAAVs/GDlsNPaPA5Y/s1600-h/Rabbit+Shit.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 296px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/Si-d0nij8EI/AAAAAAAAAVs/GDlsNPaPA5Y/s320/Rabbit+Shit.png" alt="" id="BLOGGER_PHOTO_ID_5345664810004770882" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-7316605916679694492?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/7316605916679694492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=7316605916679694492&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7316605916679694492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/7316605916679694492'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/06/rabbit-shit.html' title='Rabbit Shit'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/Si-d0nij8EI/AAAAAAAAAVs/GDlsNPaPA5Y/s72-c/Rabbit+Shit.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4256500580865860190</id><published>2009-05-23T22:31:00.000-07:00</published><updated>2009-05-23T22:38:59.960-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><title type='text'>ZedBox video tutorials</title><content type='html'>Yup, video tutorials available on the second day of release.&lt;br /&gt;Now how cool and fast is that?&lt;br /&gt;&lt;br /&gt;Here are the vids.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=r0ZCfh3pghM&amp;amp;feature=PlayList&amp;amp;p=239C923DAC6C7A58&amp;amp;index=0"&gt;01 - Basic Usage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=IQH0HqQvyzs&amp;amp;feature=PlayList&amp;amp;p=239C923DAC6C7A58&amp;amp;index=1"&gt;02 - Nested Object Structure&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=icV83SfkFzU&amp;amp;feature=PlayList&amp;amp;p=239C923DAC6C7A58&amp;amp;index=2"&gt;03 - ZFilters&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/view_play_list?p=239C923DAC6C7A58"&gt;The complete playlist&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4256500580865860190?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4256500580865860190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4256500580865860190&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4256500580865860190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4256500580865860190'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/05/zedbox-video-tutorials.html' title='ZedBox video tutorials'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6822017828876747875</id><published>2009-05-23T07:45:00.000-07:00</published><updated>2009-05-23T08:58:45.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZedBox'/><title type='text'>ZedBox 1.0 released - 2.5D Billboard Engine</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/zedbox"&gt;&lt;img style="cursor: pointer; width: 250px; height: 232px;" src="http://cjcat2266.googlepages.com/ZedBoxLogoMedium.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/p/zedbox"&gt;&lt;br /&gt;&lt;br /&gt;Go to project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally.&lt;br /&gt;I've been always to develop a 2.5D engine with camera. And here it is, ZedBox.&lt;br /&gt;Different from the ZSprite engine in CJLibrary CS4, ZedBox actually supports 3D camera, which means no more fixed camera direction.&lt;br /&gt;You can set the camera to point to whatever direction you like.&lt;br /&gt;ZedBox also supports nested DisplayObject structures, giving you more control over object structures.&lt;br /&gt;Moreover, ZedBox supports ZFilter, allowing you to create effects such as depth-of-field effects.&lt;br /&gt;&lt;br /&gt;In the future, I'm going to combine Emitter with ZedBox; that is, ZedEmitter!&lt;br /&gt;ZedEmitter would be capable of creating 2.5D particle effects.&lt;br /&gt;I'm looking forward pretty much to it :)&lt;br /&gt;&lt;br /&gt;Oh, and here's an example for ZedBox: Satellites.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://zedbox.googlecode.com/svn/trunk/examples/Satellites/Satellites.swf"&gt;&lt;img style="cursor: pointer; width: 150px; height: 150px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/ShgNSENANMI/AAAAAAAAAVk/J1daYH2Q-WA/s320/satellites.png" alt="" id="BLOGGER_PHOTO_ID_5339031962264810690" border="0" /&gt;&lt;/a&gt;&lt;a href="http://zedbox.googlecode.com/svn/trunk/examples/Satellites/Satellites.swf"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://zedbox.googlecode.com/svn/trunk/examples/Satellites/Satellites.swf"&gt;&lt;br /&gt;Download SWF&lt;/a&gt;&lt;br /&gt;&lt;a href="http://zedbox.googlecode.com/svn/trunk/examples/Satellites/Satellites.rar"&gt;Download FLA&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6822017828876747875?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6822017828876747875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6822017828876747875&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6822017828876747875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6822017828876747875'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/05/zedbox-10-released-25d-billboard-engine.html' title='ZedBox 1.0 released - 2.5D Billboard Engine'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/ShgNSENANMI/AAAAAAAAAVk/J1daYH2Q-WA/s72-c/satellites.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-2978545421053914419</id><published>2009-05-21T23:17:00.000-07:00</published><updated>2009-05-21T23:53:06.339-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><title type='text'>Video Tutorials on Emitter 2.1 New Features</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4-LtXwX7Yuo/ShZD4p-E2wI/AAAAAAAAAVM/V355zkH4mZ8/s1600-h/XML.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 97px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/ShZD4p-E2wI/AAAAAAAAAVM/V355zkH4mZ8/s320/XML.PNG" alt="" id="BLOGGER_PHOTO_ID_5338529048912255746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Two major new features to Emitter version 2.1 are composite behavior triggers and XML supports.&lt;br /&gt;I've recorded some video tutorials to cover these features.&lt;br /&gt;Also, I've recorded a tutorial on timeline-animated particles.&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=CoLRYGD88XY"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.youtube.com/watch?v=CoLRYGD88XY&amp;amp;feature=PlayList&amp;amp;p=84AC3DE6772538E4&amp;amp;index=10"&gt;11 - Timeline-Animated Particles&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=fBiaaiMLoM0&amp;amp;feature=PlayList&amp;amp;p=84AC3DE6772538E4&amp;amp;index=11"&gt;12 - Composite Behavior Trigger&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=tAurEAglhl0&amp;amp;feature=PlayList&amp;amp;p=84AC3DE6772538E4&amp;amp;index=12"&gt;13 - XML&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=Gb2QnxCAvgU&amp;amp;feature=PlayList&amp;amp;p=84AC3DE6772538E4&amp;amp;index=13"&gt;14 - More on XML&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alright, the total length of the video tutorials has reached an hour.&lt;br /&gt;Probably I can name this playlist "Emitter in An Hour" :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-2978545421053914419?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/2978545421053914419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=2978545421053914419&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2978545421053914419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2978545421053914419'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/05/video-tutorials-on-emitter-21-new.html' title='Video Tutorials on Emitter 2.1 New Features'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/ShZD4p-E2wI/AAAAAAAAAVM/V355zkH4mZ8/s72-c/XML.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-4447332736121813857</id><published>2009-05-06T05:51:00.000-07:00</published><updated>2009-05-06T05:56:18.386-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><title type='text'>Sprite 2009 CNY Website</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cny.sprite.com.cn/"&gt;&lt;img style="cursor: pointer; width: 172px; height: 202px;" src="http://3.bp.blogspot.com/_4-LtXwX7Yuo/SgGIFlrVN8I/AAAAAAAAAVE/DEAZEjJdbHQ/s320/sprite.PNG" alt="" id="BLOGGER_PHOTO_ID_5332693063377958850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://cny.sprite.com.cn/"&gt;Sprite 2009 Chinese New Year website&lt;/a&gt; used the Emitter engine to create the sparkles in the loading Sprite bottle and the big bubble effects in the main menu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-4447332736121813857?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/4447332736121813857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=4447332736121813857&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4447332736121813857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/4447332736121813857'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/05/sprite-2009-cny-website.html' title='Sprite 2009 CNY Website'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4-LtXwX7Yuo/SgGIFlrVN8I/AAAAAAAAAVE/DEAZEjJdbHQ/s72-c/sprite.PNG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-8598235689576788338</id><published>2009-05-03T08:15:00.000-07:00</published><updated>2009-05-03T08:34:37.148-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><title type='text'>Yet 3 more Emitter video tutorials</title><content type='html'>I'm on a video tutorial recording frenzy &gt;:]&lt;br /&gt;So here are three more Emitter video tutorials.&lt;br /&gt;Hope you like it~&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=j8B-qoA4NDU&amp;amp;feature=channel"&gt;08 - Custom Behaviors&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=7pMw2uAQbvk&amp;amp;feature=channel"&gt;09 - Deflectors&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=ZD2Iqh7kw8M"&gt;10 - Impulse&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-8598235689576788338?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/8598235689576788338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=8598235689576788338&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8598235689576788338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/8598235689576788338'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/05/yet-3-more-emitter-video-tutorials.html' title='Yet 3 more Emitter video tutorials'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-2837271910842054249</id><published>2009-05-02T09:35:00.000-07:00</published><updated>2009-05-02T09:40:33.402-07:00</updated><title type='text'>3 more Emitter vids</title><content type='html'>I'm just so excited about making Emitter video tutorials.&lt;br /&gt;So here are three more tutorials!&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=3U7RPw8ZXr0"&gt;&lt;br /&gt;05 - Deflectors&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=y65FXvhYEH8"&gt;06 - Behaviors&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=LJY7QBst1Qg"&gt;07 - Custom Behavior Triggers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I actually like the last one pretty much.&lt;br /&gt;It covers the how to create custom behavior triggers by extending the BehaviorTrigger class, which is one of the major new features of Emitter 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-2837271910842054249?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/2837271910842054249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=2837271910842054249&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2837271910842054249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/2837271910842054249'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/05/3-more-emitter-vids.html' title='3 more Emitter vids'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-3627440940948328147</id><published>2009-05-02T02:39:00.000-07:00</published><updated>2009-05-02T09:46:30.927-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Emitter video tutorials!</title><content type='html'>I'm a big fan of &lt;a href="http://gotoandlearn.com/"&gt;Lee Brimelow's Flash video tutorials&lt;/a&gt;.&lt;br /&gt;So I decided to make my own video tutorials on Emitter!&lt;br /&gt;Hope you like it :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=SuFkqje7qDQ"&gt;01 - Introduction&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=G4wvzP047jo"&gt;02 - Basic Usage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=ad8-Gt9z-XQ"&gt;03 - Gravity Fields&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=uR5E_kUxKbk"&gt;04 - Burst &amp;amp; Damping&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/view_play_list?p=84AC3DE6772538E4"&gt;The complete playlist&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More video tutorials coming up~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-3627440940948328147?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/3627440940948328147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=3627440940948328147&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3627440940948328147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/3627440940948328147'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/05/emitter-video-tutorials.html' title='Emitter video tutorials!'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-6997283567661754085</id><published>2009-04-28T09:33:00.000-07:00</published><updated>2009-08-17T01:50:49.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Emitte 2.1 released</title><content type='html'>&lt;a href="http://code.google.com/p/emitter/"&gt;&lt;img style="cursor: pointer; width: 250px; height: 150px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/SfcwG9xdA8I/AAAAAAAAAU8/KQSJl2yYsj0/s320/Emitterlogo%5B1%5D.png" alt="" id="BLOGGER_PHOTO_ID_5329781580235604930" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Go to the Emitter project homepage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Emitter is now version 2.1!!&lt;br /&gt;New features include:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Complete XML support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Particle, ParticleSource, Emitter, Field, Deflector, Behavior, BehaviorTrigger classes now all implement the IEmitterXML interface, which provides a toXML() method. This method returns an XML object that completely represents an object of the aforementioned classes. This XML object can then be parsed, producing an object that is exactly the same as the original one. The main application of this feature is that you can load an external XML file representing an object; this XML file can then be loaded in to a SWF movie to be parsed in order to reconstruct an exact same object that generated this XML data. Adjusting the values in the XML file doesn't require a recompilation of the SWF file, producing more flexibility for using the Emitter engine.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Composite Behavior Trigger&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now you can compose multiple behavior trigger into a single trigger by the CompositeTrigger class, either in AND or OR mode. In AND mode, the composite trigger triggers behaviors only if all the triggers in the composite are triggered; in OR mode, the composite trigger triggers behaviors if one or more of the triggers in the composite are triggered.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Velocity Overriding&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can define a gravity field by the Field class. Now you can also define a velocity field for a Particle object by the Field class. Through setting a Particle object's velocityField property to a Field object, any single particle's velocity is determined according to its current position, depending which Field object is used as its velocity field. By extending the Field class, you can design your own velocity field and have total control over the particles' motion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-6997283567661754085?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/6997283567661754085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=6997283567661754085&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6997283567661754085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/6997283567661754085'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/04/emitte-21-released.html' title='Emitte 2.1 released'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/SfcwG9xdA8I/AAAAAAAAAU8/KQSJl2yYsj0/s72-c/Emitterlogo%5B1%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-5811704937708156334</id><published>2009-03-15T08:03:00.000-07:00</published><updated>2009-03-18T12:38:36.740-07:00</updated><title type='text'>Getting The Greenwich Mean Time (GMT)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4-LtXwX7Yuo/Sb0bwkvI4GI/AAAAAAAAAU0/QoYvJvWf8yU/s1600-h/gmt.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 61px;" src="http://2.bp.blogspot.com/_4-LtXwX7Yuo/Sb0bwkvI4GI/AAAAAAAAAU0/QoYvJvWf8yU/s320/gmt.PNG" alt="" id="BLOGGER_PHOTO_ID_5313433656676114530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Someone asked this on a Flash BBS:&lt;br /&gt;"How do I get the Greenwich mean time instead of the local time on the client's PC?"&lt;br /&gt;&lt;br /&gt;My first thought was to find a web page that gives the current GMT.&lt;br /&gt;&lt;br /&gt;And I found this!&lt;br /&gt;&lt;a href="http://www.timeanddate.com/worldclock/"&gt;http://www.timeanddate.com/worldclock/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The rest is rather simple.&lt;br /&gt;Just load this page using the URLLoader class and do whatever you can come up with to splice out the GMT information.&lt;br /&gt;&lt;br /&gt;My approach is through regular expression:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;d{1,2}:\d{1,2}:\d{1,2}&lt;br /&gt;//This means two colons splitting three blocks of one to two digits.&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;So here's the complete code for getting the GMT:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;var loader:URLLoader = new URLLoader();&lt;br /&gt;loader.addEventListener(Event.COMPLETE, traceTime);&lt;br /&gt;loader.load(new URLRequest("http://www.timeanddate.com/worldclock/"));&lt;br /&gt;&lt;br /&gt;function traceTime(e:Event):void {&lt;br /&gt;  var str:String = URLLoader(e.target).data;&lt;br /&gt;  var time:String = str.match(/\d{1,2}:\d{1,2}:\d{1,2}/)[0];&lt;br /&gt;  trace(time);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Oops, later on I found out that Google and Yahoo already provide a GMT inquiry service.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So my method was an overkill :p&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-5811704937708156334?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/5811704937708156334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=5811704937708156334&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5811704937708156334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/5811704937708156334'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/03/getting-greenwich-mean-time-gmt.html' title='Getting The Greenwich Mean Time (GMT)'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4-LtXwX7Yuo/Sb0bwkvI4GI/AAAAAAAAAU0/QoYvJvWf8yU/s72-c/gmt.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2055530350521596454.post-1452724392177861403</id><published>2009-02-14T08:00:00.001-08:00</published><updated>2009-02-14T08:30:04.961-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emitter'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Astro'/><title type='text'>Emitter Editor Sneak Peek</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SZbqz0isBAI/AAAAAAAAATw/VF4ZZJfiNn8/s1600-h/emitter+editor+sneak+peek.PNG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 207px;" src="http://4.bp.blogspot.com/_4-LtXwX7Yuo/SZbqz0isBAI/AAAAAAAAATw/VF4ZZJfiNn8/s320/emitter+editor+sneak+peek.PNG" alt="" id="BLOGGER_PHOTO_ID_5302683787273700354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No, it's not finished yet.&lt;br /&gt;But here's a screenshot of the current development progress.&lt;br /&gt;&lt;br /&gt;Once the Emitter Editor is finished,&lt;br /&gt;you can save and load external XML files representing particle design.&lt;br /&gt;So you can save your own presets and share them with others.&lt;br /&gt;&lt;br /&gt;This entire workflow would be far less time-consuming and much more user-friendly.&lt;br /&gt;I'm really looking forward to the Editor's completion :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2055530350521596454-1452724392177861403?l=cjcat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cjcat.blogspot.com/feeds/1452724392177861403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2055530350521596454&amp;postID=1452724392177861403&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1452724392177861403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2055530350521596454/posts/default/1452724392177861403'/><link rel='alternate' type='text/html' href='http://cjcat.blogspot.com/2009/02/emitter-editor-sneak-peek.html' title='Emitter Editor Sneak Peek'/><author><name>CJ Cat</name><uri>http://www.blogger.com/profile/11495589296075734855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_4-LtXwX7Yuo/R-ZNE6kXhXI/AAAAAAAAACM/ow8HF6fwkzY/S220/29084743048ee68aa.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4-LtXwX7Yuo/SZbqz0isBAI/AAAAAAAAATw/VF4ZZJfiNn8/s72-c/emitter+editor+sneak+peek.PNG' height='72' width='72'/><thr:total>3</thr:total></entry></feed>
