<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ClickPopMedia &#187; Intermediate</title>
	<atom:link href="http://www.clickpopmedia.com/tag/intermediate/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.clickpopmedia.com</link>
	<description>ClickPopMedia is a great little design and illustration firm.</description>
	<lastBuildDate>Thu, 03 Dec 2009 17:28:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Changes to Box2DFlash “Hello World” example.</title>
		<link>http://www.clickpopmedia.com/2008/04/29/specific-changes-to-box2dflash-%e2%80%9chello-world%e2%80%9d-example/</link>
		<comments>http://www.clickpopmedia.com/2008/04/29/specific-changes-to-box2dflash-%e2%80%9chello-world%e2%80%9d-example/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 00:28:36 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Box2DFlash]]></category>
		<category><![CDATA[Intermediate]]></category>
		<category><![CDATA[Intro]]></category>
		<category><![CDATA[Physics]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/?p=281</guid>
		<description><![CDATA[I&#8217;ve talked about the basics of Box2DFlash v1.4.3 in my Introductory tutorial.  I showed how to create your world and how to introduce simple bodies into that world.  With the release of Box2DFlash v2.0.0 the basics remain mostly the same, there are a few details changed.  I need to go over these [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve talked about the basics of Box2DFlash v1.4.3 in my <a href="http://www.clickpopmedia.com/2008/03/17/physics-in-actionscript-3/">Introductory tutorial</a>.  I showed how to create your world and how to introduce simple bodies into that world.  With the release of Box2DFlash v2.0.0 the basics remain mostly the same, there are a few details changed.  I need to go over these small changes before I move on to the next step of adding joints and forces to the bodies.</p>
<p>The first and biggest change (although really a small thing) is that we no longer work in pixels!  We now work in units that by default equal 30 pixels to 1 unit (think of it as meters; 30px : 1m).  With this change our normal gravity is no longer (0, 300) but instead (1, 10).  This makes more sense to me at least because gravity in reality is 9.81 m/s/s.  This is going to effect almost everything you do, from applying forces to setting the width and height of a box.</p>
<p><span id="more-281"></span></p>
<p>The reason for such a change (I believe) is to make it easier for you to dynamically scale a project.  Just change the ratio of pixels per unit and everything should scale correctly.</p>
<p>The second change is the way we add objects to the world.  The creation of a new shape and object is still very much the same, but we now have the ability to adjust the center of mass.  For now, just leaving the center of mass to auto calculate we need to get the body object when adding the new bodyDef to the world.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">var</span> body:b2Body;<br />
<span class="kw2">var</span> bodyDef:b2BodyDef;<br />
<span class="kw2">var</span> boxDef:b2PolygonDef;</p>
<p><span class="co1">// Add ground body</span><br />
bodyDef = <span class="kw2">new</span> b2BodyDef<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
bodyDef.<span class="kw3">position</span>.<span class="kw3">Set</span><span class="br0">&#40;</span><span class="nu0">10</span>, <span class="nu0">12</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">//Small numbers&#8230; &nbsp;remember it&#8217;s scaled 30:1</span><br />
boxDef = <span class="kw2">new</span> b2PolygonDef<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
boxDef.<span class="me1">SetAsBox</span><span class="br0">&#40;</span><span class="nu0">30</span>, <span class="nu0">3</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">//THIS IS NEW!</span><br />
boxDef.<span class="me1">friction</span> = <span class="nu0">0.3</span>;</p>
<p><span class="co1">// Add sprite to body userData</span><br />
bodyDef.<span class="me1">userData</span> = <span class="kw2">new</span> PhysGround<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
bodyDef.<span class="me1">userData</span>.<span class="kw3">width</span> = <span class="nu0">30</span> * <span class="nu0">2</span> * <span class="nu0">30</span>;<br />
bodyDef.<span class="me1">userData</span>.<span class="kw3">height</span> = <span class="nu0">30</span> * <span class="nu0">2</span> * <span class="nu0">3</span>;<br />
addChild<span class="br0">&#40;</span>bodyDef.<span class="me1">userData</span><span class="br0">&#41;</span>;<br />
body = m_world.<span class="me1">CreateStaticBody</span><span class="br0">&#40;</span>bodyDef<span class="br0">&#41;</span>; &nbsp;<span class="co1">//THIS IS MOSTLY NEW</span><br />
body.<span class="me1">CreateShape</span><span class="br0">&#40;</span>boxDef<span class="br0">&#41;</span>; &nbsp;<span class="co1">//THIS IS NEW</span><br />
body.<span class="me1">SetMassFromShapes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">//THIS IS NEW</span></div>
<p>Haha!  I guess I forgot to mention that we no longer have a b2BoxDef anymore&#8230;  we only have b2PolyDef (renamed b2PolygonDef).  We can quickly define it as a box though using the method <strong>public function SetAsBox(hx:Number, hy:Number):void</strong>.</p>
<p>Anyways, let us bring our attention back to adding the object to the world.  When you add the object to the world, you are creating it as either a static (unmoving) body or as a dynamic body (<strong>body = m_world.CreateDynamicBody(bodyDef);</strong>).<br />
It then returns the new body object BY REFRENCE.  It is not giving you a copy of that object.  This way when we make changes, such as add the shape and set the mass (center of mass really) we don&#8217;t have to go send it back again.</p>
<p>The method <strong>public function SetMassFromShapes():void</strong> is the way to auto calculate and set your center of mass.  Otherwise you have to us <strong>public function SetMass(massData:b2MassData):void</strong>, but this is a whole new complication.</p>
<p>OK!  With that, we are pretty much back up to speed after my last tutorial.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/04/29/specific-changes-to-box2dflash-%e2%80%9chello-world%e2%80%9d-example/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Making an MP3 player in AS3</title>
		<link>http://www.clickpopmedia.com/2008/04/15/making-an-mp3-player-in-as3/</link>
		<comments>http://www.clickpopmedia.com/2008/04/15/making-an-mp3-player-in-as3/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 00:12:24 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Intermediate]]></category>
		<category><![CDATA[MP3 Player]]></category>
		<category><![CDATA[Sound]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/?p=250</guid>
		<description><![CDATA[
Music Credits:
Title: The Best Day Ever
Artist: SpongBob
Album: The SpongeBob SquarePants Movie: Music From the Movie and More
Creating an MP3 Player in ActionScript 3.0 is fairly straight forward. The complexity varies greatly depending on what kind of features you want your player to have.  I don&#8217;t plan on getting into ID3 tags here, but otherwise [...]]]></description>
			<content:encoded><![CDATA[<p><center><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="288" height="170" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.clickpopmedia.com/wp-content/uploads/2008/04/as3mp3player.swf" /><embed type="application/x-shockwave-flash" width="288" height="170" src="http://www.clickpopmedia.com/wp-content/uploads/2008/04/as3mp3player.swf"></embed></object></center><br />
<em>Music Credits:<br />
Title: The Best Day Ever<br />
Artist: SpongBob<br />
Album: The SpongeBob SquarePants Movie: Music From the Movie and More</em></p>
<p>Creating an MP3 Player in ActionScript 3.0 is fairly straight forward. The complexity varies greatly depending on what kind of features you want your player to have.  I don&#8217;t plan on getting into ID3 tags here, but otherwise (as you can see) I will be going over the full functionality of a normal MP3 Player.<br />
<span id="more-250"></span><br />
The first step is setting up the display and graphics.  I went into the FLVPlayback skin SkinOverAll.fla file and fetched all the button graphics I needed (I&#8217;m not a very good artist).  It was only a little trouble to recreate the buttons in a way that satisfied me (<i>The only important thing to note about my buttons is that I gave them frame labels on the keyframes to make it easier to remember while writing the code</i>).</p>
<h3>Setting up the framework:</h3>
<p>Now for the code!  You can approach code like this from a number of different directions.  I chose to start with making my button instances look like buttons, even though they don&#8217;t do anything yet.  It&#8217;s really just a matter of setting up a LOT of event listeners (4 for each button):</p>
<div class="dean_ch" style="white-space: wrap;">&#8230;<br />
<span class="me1">stop_mc</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OVER</span>, StopOver<span class="br0">&#41;</span>;<br />
stop_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OUT</span>, StopOut<span class="br0">&#41;</span>;<br />
stop_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, StopDown<span class="br0">&#41;</span>;<br />
stop_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, StopUp<span class="br0">&#41;</span>;<br />
&#8230;<br />
<span class="kw3">private</span> <span class="kw2">function</span> StopOver<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop_over&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> StopOut<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> StopDown<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop_down&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> StopUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="me1">playing</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;play&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop_over&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&#8230;</div>
<p>At this point most of the buttons are the same.  The only difference might lay in the MOUSE_UP event or how the play button has to switch between play and pause, so I have the boolean property playing in my PlayPauseBtn class.</p>
<h3>Bringing in a PlayList:</h3>
<p>Now that we have basic working buttons that don&#8217;t do anything, it feels like the framework is in place to start making our MP3 player play music.  To do this we will need a few elements:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">url</span>:URLRequest;<br />
<span class="kw3">public</span> <span class="kw2">var</span> xmlLoad:URLLoader;<br />
<span class="kw3">public</span> <span class="kw2">var</span> musicXML:<span class="kw3">XML</span>;<br />
<span class="kw3">public</span> <span class="kw2">var</span> song:<span class="kw3">Sound</span>;<br />
<span class="kw3">public</span> <span class="kw2">var</span> channel:SoundChannel;<br />
<span class="kw3">public</span> <span class="kw2">var</span> sndTrans:SoundTransform;<br />
<span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">position</span>:<span class="kw3">Number</span>;</div>
<p>Our <b>song:Sound</b> will load the song and play it.  The <b>play()</b> method in the Sound class returns a sound channel which we need to store in our channel:SoundChannel in order to pause/play/stop, or change the volume of our music.  </p>
<p>The <b>SoundTransform</b> class is what is used to change the volume through the channel.  It can also change the pan (balance of left and right speakers), but I&#8217;m not going to get into that.</p>
<p>What we are going to do is load an external XML file with our playlist in it&#8230;  something like this:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="sc3"><span class="re1">&lt;music<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/TheBestDayEver.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;The Best Day Ever&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/come_away.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Come Away&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/nightmares.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Nightmares and Dreams&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/override.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Override&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/rescue.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Rescue&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/stick_em_up.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Stick&#8217;em Up&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/trogdor.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;TROGDOOOR&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/you_are.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;You Are&quot;</span><span class="re2">/&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;/music<span class="re2">&gt;</span></span></span></div>
<p>Then we want to add each song on that playlist to a list component on the stage (I&#8217;ve called it <b>playList</b>).  After we have the URLs of our songs, then we can start to load and play them.</p>
<p>In our <b>xmlComplete(event:Event)</b> event handler (handling the COMPLETE event from loading our XML file with a URLLoader) we need to parse the playlist into our List:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> xmlComplete<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> item:<span class="kw3">Object</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; musicXML = <span class="kw2">new</span> <span class="kw3">XML</span><span class="br0">&#40;</span>event.<span class="me1">currentTarget</span>.<span class="kw3">data</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> each<span class="br0">&#40;</span><span class="kw2">var</span> prop:<span class="kw3">XML</span> <span class="kw1">in</span> musicXML.<span class="me1">song</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">label</span> = prop.@disp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="kw3">data</span> = prop.@id;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">addItem</span><span class="br0">&#40;</span>item<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; song = <span class="kw2">new</span> <span class="kw3">Sound</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; song.<span class="me1">addEventListener</span><span class="br0">&#40;</span>IOErrorEvent.<span class="me1">IO_ERROR</span>, ioErrorHandler<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; song.<span class="kw3">load</span><span class="br0">&#40;</span><span class="kw2">new</span> URLRequest<span class="br0">&#40;</span>playList.<span class="me1">getItemAt</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>.<span class="kw3">data</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, updateSeek<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span> = <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span></div>
<p>The <b>for each..in loop</b> is one that not everyone knows about.  It&#8217;s very useful for getting all the elements of an XML object when you aren&#8217;t sure how many elements there will be.  Basically it&#8217;s assigning each song tag from the <b>XMLList musicXML.song</b> to prop and then runs the code within the curly brackets {}.</p>
<p>I don&#8217;t like it when music or sounds start playing on the internet without my consent.  So, whenever I make something like and MP3 Player, I set it up to NOT automatically play.</p>
<p>Still, I want it to be ready to play as soon as the user tells it to.  So, I needed to add those lines after my <b>for each..in loop</b>.  What is happening might be obvious enough.  I&#8217;m creating a new Sound object and storing it in song.  I always check for load errors so that the end user doesn&#8217;t get annoying pop-ups telling them that I&#8217;m a bad programmer.  Then I&#8217;m loading the first song on the playList and making that song highlighted in my List component.</p>
<p>The event listener with a handle of <b>updateSeek</b> is needed for my seekbar. I will get to that later.</p>
<h3>Playing the music and traversing out PlayList:</h3>
<p>Great!  So, now we have everything set up to look like a complete player.  We even have our first song loaded.  But, there is no way to get it to play yet.  Our PLAY button doesn&#8217;t work yet.</p>
<p>This is where we have to start giving those buttons some functionality.  Most (if not all) of the functionality for each button is going to be in the MOUSE_UP event handlers:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> PlayUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>obj.<span class="me1">playing</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;play_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">position</span> = channel.<span class="kw3">position</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="me1">playing</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;pause_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel = song.<span class="kw3">play</span><span class="br0">&#40;</span><span class="kw3">position</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="br0">&#40;</span>mute_mc.<span class="me1">isMute</span><span class="br0">&#41;</span>? <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> : sndTrans;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">SOUND_COMPLETE</span>, soundComplete<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="me1">playing</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p>&#8230;</p>
<p><span class="kw3">private</span> <span class="kw2">function</span> StopUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">position</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="me1">playing</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;play&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop_over&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>&#8230;</p>
<p><span class="me1">playList</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>ListEvent.<span class="me1">ITEM_CLICK</span>, SnglClick<span class="br0">&#41;</span>;</p>
<p>&#8230;</p>
<p><span class="kw3">private</span> <span class="kw2">function</span> SnglClick<span class="br0">&#40;</span>event:ListEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> item:<span class="kw3">Object</span> = event.<span class="me1">item</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">try</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>song.<span class="kw3">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">catch</span><span class="br0">&#40;</span><span class="kw3">error</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="kw3">trace</span><span class="br0">&#40;</span><span class="kw3">error</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">try</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>channel.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">catch</span><span class="br0">&#40;</span><span class="kw3">error</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="kw3">trace</span><span class="br0">&#40;</span><span class="kw3">error</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; song = <span class="kw2">new</span> <span class="kw3">Sound</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; song.<span class="me1">addEventListener</span><span class="br0">&#40;</span>IOErrorEvent.<span class="me1">IO_ERROR</span>, ioErrorHandler<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; song.<span class="kw3">load</span><span class="br0">&#40;</span><span class="kw2">new</span> URLRequest<span class="br0">&#40;</span>item.<span class="kw3">data</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel = song.<span class="kw3">play</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="br0">&#40;</span>mute_mc.<span class="me1">isMute</span><span class="br0">&#41;</span>? <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> : sndTrans;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">SOUND_COMPLETE</span>, soundComplete<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">position</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="me1">playing</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;pause&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>&#8230;</p>
<p><span class="kw3">private</span> <span class="kw2">function</span> soundComplete<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>playList.<span class="kw3">length</span> &gt; playList.<span class="me1">selectedIndex</span> + <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span>++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">scrollToSelected</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">scrollToSelected</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span><span class="kw2">new</span> ListEvent<span class="br0">&#40;</span>ListEvent.<span class="me1">ITEM_CLICK</span>, <span class="kw2">false</span>, <span class="kw2">true</span>, <span class="nu0">0</span>, playList.<span class="me1">selectedIndex</span>, playList.<span class="me1">selectedIndex</span>, playList.<span class="me1">selectedItem</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>&#8230;</p>
<p><span class="kw3">private</span> <span class="kw2">function</span> ForwardUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;forward_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>playList.<span class="kw3">length</span> &gt; playList.<span class="me1">selectedIndex</span> + <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span>++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">scrollToSelected</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">scrollToSelected</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span><span class="kw2">new</span> ListEvent<span class="br0">&#40;</span>ListEvent.<span class="me1">ITEM_CLICK</span>, <span class="kw2">false</span>, <span class="kw2">true</span>, <span class="nu0">0</span>, playList.<span class="me1">selectedIndex</span>, playList.<span class="me1">selectedIndex</span>, playList.<span class="me1">selectedItem</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>My Play/Pause button, if playing, will save the current position and then stop the music through the channel.  Otherwise, it will play from position and set the volume and add a listener for the end of the song.</p>
<p>The Stop button obviously just stops the song and sets the position back to zero (0). I guess it also resets the Play button.</p>
<p>The  <b>ListEvent.ITEM_CLICK</b> is when we click on a list item (a new song in the playlist).  The handler closes any open stream that might be there (thus the <b>try..catch</b>) and if not then to simply stop the channel.  It then loads the song URL stored in that items data provider and starts it playing.</p>
<p>The forward and back buttons are almost exactly the same.  They just change the selection in the List component and then dispatch a fake <b>ITEM_CLICK</b> event.</p>
<p>The <b>soundComplete()</b> method, as you can see, is also very similar to the forward button.  This event handler is called when a song played right to the end.</p>
<h3>Working with volume:</h3>
<p>Since I&#8217;ve already mentioned setting the volume, I might as well get into that next.  The volume is a property of the <b>SoundTransform class</b>.  We already made a <b>SoundTransform</b> variable, we just haven&#8217;t stored an ST object in it yet.</p>
<p>My main volume control is <b>sndTrans:SoundTransform;</b>  After setting the volume property within it I can assign it to the <b>channel.soundTransform</b> and it will take effect.  My volume bar has it&#8217;s own class to handle the effect of dragging the handle around:</p>
<div class="dean_ch" style="white-space: wrap;">package controls <span class="br0">&#123;</span><br />
<span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="kw3">MovieClip</span>;<br />
<span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">*</span>;<br />
<span class="kw3">import</span> flash.<span class="me1">geom</span>.<span class="me1">Rectangle</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="kw3">public</span> <span class="kw2">class</span> VolControl <span class="kw3">extends</span> <span class="kw3">MovieClip</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> bounds:Rectangle;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> percent:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> VolControl<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = <span class="nu0">1</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bounds = <span class="kw2">new</span> Rectangle<span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">10</span>, <span class="nu0">50</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volBar_mc.<span class="me1">hit_mc</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, dragHandle<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, dragHandle<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, endDrag<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OUT</span>, endDrag<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> dragHandle<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="kw3">startDrag</span><span class="br0">&#40;</span><span class="kw2">true</span>, bounds<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, changeVol<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> endDrag<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="kw3">stopDrag</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volBar_mc.<span class="me1">fullness_mc</span>.<span class="me1">fill_mc</span>.<span class="me1">x</span> = volHandle_mc.<span class="me1">x</span> &#8211; volBar_mc.<span class="me1">fullness_mc</span>.<span class="me1">fill_mc</span>.<span class="kw3">width</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = volHandle_mc.<span class="me1">x</span>/<span class="nu0">50</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span class="br0">&#40;</span><span class="kw2">new</span> Event<span class="br0">&#40;</span><span class="st0">&quot;volume_change&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">removeEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, changeVol<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> changeVol<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volBar_mc.<span class="me1">fullness_mc</span>.<span class="me1">fill_mc</span>.<span class="me1">x</span> = volHandle_mc.<span class="me1">x</span> &#8211; volBar_mc.<span class="me1">fullness_mc</span>.<span class="me1">fill_mc</span>.<span class="kw3">width</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = volHandle_mc.<span class="me1">x</span>/<span class="nu0">50</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span class="br0">&#40;</span><span class="kw2">new</span> Event<span class="br0">&#40;</span><span class="st0">&quot;volume_change&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>This is simply letting you drag around the little pointer within its bounds and dispatching an event to let the main class know that the volume has been changed.  I needed to repeat some of the code from <b>changeVol()</b> in <b>endDrag()</b> because if you just click quickly then the ENTER_FRAME event never gets handled before it&#8217;s removed.</p>
<p>Back in the main class we are handling that “<b>volume_change</b>” event:</p>
<div class="dean_ch" style="white-space: wrap;">vol_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;volume_change&quot;</span>, updateVolume<span class="br0">&#41;</span>;<br />
&#8230;<br />
<span class="kw3">private</span> <span class="kw2">function</span> updateVolume<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sndTrans.<span class="me1">volume</span> = vol_mc.<span class="me1">percent</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="br0">&#40;</span>mute_mc.<span class="me1">isMute</span><span class="br0">&#41;</span>? <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> : sndTrans;<br />
<span class="br0">&#125;</span></div>
<p>Another thing that a lot of new programmers don&#8217;t know about is the conditional ? : operator.  It&#8217;s shorthand for an if..else statement.  Basically these two bits of code are the same:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">if</span><span class="br0">&#40;</span>num&gt;<span class="nu0">5</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; num = <span class="nu0">5</span>;<br />
<span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; num = <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span><br />
<span class="co1">//OR THIS NEXT PART DOES THE SAME THING</span><br />
num = <span class="br0">&#40;</span>num&gt;<span class="nu0">5</span><span class="br0">&#41;</span>? <span class="nu0">5</span> : <span class="nu0">0</span>;</div>
<p>Isn&#8217;t that great?</p>
<p>Getting back to our MP3 player.  We should add our Mute button while we are working with volume.  You&#8217;ve already seen that I take the mute condition into account when I set that volume.  Here is where I set the mute condition:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> MuteUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>obj.<span class="me1">isMute</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;mute_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="me1">isMute</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = sndTrans;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;unmute_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="me1">isMute</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>I never want to set <b>sndTrans.volume</b> to zero (0) just because I pressed the mute button.  I would rather leave that as it is so that I can unmute back to the original volume again.</p>
<p>*phew* About this time I&#8217;m thinking to myself, “It sure takes a lot of code to get a simple MP3 Player to work correctly.”  But, there is light on the horizon so we must press on.</p>
<h3>Making the seek bar to search a song:</h3>
<p>Now for the most complicated part of our player.  The seek bar.  The seek bar isn&#8217;t THAT bad, but it&#8217;s definitely worse then what we have done so far.</p>
<p>First of all we will give the seek bar the same drag or click functionality that we gave to volume control bar:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">class</span> SeekControl <span class="kw3">extends</span> <span class="kw3">MovieClip</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> bounds:Rectangle;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> percent:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> seeking:<span class="kw3">Boolean</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> SeekControl<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seeking = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bounds = <span class="kw2">new</span> Rectangle<span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">12</span>, <span class="nu0">100</span>, <span class="nu0">0</span><span class="br0">&#41;</span>; <span class="co1">//I made the seek bar 100 wide for convenience</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHit_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, dragHandle<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, dragHandle<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, endDrag<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> dragHandle<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seeking = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="kw3">startDrag</span><span class="br0">&#40;</span><span class="kw2">true</span>, bounds<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> endDrag<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seeking = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="kw3">stopDrag</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fillBar_mc.<span class="me1">x</span> = seekHandle_mc.<span class="me1">x</span> &#8211; fillBar_mc.<span class="kw3">width</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = seekHandle_mc.<span class="me1">x</span>/<span class="nu0">100</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span class="br0">&#40;</span><span class="kw2">new</span> Event<span class="br0">&#40;</span><span class="st0">&quot;seek_change&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> moveSeekPos<span class="br0">&#40;</span>perc:<span class="kw3">Number</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fillBar_mc.<span class="me1">x</span> = <span class="br0">&#40;</span>fillBar_mc.<span class="kw3">width</span> * perc<span class="br0">&#41;</span> &#8211; fillBar_mc.<span class="kw3">width</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>!seeking<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="me1">x</span> = <span class="nu0">100</span> * perc;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>The biggest difference here is that I don&#8217;t want a live update while dragging the pointer around.  Otherwise, a few values have changed, some var names have changed, but it should look familiar (well it would if you had written this code yourself).</p>
<p>The <b>moveSeekPos()</b> method is going to be updated constantly from our main class.  This is here so that we can see the play progress when listening to a song.</p>
<p>Getting back to the main class again, we have to write a thing or two about our seek bar there:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="coMULTI">/*Remember that <br />
this.addEventListener(Event.ENTER_FRAME, updateSeek);<br />
is added when we start to load a new song.*/</span><br />
seek_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;seek_change&quot;</span>, changeSeekBar<span class="br0">&#41;</span>;<br />
&#8230;<br />
<span class="kw3">private</span> <span class="kw2">function</span> changeSeekBar<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">position</span> = song.<span class="kw3">length</span> * seek_mc.<span class="me1">percent</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>playPause_mc.<span class="me1">playing</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel = song.<span class="kw3">play</span><span class="br0">&#40;</span><span class="kw3">position</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="br0">&#40;</span>mute_mc.<span class="me1">isMute</span><span class="br0">&#41;</span>? <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> : sndTrans;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">SOUND_COMPLETE</span>, soundComplete<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&#8230;<br />
<span class="kw3">private</span> <span class="kw2">function</span> updateSeek<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>playPause_mc.<span class="me1">playing</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> perc:<span class="kw3">Number</span> = channel.<span class="kw3">position</span> / song.<span class="kw3">length</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seek_mc.<span class="me1">moveSeekPos</span><span class="br0">&#40;</span>perc<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display_mc.<span class="me1">timeDisp</span>.<span class="kw3">text</span> = formatTime<span class="br0">&#40;</span>channel.<span class="kw3">position</span><span class="br0">&#41;</span> + <span class="st0">&quot;/&quot;</span> + formatTime<span class="br0">&#40;</span>song.<span class="kw3">length</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&#8230;<br />
<span class="kw3">public</span> <span class="kw2">function</span> formatTime<span class="br0">&#40;</span><span class="kw3">time</span>:<span class="kw3">Number</span><span class="br0">&#41;</span>:<span class="kw3">String</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="kw3">min</span>:<span class="kw3">String</span> = <span class="kw3">Math</span>.<span class="kw3">floor</span><span class="br0">&#40;</span><span class="kw3">time</span>/<span class="nu0">60000</span><span class="br0">&#41;</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> sec:<span class="kw3">String</span> = <span class="br0">&#40;</span><span class="kw3">Math</span>.<span class="kw3">floor</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">time</span>/<span class="nu0">1000</span><span class="br0">&#41;</span>%<span class="nu0">60</span><span class="br0">&#41;</span> &lt; <span class="nu0">10</span><span class="br0">&#41;</span>? <span class="st0">&quot;0&quot;</span> + <span class="kw3">Math</span>.<span class="kw3">floor</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">time</span>/<span class="nu0">1000</span><span class="br0">&#41;</span>%<span class="nu0">60</span><span class="br0">&#41;</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">Math</span>.<span class="kw3">floor</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">time</span>/<span class="nu0">1000</span><span class="br0">&#41;</span>%<span class="nu0">60</span><span class="br0">&#41;</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="br0">&#40;</span><span class="kw3">min</span>+<span class="st0">&quot;:&quot;</span>+sec<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>I went ahead and added the code here to display the current play time and the total play time in a dynamic text field on the stage.  That seemed to be closely related to the seek bar, so I figured showing it here is suitable.</p>
<h3>A final note:</h3>
<p>Now would be a good time to mention that I didn&#8217;t bother fixing a “minor” bug.  While a song is still streaming (loading), Flash doesn&#8217;t know how long it is.  Thus, <b>song.length</b> will be growing over time till it&#8217;s done loading.  This is only an issue for our seek bar, because it uses the ratio between the current position and the total length to decide how to display itself.</p>
<p>To work around this issue (which is really only an issue for slower internet connections), you will need to pass Flash the songs length along with the file path in the XML doc.  It seemed like a lot of trouble to me and since this isn&#8217;t for a client, I figured I would just tell you about it instead of do it for you.</p>
<p>Wow.  This was so long that I wouldn&#8217;t be surprised to find later that I forgot something.  If I find anything I will make sure to update this post and make a note of what I changed.</p>
<p>Anyways, that is it! I think&#8230;   </p>
<p>Let me know what you think about it and also let me know if you even use my Player on your site somewhere.  I would love to see my work being used.</p>
<p>You can get the source files for this tutorial and the example at the beginning to the page here: <a href='http://www.clickpopmedia.com/wp-content/uploads/2008/07/mp3-player-source-code.rar'>MP3 Player Source Code.rar</a></p>
<p><em><strong>UPDATE:</strong> I have updated the source file to include changes which will fix a few bugs pointed out to me over time.  I also added a few new lines to the disclaimer at the beginning of my code which explains that WE DO NOT PROVIDE TECHNICAL SUPPORT FOR OUR EXAMPLE CODE.  It is there for reference only.  We would hope that you would use our code in conjunction with the tutorial to learn how to do it yourself.<br />
We understand that most people will just download and use the code without much effort towards learn new skills, but we aren&#8217;t going to answer your questions in that case. If you notice something wrong with the code and want to bring it to our attention that would be appreciated, but any questions on how to use the code will be answered with &#8220;Read the tutorial.&#8221;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/04/15/making-an-mp3-player-in-as3/feed/</wfw:commentRss>
		<slash:comments>115</slash:comments>
		</item>
		<item>
		<title>Spring Animation with ActionScript 3</title>
		<link>http://www.clickpopmedia.com/2008/04/04/spring-animation-with-actionscript-3/</link>
		<comments>http://www.clickpopmedia.com/2008/04/04/spring-animation-with-actionscript-3/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 06:00:22 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Vector]]></category>
		<category><![CDATA[Intermediate]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/?p=223</guid>
		<description><![CDATA[In celebration of our little vector contest I thought I would unofficially submit my own entry.
I made this animation using our Spring Time vector pack.  It&#8217;s about 360Kbs, but once it&#8217;s loaded click Play to get it started, then you can press the Left or Right arrows to control the little bunny.

I&#8217;ll walk you [...]]]></description>
			<content:encoded><![CDATA[<p>In celebration of our little vector contest I thought I would unofficially submit my own entry.</p>
<p>I made this animation using our <a href="http://www.clickpopmedia.com/2008/03/25/spring-vectors-and-contest/">Spring Time vector pack</a>.  It&#8217;s about 360Kbs, but once it&#8217;s loaded click Play to get it started, then you can press the Left or Right arrows to control the little bunny.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.clickpopmedia.com/wp-content/uploads/2008/04/keyboard-controls.swf" /><embed type="application/x-shockwave-flash" width="550" height="400" src="http://www.clickpopmedia.com/wp-content/uploads/2008/04/keyboard-controls.swf"></embed></object></p>
<p>I&#8217;ll walk you through the process I went through to create this here game/animation.</p>
<p><span id="more-223"></span></p>
<p>My first step was to get the <a href="http://www.clickpopmedia.com/category/products/">vector pack</a> that I wanted to use.  Then I imported it into Flash CS3.</p>
<p><a href="http://www.clickpopmedia.com/wp-content/uploads/2008/04/importaifile.png"><img class="aligncenter size-full wp-image-231" title="importaifile" src="http://www.clickpopmedia.com/wp-content/uploads/2008/04/importaifile.png" alt="Importing Dialogue Box" width="498" height="499" /></a></p>
<p>You can just go ahead and import everything. Then just delete anything you don&#8217;t need.  I only unchecked a few groups and paths that I knew weren&#8217;t needed.</p>
<p>Once all the groups are imported to the stage you can go into them by double clicking on them and remove or edit them how you like.  For example I got rid of the dirt path on the ground.</p>
<p>When everything was more or less how I wanted it, I started making MovieClip symbols out of some of the more important groups and the rest I either deleted or just left as background on the stage.</p>
<p>Before I wrote any code I thought it would be fun to animate the sun a little and work out how the bunny was going to hop.</p>
<p><img class="alignleft size-medium wp-image-232" title="sunanimate" src="http://www.clickpopmedia.com/wp-content/uploads/2008/04/sunanimate-300x278.png" alt="" width="300" height="278" /></p>
<p>For the sun I separated the face and the orange halo behind its head and over the span of 6 frames I rotated the halo just a little bit so that it would loop and look like it was always turning.</p>
<p><a href="http://www.clickpopmedia.com/wp-content/uploads/2008/04/animatebunny.png"><img class="aligncenter size-medium wp-image-233" style="float:left; margin-right:10px;" title="animatebunny" src="http://www.clickpopmedia.com/wp-content/uploads/2008/04/animatebunny-300x292.png" alt="Animating the Bunny" width="300" height="292" /></a></p>
<p>With a little thinking ahead I setup the bunny&#8217;s animation and on the first frame I added a quick 3 lines of code to let me stop it from looping if I wanted.</p>
<p>With all the prep done we are finally able to focus on the code.  I started off with my symbol class files (i.e. tree.as, clouds.as, and rabbit.as).</p>
<p>There is very little in the rabbit class.  Just a boolean property called &#8220;moving&#8221; so that the small bit of code on frame one will work.</p>
<p>The <strong>clouds class</strong> is a different story.  I wanted to be able to create a new cloud and not have to worry about what type of cloud it was or how fast it would move.  So, I made my clouds class randomly child one of my four types of clouds:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">class</span> clouds <span class="kw3">extends</span> Sprite <span class="br0">&#123;</span></p>
<p><span class="kw3">public</span> <span class="kw2">var</span> vel:<span class="kw3">Number</span>;<br />
<span class="kw3">private</span> <span class="kw2">var</span> c:<span class="kw3">Number</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">function</span> clouds<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; c = <span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>c &gt; .<span class="nu0">85</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="co1">//15%</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">y</span> = <span class="nu0">140</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span><span class="kw2">new</span> cloudMad<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span>c &gt; .<span class="nu0">55</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="co1">//30%</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">y</span> = <span class="nu0">135</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span><span class="kw2">new</span> cloudCry<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span>c &gt; .<span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="co1">//25%</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">y</span> = <span class="nu0">80</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span><span class="kw2">new</span> cloudWhistle<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span> <span class="co1">//30%</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">y</span> = <span class="nu0">100</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span><span class="kw2">new</span> cloudSmile<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; vel = <span class="nu0">1</span> + <span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; addEventListener<span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, doNext<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw3">private</span> <span class="kw2">function</span> doNext<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">x</span> += vel;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">x</span> &gt; <span class="nu0">700</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; removeEventListener<span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, doNext<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; removeChildAt<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span class="br0">&#40;</span><span class="kw2">new</span> Event<span class="br0">&#40;</span>Event.<span class="me1">COMPLETE</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>Notice the variable <strong>vel</strong> being randomly set to a number between 1 and 2. Every frame the cloud will move to the right by <strong>vel</strong> pixels.  Since the stage is only 550 pixels long I wanted to delete the cloud once it&#8217;s definitely clear of the screen.  So I remove the child and the event listener and then dispatch a &#8220;complete&#8221; event so I can finish cleaning up somewhere else in my code.</p>
<p>The <strong>tree class</strong> is very similar to the <strong>cloud class</strong> in the respect that it handles it&#8217;s own movement.  But, there is an added complexity to the trees because 1.) I want to recycle them instead of delete them (actually it&#8217;s easier then deleting them), and 2.) The trees don&#8217;t move in a straight line across the screen like the clouds do.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">class</span> tree <span class="kw3">extends</span> Sprite <span class="br0">&#123;</span></p>
<p><span class="kw3">private</span> <span class="kw2">var</span> posY:<span class="kw3">Number</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">function</span> tree<span class="br0">&#40;</span>posY:<span class="kw3">Number</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; vel = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">y</span> = <span class="kw3">this</span>.<span class="me1">posY</span> = posY;<br />
&nbsp; &nbsp; &nbsp; &nbsp; addEventListener<span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, doNext<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw3">private</span> <span class="kw2">function</span> doNext<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">x</span> += vel*<span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">scaleX</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">x</span> &gt; <span class="nu0">700</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">x</span> = <span class="nu0">-150</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">x</span> &lt; <span class="nu0">-150</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">x</span> = <span class="nu0">700</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">y</span> = posY + <span class="nu0">925</span> &#8211; <span class="kw3">Math</span>.<span class="kw3">sqrt</span><span class="br0">&#40;</span><span class="nu0">925</span>*<span class="nu0">925</span> &#8211; <span class="kw3">Math</span>.<span class="kw3">pow</span><span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">x</span><span class="nu0">-275</span>, <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">rotation</span> = <span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">x</span> &#8211; <span class="nu0">275</span><span class="br0">&#41;</span>/<span class="nu0">18</span>;<br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>Multiplying the velocity (<strong>vel</strong>) by the scale (<strong>scaleX</strong>) will add to the illusion of depth.</p>
<p>In order to move my trees along the curvature of the land I first needed to find out the equation of that curve.  To me the curve looked a lot like a segment of a circle, so I just needed to find the radius of that circle.  To do that I zoomed out really far, drew a circle and then played around resizing it till it approximately fit the curve.  In the end I got a radius of 925 (which is actually slightly too big, but it&#8217;s close enough).<br />
Knowing that the <strong>equation of a circle is (X+xOffset)^2 + (Y+yOffset)^2 = R^2.</strong> <strong>Then the equation breaks down to Y = -yOffset + sqrt(R^2 &#8211; (X+xOffset)^2)</strong> and that&#8217;s pretty much what you see near the bottom of my code.  The operator signs (+/-) are different because in flash our coordinate plane is flipped vertically.</p>
<p>OK!  Now that I have (what tense/perspective was I writing in again?) my trees, clouds, and bunny that all take care of their own movement, it&#8217;s time I write the main code that adds everything to the stage.</p>
<p><a href="http://www.clickpopmedia.com/wp-content/uploads/2008/04/docprop.png"><img class="aligncenter size-full wp-image-236" title="docprop" src="http://www.clickpopmedia.com/wp-content/uploads/2008/04/docprop.png" alt="" width="500" height="118" /></a></p>
<p>Ever since I noticed that it was possible I&#8217;ve been writing all my code in external .AS files and then associating them with my document.</p>
<p>So, in my main code&#8217;s constructor I want to add my bunny and trees to the stage and maybe a new cloud every 5 seconds or so:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">class</span> main <span class="kw3">extends</span> <span class="kw3">MovieClip</span><span class="br0">&#123;</span><br />
<span class="kw3">public</span> <span class="kw2">var</span> bunny:<span class="kw3">MovieClip</span>;<br />
<span class="kw3">public</span> <span class="kw2">var</span> treeLayer1:Sprite;<br />
<span class="kw3">public</span> <span class="kw2">var</span> treeLayer2:Sprite;<br />
<span class="kw3">public</span> <span class="kw2">var</span> treeLayer3:Sprite;<br />
<span class="kw3">public</span> <span class="kw2">var</span> myTree:Sprite;<br />
<span class="kw3">public</span> <span class="kw2">var</span> myCloud:Sprite;<br />
<span class="kw3">public</span> <span class="kw2">var</span> cloudTimer:Timer;</p>
<p><span class="kw3">public</span> <span class="kw2">function</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; addTrees<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; addBunny<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cloudTimer = <span class="kw2">new</span> Timer<span class="br0">&#40;</span><span class="nu0">5000</span><span class="br0">&#41;</span>; <span class="co1">// Every 5 seconds without an end</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cloudTimer.<span class="me1">addEventListener</span><span class="br0">&#40;</span>TimerEvent.<span class="me1">TIMER</span>, addCloud<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; cloudTimer.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>KeyboardEvent.<span class="me1">KEY_DOWN</span>, keyDownHandler<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>KeyboardEvent.<span class="me1">KEY_UP</span>, keyUpHandler<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>Of course I need to start to watch for keyboard actions too so I added the event listeners for that.</p>
<p>My addTrees() function has to make 3 layers of trees with different amounts of blur (also to give the illusion of depth):</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> addTrees<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; treeLayer1 = <span class="kw2">new</span> Sprite<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; treeLayer2 = <span class="kw2">new</span> Sprite<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; treeLayer3 = <span class="kw2">new</span> Sprite<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">addChild</span><span class="br0">&#40;</span>treeLayer1<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">addChild</span><span class="br0">&#40;</span>treeLayer2<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">addChild</span><span class="br0">&#40;</span>treeLayer3<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> filter:BitmapFilter = <span class="kw2">new</span> BlurFilter<span class="br0">&#40;</span><span class="nu0">4</span>, <span class="nu0">4</span>, BitmapFilterQuality.<span class="me1">LOW</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> myFilters:<span class="kw3">Array</span> = <span class="kw2">new</span> <span class="kw3">Array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; myFilters.<span class="kw3">push</span><span class="br0">&#40;</span>filter<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; treeLayer1.<span class="me1">filters</span> = myFilters;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; filter = <span class="kw2">new</span> BlurFilter<span class="br0">&#40;</span><span class="nu0">2.5</span>, <span class="nu0">2.5</span>, BitmapFilterQuality.<span class="me1">LOW</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; myFilters &nbsp;= <span class="kw2">new</span> <span class="kw3">Array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; myFilters.<span class="kw3">push</span><span class="br0">&#40;</span>filter<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; treeLayer2.<span class="me1">filters</span> = myFilters;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> i=<span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i=<span class="nu0">0</span>; i&lt;<span class="nu0">4</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/*The value sent to tree(value) is the Y value at the hight of it&#8217;s curve.*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree = <span class="kw2">new</span> tree<span class="br0">&#40;</span><span class="nu0">280</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree.<span class="me1">scaleX</span> = .<span class="nu0">8</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree.<span class="me1">scaleY</span> = .<span class="nu0">8</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree.<span class="me1">x</span> = <span class="nu0">20</span> + <span class="br0">&#40;</span><span class="nu0">200</span>*i<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; treeLayer1.<span class="me1">addChild</span><span class="br0">&#40;</span>myTree<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i=<span class="nu0">0</span>; i&lt;<span class="nu0">3</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree = <span class="kw2">new</span> tree<span class="br0">&#40;</span><span class="nu0">300</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree.<span class="me1">scaleX</span> = .<span class="nu0">9</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree.<span class="me1">scaleY</span> = .<span class="nu0">9</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree.<span class="me1">x</span> = <span class="nu0">-20</span> + <span class="br0">&#40;</span><span class="nu0">300</span>*i<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; treeLayer2.<span class="me1">addChild</span><span class="br0">&#40;</span>myTree<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i=<span class="nu0">0</span>; i&lt;<span class="nu0">2</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree = <span class="kw2">new</span> tree<span class="br0">&#40;</span><span class="nu0">320</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTree.<span class="me1">x</span> = <span class="nu0">50</span> + <span class="br0">&#40;</span><span class="nu0">400</span>*i<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; treeLayer3.<span class="me1">addChild</span><span class="br0">&#40;</span>myTree<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>Adding the bunny to the stage is also really easy:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> addBunny<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bunny = <span class="kw2">new</span> rabbit<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">scaleX</span> = .<span class="nu0">5</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">scaleY</span> = .<span class="nu0">5</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">x</span> = <span class="nu0">275</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">y</span> = <span class="nu0">350</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">addChild</span><span class="br0">&#40;</span>bunny<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Our clouds&#8230;  since there aren&#8217;t ALWAYS clouds in the sky I figured I would only add a new cloud about 30% of the time every 5 seconds.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> addCloud<span class="br0">&#40;</span>event:TimerEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &gt; .<span class="nu0">7</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myCloud = <span class="kw2">new</span> clouds<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myCloud.<span class="me1">x</span> = <span class="nu0">-100</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myCloud.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">COMPLETE</span>, handleOffScreen<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">addChildAt</span><span class="br0">&#40;</span>myCloud, <span class="nu0">1</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw3">private</span> <span class="kw2">function</span> handleOffScreen<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">removeChild</span><span class="br0">&#40;</span>Sprite<span class="br0">&#40;</span>event.<span class="me1">currentTarget</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Also remembering to take care of the &#8220;complete&#8221; event that I dispatch from within my cloud object when it goes off stage.</p>
<p>Finally I just have to add my keyboard handling functions, which are really easy:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> keyDownHandler<span class="br0">&#40;</span>event:KeyboardEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>event.<span class="me1">keyCode</span> == <span class="nu0">39</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">//Right</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>!bunny.<span class="me1">moving</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">scaleX</span> = -.<span class="nu0">5</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">moving</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="kw3">play</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tree.<span class="me1">vel</span> = <span class="nu0">-4</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>event.<span class="me1">keyCode</span> == <span class="nu0">37</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">//Left</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>!bunny.<span class="me1">moving</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">scaleX</span> = .<span class="nu0">5</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">moving</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="kw3">play</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tree.<span class="me1">vel</span> = <span class="nu0">4</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw3">private</span> <span class="kw2">function</span> keyUpHandler<span class="br0">&#40;</span>event:KeyboardEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bunny.<span class="me1">moving</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; tree.<span class="me1">vel</span> = <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span></div>
<p>There it is!  I&#8217;ve given you almost all the code right there.  And if you want more, then download ALL the code here: <a href="http://www.clickpopmedia.com/wp-content/uploads/2008/04/springtime-animation.zip">Springtime Animation Source Code.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/04/04/spring-animation-with-actionscript-3/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Physics in ActionScript 3: Box2DFlashAS3</title>
		<link>http://www.clickpopmedia.com/2008/03/17/physics-in-actionscript-3/</link>
		<comments>http://www.clickpopmedia.com/2008/03/17/physics-in-actionscript-3/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 21:57:51 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Box2DFlash]]></category>
		<category><![CDATA[Intermediate]]></category>
		<category><![CDATA[Intro]]></category>
		<category><![CDATA[Physics]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/2008/03/17/physics-in-actionscript-3/</guid>
		<description><![CDATA[I wanted to try something fun with Flash this week, so I did a quick search for &#8220;Flash Physics Engine.&#8221; Lo and behold, I struck gold. Box2DFlashAS3 is an open source ActionScript 3.0 conversion of the C++ Physics Engine Box2D.  I&#8217;m very impressed with its well coded structure and easily implemented nature.  I [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to try something fun with Flash this week, so I did a quick search for &#8220;Flash Physics Engine.&#8221; Lo and behold, I struck gold. <a href="http://box2dflash.sourceforge.net/">Box2DFlashAS3</a> is an open source ActionScript 3.0 conversion of the C++ Physics Engine <a href="http://www.box2d.org">Box2D</a>.  I&#8217;m very impressed with its well coded structure and easily implemented nature.  I learned a few new things that will change how I code forever just by reading through their example files.<br />
<center><embed src="http://www.clickpopmedia.com/wp-content/uploads/2008/03/phystest.swf" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" menu="true" height="320" width="640"></embed></center><br />
Still, they have limited resources right now as far as help documentation goes (&#8221;Please refer to the source code from the examples provided to get an idea of how to use Box2DFlash in your projects.&#8221; &#8212; that&#8217;s the ReadMe.txt that comes with it&#8230; not very helpful,huh).  I thought I might give you an example of my own and walk through it step by step.<br />
<span id="more-115"></span><br />
That was the thought, but it has taken me all weekend to understand the engine well enough to explain how it works.  The beauty of it though, is you don&#8217;t have to understand how it works to use it.Now to get right into it then! First of all, in order to do anything with Box2DFlash you&#8217;re going to have to include most (if not all) of the files.  If you have the 349KB folder &#8220;Box2D&#8221; in your project folder, then your includes will work just like this:</p>
<div class="dean_ch" style="white-space: wrap;"> <span class="co1">// Classes used in this example</span><br />
&nbsp;<span class="kw3">import</span> Box2D.<span class="me1">Dynamics</span>.<span class="me1">*</span>;<br />
&nbsp;<span class="kw3">import</span> Box2D.<span class="me1">Collision</span>.<span class="me1">*</span>;<br />
&nbsp;<span class="kw3">import</span> Box2D.<span class="me1">Collision</span>.<span class="me1">Shapes</span>.<span class="me1">*</span>;<br />
&nbsp;<span class="kw3">import</span> Box2D.<span class="me1">Dynamics</span>.<span class="me1">Joints</span>.<span class="me1">*</span>;<br />
&nbsp;<span class="kw3">import</span> Box2D.<span class="me1">Dynamics</span>.<span class="me1">Contacts</span>.<span class="me1">*</span>;<br />
&nbsp;<span class="kw3">import</span> Box2D.<span class="me1">Common</span>.<span class="me1">*</span>;<br />
&nbsp;<span class="kw3">import</span> Box2D.<span class="me1">Common</span>.<span class="kw3">Math</span>.<span class="me1">*</span>;</div>
<p>Easy.</p>
<p>Now you have to create a b2World object (source code of the class is in Box2D/Dynamics/b2World.as).  The world object is the entire body of the engine.  Everything is contained within it once your are done.</p>
<p><em>NOTE: The brain of the engine is b2BroadPhase.as and the heart is the Step() function withing the world object.  Don&#8217;t go messing with the brain (b2BroadPhase.as) ever.  You will totally mess up the engine.<br />
</em><br />
The world object constructor requires 3 things:<br />
<strong>1.)</strong> A coordinate system in the form of a b2AABB class object.<br />
<strong>2.)</strong> A vector that defines gravity.  That will be in the form of a b2Vec2 class object.<br />
<strong>3.)</strong> A boolean variable that defines whether objects &#8220;sleep&#8221; or not. (I recommend you make it <strong>true</strong>, that they can sleep)</p>
<div class="dean_ch" style="white-space: wrap;"><span class="co1">// Create world AABB</span><br />
<span class="kw2">var</span> worldAABB:b2AABB = <span class="kw2">new</span> b2AABB<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
worldAABB.<span class="me1">minVertex</span>.<span class="kw3">Set</span><span class="br0">&#40;</span><span class="nu0">-1000.0</span>, <span class="nu0">-1000.0</span><span class="br0">&#41;</span>;<br />
worldAABB.<span class="me1">maxVertex</span>.<span class="kw3">Set</span><span class="br0">&#40;</span><span class="nu0">1000.0</span>, <span class="nu0">1000.0</span><span class="br0">&#41;</span>;</p>
<p><span class="co1">// Define the gravity vector</span><br />
<span class="kw2">var</span> gravity:b2Vec2 = <span class="kw2">new</span> b2Vec2<span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">300.0</span><span class="br0">&#41;</span>;</p>
<p><span class="co1">// Allow bodies to sleep</span><br />
<span class="kw2">var</span> doSleep:<span class="kw3">Boolean</span> = <span class="kw2">true</span>;</p>
<p><span class="co1">// Construct a world object</span><br />
m_world = <span class="kw2">new</span> b2World<span class="br0">&#40;</span>worldAABB, gravity, doSleep<span class="br0">&#41;</span>;</div>
<p>My examples are not my own here.  The code I&#8217;m showing is an excerpt from the &#8220;Hello World&#8221; code they provided with the engine.</p>
<p>After creating a world object you have to bring it to life by setting its heart to beating:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="co1">// Add event for main loop</span><br />
addEventListener<span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, Update, <span class="kw2">false</span>, <span class="nu0">0</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">function</span> Update<span class="br0">&#40;</span><span class="kw3">e</span>:Event<span class="br0">&#41;</span>:<span class="kw3">void</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; m_world.<span class="me1">Step</span><span class="br0">&#40;</span>m_timeStep, m_iterations<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Running the Step() function every frame will update all the Body Definitions you add to your world.<br />
As of right now this world is empty though.  In order to add balls and boxes and any strange polygonal shapes you can think of, we need to create Body Definitions for them.</p>
<p>A Body Definition consists of 2, 3, or 4 things.<br />
<strong> 1.)</strong> A Shape Definition.<br />
<strong> 2.) </strong>An (x,y) position.<br />
<em>optional:</em><br />
<strong> 3.) Rotation (in radians)<br />
4.) </strong>A pre-made Sprite object.</p>
<p>In the example flash movie at the beginning of this post you will notice that all the shapes are simple.  That&#8217;s because everything is being redrawn every frame with only lines and no fill.  That&#8217;s right,  EVERYTHING is made in code.  Nothing was drawn by hand.<br />
If you want your game, or whatever, to have a little more character then that example movie, then you will probably want to associate hand made Sprites with your Body Definitions.</p>
<p>In the &#8220;Hello World&#8221; example, they use Sprites to display their objects.  You could leave them invisible too if you really wanted. Either way they will still be accounted for in the calculations.</p>
<p>On to something very important.  What is a Shape Definition!?  We have 3 types of shape definition and they all extend the base b2ShapeDef class.</p>
<p>First we have the b2BoxDef class.  The b2BoxDef has 4 important properties:<br />
<strong> 1.) </strong>Extents &#8211; this is a vector that essentially goes from one corner of the box to the exact center.  In other words, half the width and hight. (box is a rectangle)<br />
<strong> 2.)</strong> Density &#8211; in the collision equations we use density * area = mass<br />
A density of 0 (zero) or null will make the object static and it will never move in the case of a collision or gravity.<br />
<strong> 3.) </strong>Friction &#8211; this is used to calculate the friction between 2 objects&#8230;  you should keep it between 0.0 and 1.0<br />
<strong> 4.) </strong>Restitution &#8211; this is the bounciness of the object.  Should probably also stay between 0.0 and 1.0</p>
<p>The b2CircleDef has only one differences in it&#8217;s properties.  Instead of Extents it has Radius, which is easy to remember.<br />
The b2PolyDef has an array of (max 8) vertices instead of Extents or Radius.  These vertices are just b2Vec2 vector objects.</p>
<p>Now Adding a bunch of objects to our world should be easy:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">var</span> bodyDef:b2BodyDef;<br />
<span class="kw2">var</span> boxDef:b2BoxDef;<br />
<span class="kw2">var</span> circleDef:b2CircleDef;</p>
<p><span class="co1">// Add ground body</span><br />
bodyDef = <span class="kw2">new</span> b2BodyDef<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
boxDef = <span class="kw2">new</span> b2BoxDef<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
boxDef.<span class="me1">extents</span>.<span class="kw3">Set</span><span class="br0">&#40;</span><span class="nu0">1000</span>, <span class="nu0">100</span><span class="br0">&#41;</span>;<br />
boxDef.<span class="me1">friction</span> = <span class="nu0">0.3</span>;<br />
<span class="coMULTI">/*Notice that the ground object has no density like the later<br />
definitions. &nbsp;That&#8217;s because it is static and we don&#8217;t want it<br />
effected by any forces.*/</span><br />
bodyDef.<span class="kw3">position</span>.<span class="kw3">Set</span><span class="br0">&#40;</span><span class="nu0">320</span>, <span class="nu0">400</span><span class="br0">&#41;</span>;<br />
bodyDef.<span class="me1">AddShape</span><span class="br0">&#40;</span>boxDef<span class="br0">&#41;</span>;</p>
<p><span class="co1">// Add sprite to body userData</span><br />
<span class="coMULTI">/*We have a Sprite object in the library called PhysGround. &nbsp;Here<br />
we are associating that with our body definition.*/</span><br />
bodyDef.<span class="me1">userData</span> = <span class="kw2">new</span> PhysGround<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
bodyDef.<span class="me1">userData</span>.<span class="kw3">width</span> = boxDef.<span class="me1">extents</span>.<span class="me1">x</span> * <span class="nu0">2</span>;<br />
bodyDef.<span class="me1">userData</span>.<span class="kw3">height</span> = boxDef.<span class="me1">extents</span>.<span class="me1">y</span> * <span class="nu0">2</span>;<br />
addChild<span class="br0">&#40;</span>bodyDef.<span class="me1">userData</span><span class="br0">&#41;</span>;<br />
m_world.<span class="me1">CreateBody</span><span class="br0">&#40;</span>bodyDef<span class="br0">&#41;</span>;</p>
<p><span class="co1">// Add some objects</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i:<span class="kw3">int</span> = <span class="nu0">1</span>; i &lt; <span class="nu0">20</span>; i++<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/*We are going to re-use the same bodyDef from before.<br />
&nbsp; &nbsp; &nbsp; &nbsp; It doesn&#8217;t matter now, because it&#8217;s already been copied and stored<br />
&nbsp; &nbsp; &nbsp; &nbsp; in our world object.*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bodyDef = <span class="kw2">new</span> b2BodyDef<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Box</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &lt; <span class="nu0">0.5</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boxDef = <span class="kw2">new</span> b2BoxDef<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boxDef.<span class="me1">extents</span>.<span class="kw3">Set</span><span class="br0">&#40;</span><span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="nu0">15</span> + <span class="nu0">10</span>, <span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="nu0">15</span> + <span class="nu0">10</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boxDef.<span class="me1">density</span> = <span class="nu0">1.0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boxDef.<span class="me1">friction</span> = <span class="nu0">0.5</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boxDef.<span class="me1">restitution</span> = <span class="nu0">0.2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="me1">AddShape</span><span class="br0">&#40;</span>boxDef<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/*We have a Sprite object in the library called PhysBox.*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="me1">userData</span> = <span class="kw2">new</span> PhysBox<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="me1">userData</span>.<span class="kw3">width</span> = boxDef.<span class="me1">extents</span>.<span class="me1">x</span> * <span class="nu0">2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="me1">userData</span>.<span class="kw3">height</span> = boxDef.<span class="me1">extents</span>.<span class="me1">y</span> * <span class="nu0">2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Circle</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; circleDef = <span class="kw2">new</span> b2CircleDef<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; circleDef.<span class="me1">radius</span> = <span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="nu0">15</span> + <span class="nu0">10</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; circleDef.<span class="me1">density</span> = <span class="nu0">1.0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; circleDef.<span class="me1">friction</span> = <span class="nu0">0.5</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; circleDef.<span class="me1">restitution</span> = <span class="nu0">0.2</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="me1">AddShape</span><span class="br0">&#40;</span>circleDef<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/*We have a Sprite object in the library called PhysCircle.*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="me1">userData</span> = <span class="kw2">new</span> PhysCircle<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="me1">userData</span>.<span class="kw3">width</span> = circleDef.<span class="me1">radius</span> * <span class="nu0">2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="me1">userData</span>.<span class="kw3">height</span> = circleDef.<span class="me1">radius</span> * <span class="nu0">2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="kw3">position</span>.<span class="me1">x</span> = <span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="nu0">400</span> + <span class="nu0">120</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; bodyDef.<span class="kw3">position</span>.<span class="me1">y</span> = <span class="kw3">Math</span>.<span class="kw3">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="nu0">100</span> + <span class="nu0">50</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; m_world.<span class="me1">CreateBody</span><span class="br0">&#40;</span>bodyDef<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span>bodyDef.<span class="me1">userData</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>That&#8217;s great isn&#8217;t it?  It&#8217;s really not that hard to add a whole bunch of objects to your world. You should know that the Step() function that we added earlier will only take care of moving and rotating our body definitions.  If we have sprites to represent those definitions then we need to update them manually&#8230;  they made the code for that easy and you can copy and paste it almost exactly into every one of your projects.<br />
We just have to rewrite our Update function from before:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">function</span> Update<span class="br0">&#40;</span><span class="kw3">e</span>:Event<span class="br0">&#41;</span>:<span class="kw3">void</span><span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; m_world.<span class="me1">Step</span><span class="br0">&#40;</span>m_timeStep, m_iterations<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Go through body list and update sprite positions/rotations</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> bb:b2Body = m_world.<span class="me1">m_bodyList</span>; bb; bb = bb.<span class="me1">m_next</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>bb.<span class="me1">m_userData</span> is Sprite<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bb.<span class="me1">m_userData</span>.<span class="me1">x</span> = bb.<span class="me1">m_position</span>.<span class="me1">x</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bb.<span class="me1">m_userData</span>.<span class="me1">y</span> = bb.<span class="me1">m_position</span>.<span class="me1">y</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bb.<span class="me1">m_userData</span>.<span class="me1">rotation</span> = bb.<span class="me1">m_rotation</span> * <span class="br0">&#40;</span><span class="nu0">180</span>/<span class="kw3">Math</span>.<span class="kw3">PI</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="coMULTI">/*This is an extreemly clever way to do this, and I suggest you copy it exactly in your own projects.*/</span></p>
<p><span class="br0">&#125;</span></div>
<p>That&#8217;s it for now.  We have objects in a world that can collide with each other and are affected by gravity.  There is still a lot more to talk about, but I am just walking you through the &#8220;Hello World&#8221; first.  We still need to cover Joints, Pulleys, Gears, Compound Shapes, Forced rotation (like cars tires), and a lot more&#8230;  I doubt I will be able to cover all these topics anytime soon, but I will definitely write more tutorials on this physics engine in the future.</p>
<p>You can download my copy of the &#8220;Hello World&#8221; example project with all of my comments included (there is almost no commenting in the original).</p>
<p><strong>Download</strong> <a href="http://www.clickpopmedia.com/wp-content/uploads/2008/03/hello-world.zip" title="Hello World with comments">Hello World w/ comments</a>.</p>
<p>You can get all of the library files needed for <a href="http://box2dflash.sourceforge.net/">Box2DFlash</a> at their site.  It&#8217;s free.</p>
<p>Credits:<br />
Box2D &#8211; Erin Catto ( <a href="http://gphysics.com/">http://gphysics.com/</a> )<br />
Box2DFlashAS3 &#8211; Matthew Bush (Flash ActionScript 3.0 port of Erin Catto&#8217;s work)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/03/17/physics-in-actionscript-3/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Putting &#8217;static&#8217; to good use.</title>
		<link>http://www.clickpopmedia.com/2008/03/03/putting-static-to-good-use/</link>
		<comments>http://www.clickpopmedia.com/2008/03/03/putting-static-to-good-use/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 23:00:34 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Just for Fun!]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Beginner]]></category>
		<category><![CDATA[Calculator]]></category>
		<category><![CDATA[Intermediate]]></category>
		<category><![CDATA[Static]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/2008/03/03/putting-static-to-good-use/</guid>
		<description><![CDATA[&#160;
I&#8217;m going to talk about how to build a simple 4 function calculator using static variables and meathods in Flash ActionScript 3.0.  This is my first tutorial, so if you have questions or comments, I would appreciate them and will do what I can.


First of all we want to think through how this is [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center">&nbsp;</p>
<p>I&#8217;m going to talk about how to build a simple 4 function calculator using static variables and meathods in Flash ActionScript 3.0.  This is my first tutorial, so if you have questions or comments, I would appreciate them and will do what I can.<br />
<center><embed src="http://www.clickpopmedia.com/wp-content/uploads/2008/02/calculator.swf" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" menu="true" height="220" width="210"></embed></center><br />
<span id="more-51"></span><br />
First of all we want to think through how this is going to work.  I wanted two types of buttons;  The digit buttons (1, 2, 3&#8230;) and the operator buttons (+, -, =&#8230;) and so I created 2 simple MovieClips that are almost the same as my base and then assigned them custom classes which I planned to make later.<br />
<a href="http://www.clickpopmedia.com/wp-content/uploads/2008/03/screen2.png" title="Library and Properties"><img src="http://www.clickpopmedia.com/wp-content/uploads/2008/03/screen2.png" alt="Library and Properties" /></a>The buttons are just a simple gray box with rounded corners (which doesn&#8217;t matter&#8230;  make it whatever you want) and a small textField with instance name &#8220;btnKey&#8221; (which does matter, at least for <em>my</em> code).<br />
<a href="http://www.clickpopmedia.com/wp-content/uploads/2008/03/screen.png" title="button makeup."><img src="http://www.clickpopmedia.com/wp-content/uploads/2008/03/screen.png" alt="button makeup." /></a><strong>None of that goes on the stage.</strong>   I want to add everything to the stage with code so that it&#8217;s a simple matter of giving them instance names and passing them their initial values.Just to give ourselves something to work with I filled in the basics of our button classes</p>
<div class="dean_ch" style="white-space: wrap;">package classes <span class="br0">&#123;</span><br />
<span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="kw3">MovieClip</span>;<br />
<span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">MouseEvent</span>;<br />
<span class="kw3">import</span> flash.<span class="kw3">text</span>.<span class="kw3">TextField</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">class</span> BaseDigitBtn <span class="kw3">extends</span> <span class="kw3">MovieClip</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> num:<span class="kw3">Number</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> BaseDigitBtn<span class="br0">&#40;</span>numP:<span class="kw3">Number</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">num</span> = numP;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; btnKey.<span class="kw3">text</span> = <span class="kw3">String</span><span class="br0">&#40;</span>numP<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mouseChildren = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buttonMode = <span class="kw2">true</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addEventListener<span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, <span class="kw3">OnRelease</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> <span class="kw3">OnRelease</span><span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/****I will decide what happens here later****/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>I pretty much use the same code for both <strong>BaseDigitBtn</strong> and <strong>BaseFuncBtn</strong>, only one receives a string var while the other receives a number.</p>
<div class="dean_ch" style="white-space: wrap;">&#8230;</p>
<p><span class="kw3">public</span> <span class="kw2">function</span> BaseFuncBtn<span class="br0">&#40;</span>disp:<span class="kw3">String</span>, strP:<span class="kw3">String</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">this</span>.<span class="me1">str</span> = strP;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;btnKey.<span class="kw3">text</span> = disp;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; mouseChildren = <span class="kw2">false</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;buttonMode = <span class="kw2">true</span>;</p>
<p><span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addEventListener<span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, <span class="kw3">OnRelease</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p>&#8230;</p></div>
<p>Now if we want we can write the code to put these buttons on the stage.  It&#8217;s only a few lines of code really that are copied and pasted till I&#8217;m blue in the face then with little added changes in each:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="coMULTI">/**Importing my 3 custom classes**/</span></p>
<p><span class="kw3">import</span> classes.<span class="me1">BaseDigitBtn</span>;</p>
<p><span class="kw3">import</span> classes.<span class="me1">BaseFuncBtn</span>;</p>
<p><span class="kw3">import</span> classes.<span class="me1">Calc</span>; &nbsp;<span class="co1">//I will talk about this class in a second&#8230; &nbsp;just hold on.Calc.clearField(); &nbsp;//I needed to initalize some variables</span></p>
<p><span class="coMULTI">/*************Creating all my button instances*********************/</span></p>
<p><span class="kw2">var</span> Btn1:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn2:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn3:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn4:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn5:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn6:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn7:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">7</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn8:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn9:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">9</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> Btn0:BaseDigitBtn = <span class="kw2">new</span> BaseDigitBtn<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;</p>
<p><span class="co1">//The first peram in the following declerations is what is displayed on the</span></p>
<p><span class="co1">//button. &nbsp;The second peram is the name of the opperator.</span></p>
<p><span class="kw2">var</span> BtnA:BaseFuncBtn = <span class="kw2">new</span> BaseFuncBtn<span class="br0">&#40;</span><span class="st0">&quot;+&quot;</span>, Calc.<span class="kw3">ADD</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> BtnS:BaseFuncBtn = <span class="kw2">new</span> BaseFuncBtn<span class="br0">&#40;</span><span class="st0">&quot;-&quot;</span>, Calc.<span class="me1">SUBTRACT</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> BtnM:BaseFuncBtn = <span class="kw2">new</span> BaseFuncBtn<span class="br0">&#40;</span><span class="st0">&quot;X&quot;</span>, Calc.<span class="me1">MULTIPLY</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> BtnD:BaseFuncBtn = <span class="kw2">new</span> BaseFuncBtn<span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span>, Calc.<span class="me1">DIVIDE</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> BtnE:BaseFuncBtn = <span class="kw2">new</span> BaseFuncBtn<span class="br0">&#40;</span><span class="st0">&quot;=&quot;</span>, Calc.<span class="me1">EQUALS</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> BtnC:BaseFuncBtn = <span class="kw2">new</span> BaseFuncBtn<span class="br0">&#40;</span><span class="st0">&quot;C&quot;</span>, Calc.<span class="kw3">CLEAR</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> BtnPN:BaseFuncBtn = <span class="kw2">new</span> BaseFuncBtn<span class="br0">&#40;</span><span class="st0">&quot;+/-&quot;</span>, Calc.<span class="me1">POS_NEG</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">var</span> BtnDec:BaseFuncBtn = <span class="kw2">new</span> BaseFuncBtn<span class="br0">&#40;</span><span class="st0">&quot;.&quot;</span>, Calc.<span class="me1">DECIMAL</span><span class="br0">&#41;</span>;</p>
<p><span class="coMULTI">/*****************Placing those buttons on the stage******************/</span></p>
<p><span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i = <span class="nu0">1</span>; i &lt; <span class="nu0">10</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp;addChild<span class="br0">&#40;</span><span class="kw3">this</span><span class="br0">&#91;</span><span class="st0">&quot;Btn&quot;</span> + i<span class="br0">&#93;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="kw3">this</span><span class="br0">&#91;</span><span class="st0">&quot;Btn&quot;</span>+i<span class="br0">&#93;</span>.<span class="me1">x</span> = <span class="nu0">10</span> + <span class="br0">&#40;</span><span class="br0">&#40;</span>i<span class="nu0">-1</span><span class="br0">&#41;</span>%<span class="nu0">3</span><span class="br0">&#41;</span>*<span class="nu0">50</span>;</p>
<p>&nbsp;<span class="kw3">this</span><span class="br0">&#91;</span><span class="st0">&quot;Btn&quot;</span>+i<span class="br0">&#93;</span>.<span class="me1">y</span> = <span class="nu0">10</span> + <span class="br0">&#40;</span><span class="kw3">int</span><span class="br0">&#40;</span><span class="br0">&#40;</span>i<span class="nu0">-1</span><span class="br0">&#41;</span>/<span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span>*<span class="nu0">34</span>;</p>
<p><span class="br0">&#125;</span></p>
<p>addChild<span class="br0">&#40;</span>BtnA<span class="br0">&#41;</span>;</p>
<p>BtnA.<span class="me1">x</span> = <span class="nu0">160</span>;</p>
<p>BtnA.<span class="me1">y</span> = <span class="nu0">10</span>;</p>
<p>addChild<span class="br0">&#40;</span>BtnS<span class="br0">&#41;</span>;</p>
<p>BtnS.<span class="me1">x</span> = <span class="nu0">160</span>;</p>
<p>BtnS.<span class="me1">y</span> = <span class="nu0">44</span>;</p>
<p>addChild<span class="br0">&#40;</span>BtnM<span class="br0">&#41;</span>;</p>
<p>BtnM.<span class="me1">x</span> = <span class="nu0">160</span>;</p>
<p>BtnM.<span class="me1">y</span> = <span class="nu0">78</span>;</p>
<p>addChild<span class="br0">&#40;</span>BtnD<span class="br0">&#41;</span>;</p>
<p>BtnD.<span class="me1">x</span> = <span class="nu0">160</span>;</p>
<p>BtnD.<span class="me1">y</span> = <span class="nu0">112</span>;</p>
<p>addChild<span class="br0">&#40;</span>BtnE<span class="br0">&#41;</span>;</p>
<p>BtnE.<span class="me1">x</span> = <span class="nu0">110</span>;</p>
<p>BtnE.<span class="me1">y</span> = <span class="nu0">112</span>;</p>
<p>addChild<span class="br0">&#40;</span>Btn0<span class="br0">&#41;</span>;</p>
<p>Btn0.<span class="me1">x</span> = <span class="nu0">60</span>;</p>
<p>Btn0.<span class="me1">y</span> = <span class="nu0">112</span>;</p>
<p>addChild<span class="br0">&#40;</span>BtnC<span class="br0">&#41;</span>;</p>
<p>BtnC.<span class="me1">x</span> = <span class="nu0">10</span>;</p>
<p>BtnC.<span class="me1">y</span> = <span class="nu0">112</span>;</p>
<p>addChild<span class="br0">&#40;</span>BtnPN<span class="br0">&#41;</span>;</p>
<p>BtnPN.<span class="me1">x</span> = <span class="nu0">110</span>;</p>
<p>BtnPN.<span class="me1">y</span> = <span class="nu0">146</span>;</p>
<p>addChild<span class="br0">&#40;</span>BtnDec<span class="br0">&#41;</span>;</p>
<p>BtnDec.<span class="me1">x</span> = <span class="nu0">60</span>;</p>
<p>BtnDec.<span class="me1">y</span> = <span class="nu0">146</span>;</p>
<p><span class="coMULTI">/**********A cheap (not the best, but good enough for us) easy way to keep the display refreshing******/</span></p>
<p>addEventListener<span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, <span class="kw3">OnEnterFrame</span><span class="br0">&#41;</span>;</p>
<p><span class="kw2">function</span> <span class="kw3">OnEnterFrame</span><span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></p>
<p>&nbsp;digitDisplay.<span class="kw3">text</span> = Calc.<span class="me1">getDispNum</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">//returns a string</span></p>
<p><span class="br0">&#125;</span></div>
<p>So, now that we&#8217;ve made all the basic buttons, it&#8217;s time to get into the heart of this calculator.   Everything happens in one class I called <strong>Calc.</strong><br />
First of all I want to explain that I usually like to make public static constants for a lot of my strings that I want to use as a parameter because it makes it easier to debug if you make a typo.  You saw them being used when I created the instances of my operator buttons and here they are being declared in my <strong>Calc</strong> class:</p>
<div class="dean_ch" style="white-space: wrap;">package classes <span class="br0">&#123;</span></p>
<p><span class="kw3">public</span> <span class="kw2">class</span> Calc <span class="br0">&#123;</span></p>
<p>&nbsp;<span class="coMULTI">/*****Useing these makes debuging easier and is good practice****/</span></p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const <span class="kw3">ADD</span>:<span class="kw3">String</span> = <span class="st0">&quot;add&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const SUBTRACT:<span class="kw3">String</span> = <span class="st0">&quot;subtract&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const MULTIPLY:<span class="kw3">String</span> = <span class="st0">&quot;multiply&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const DIVIDE:<span class="kw3">String</span> = <span class="st0">&quot;divide&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const EQUALS:<span class="kw3">String</span> = <span class="st0">&quot;equals&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const <span class="kw3">CLEAR</span>:<span class="kw3">String</span> = <span class="st0">&quot;clear&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const DECIMAL:<span class="kw3">String</span> = <span class="st0">&quot;decimal&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const POS_NEG:<span class="kw3">String</span> = <span class="st0">&quot;positive/negative&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const <span class="kw3">SQRT</span>:<span class="kw3">String</span> = <span class="st0">&quot;sqrt&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const SQUARE:<span class="kw3">String</span> = <span class="st0">&quot;square&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const POWER:<span class="kw3">String</span> = <span class="st0">&quot;power&quot;</span>;</p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> const BACK:<span class="kw3">String</span> = <span class="st0">&quot;back&quot;</span>;&nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">var</span> <span class="kw3">isActive</span>:<span class="kw3">Boolean</span>; &nbsp;<span class="co1">//Used to tell me what to display, the total or the number being entered.</span></p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">var</span> activeNum:<span class="kw3">Number</span>; &nbsp;<span class="co1">//The number being entered.</span></p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">var</span> decVal:<span class="kw3">Number</span>;&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Used to place the next decimal at the Nth place.</span></p>
<p><span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">var</span> total:<span class="kw3">Number</span>;</p>
<p>&nbsp;<span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">var</span> activeFunc:<span class="kw2">Function</span>; <span class="co1">//Points to the opporator function currently active.</span></p>
<p><span class="kw3">public</span> <span class="kw2">function</span> Calc<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> &nbsp;<span class="co1">//This constructor isn&#8217;t really used.</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;clearField<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p><span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> clearField<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span> &nbsp;<span class="co1">//Resets the calculator.</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;total = <span class="nu0">0</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;activeNum = <span class="nu0">0</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isActive</span> = <span class="kw2">false</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;decVal = <span class="nu0">-1</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;activeFunc = addition;</p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p><span class="coMULTI">/*This meathod is called from the BaseFuncBtn class and is passed</p>
<p>&nbsp;the operator name of the key. &nbsp;Value received should be one of the</p>
<p>&nbsp;public constants declared earlier in this class.*/</span></p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> funcKey<span class="br0">&#40;</span>str:<span class="kw3">String</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></p>
<p><span class="kw1">switch</span><span class="br0">&#40;</span>str<span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;add&quot;</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; equals<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; activeFunc = addition;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;subtract&quot;</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; equals<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; activeFunc = subtraction;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;multiply&quot;</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; equals<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; activeFunc = multiplication;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;divide&quot;</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; equals<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; activeFunc = division;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;clear&quot;</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isActive</span><span class="br0">&#41;</span><span class="br0">&#123;</span> &nbsp;<span class="co1">//If you made a mistake while entering a number, this will forgive you a little.</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">isActive</span> = <span class="kw2">false</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; activeNum = <span class="nu0">0</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; clearField<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;equals&quot;</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">isActive</span> = <span class="kw2">true</span>; <span class="co1">//Set to &#8216;true&#8217; so you can repeat the last opperation over and over.</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; equals<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;decimal&quot;</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>decVal &lt; <span class="nu0">0</span><span class="br0">&#41;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; decVal = <span class="nu0">0</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;positive/negative&quot;</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isActive</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; activeNum *= <span class="nu0">-1</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; total *= <span class="nu0">-1</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">default</span>:</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span><span class="st0">&quot;Something went wrong. &nbsp;String was: &quot;</span> + str<span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p><span class="coMULTI">/*Called from the stage and is used to display the current values*/</span></p>
<p>&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> getDispNum<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">String</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>decVal &lt; <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isActive</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#40;</span>activeNum<span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#40;</span>total<span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/*If decVal is &gt;= 0 then isActive WILL be true, so this code</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; here isn&#8217;t all needed. But, it&#8217;s not hurting anything either&#8230;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; The computer was rounding decimals off weird (i.e. instead of 2.3</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; it would have something like 2.300000012) so I need .toFixed() for</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; the active number being entered.*/</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isActive</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#40;</span>activeNum.<span class="me1">toFixed</span><span class="br0">&#40;</span>decVal<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#40;</span>total.<span class="me1">toFixed</span><span class="br0">&#40;</span>decVal<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p><span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> equals<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isActive</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; total = activeFunc<span class="br0">&#40;</span>total, activeNum<span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">isActive</span> = <span class="kw2">false</span>; &nbsp; <span class="co1">//Set to &#8216;false&#8217; so you can change your mind about the next opperation without re-calculating</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; decVal = <span class="nu0">-1</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p><span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> addition<span class="br0">&#40;</span>num1:<span class="kw3">Number</span>, num2:<span class="kw3">Number</span><span class="br0">&#41;</span>:<span class="kw3">Number</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span><span class="br0">&#40;</span>num1 + num2<span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> subtraction<span class="br0">&#40;</span>num1:<span class="kw3">Number</span>, num2:<span class="kw3">Number</span><span class="br0">&#41;</span>:<span class="kw3">Number</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span><span class="br0">&#40;</span>num1 &#8211; num2<span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> multiplication<span class="br0">&#40;</span>num1:<span class="kw3">Number</span>, num2:<span class="kw3">Number</span><span class="br0">&#41;</span>:<span class="kw3">Number</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span><span class="br0">&#40;</span>num1 * num2<span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> division<span class="br0">&#40;</span>num1:<span class="kw3">Number</span>, num2:<span class="kw3">Number</span><span class="br0">&#41;</span>:<span class="kw3">Number</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span><span class="br0">&#40;</span>num1 / num2<span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p><span class="br0">&#125;</span></p>
<p><span class="br0">&#125;</span></div>
<p>Notice that almost everything in that class is STATIC.   This is so we don&#8217;t have to create an instance of the class to use them.   For example, in my <strong>OnEnterFrame</strong> function I used <strong>digitDisplay.text = Calc.getDispNum();</strong>  The <strong>digitDisplay</strong> is an instance of a textField that I put on the stage, while <strong>Calc</strong> is just my class.</p>
<p>The last thing that needs to be done is entering a little bit of code that needs to be run when you click a button.  That was some fun code to come up with (not really):</p>
<div class="dean_ch" style="white-space: wrap;"><span class="coMULTI">/******In the BaseDigitBtn class********/</span></p>
<p>&nbsp;<span class="kw3">private</span> <span class="kw2">function</span> <span class="kw3">OnRelease</span><span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="coMULTI">/*This just resets the active number before the next opperation. &nbsp;I don&#8217;t</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;want to erase the old active number till the last second so that I can</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;repeat the last opperation by pressing equals again.*/</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>!Calc.<span class="kw3">isActive</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Calc.<span class="me1">activeNum</span> = <span class="nu0">0</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>Calc.<span class="me1">decVal</span> &lt; <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Calc.<span class="me1">activeNum</span> &gt;= <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Calc.<span class="me1">activeNum</span> = Calc.<span class="me1">activeNum</span> * <span class="nu0">10</span> + num;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Calc.<span class="me1">activeNum</span> = Calc.<span class="me1">activeNum</span> * <span class="nu0">10</span> &#8211; num;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Calc.<span class="me1">decVal</span> &lt; <span class="nu0">20</span><span class="br0">&#41;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Calc.<span class="me1">decVal</span>++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Decimals are annoying.</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Calc.<span class="me1">activeNum</span> &gt;= <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Calc.<span class="me1">activeNum</span> = Calc.<span class="me1">activeNum</span> + <span class="br0">&#40;</span>num / <span class="kw3">Math</span>.<span class="kw3">pow</span><span class="br0">&#40;</span><span class="nu0">10</span>, Calc.<span class="me1">decVal</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Calc.<span class="me1">activeNum</span> = Calc.<span class="me1">activeNum</span> &#8211; <span class="br0">&#40;</span>num / <span class="kw3">Math</span>.<span class="kw3">pow</span><span class="br0">&#40;</span><span class="nu0">10</span>, Calc.<span class="me1">decVal</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Calc.<span class="kw3">isActive</span> = <span class="kw2">true</span>;</p>
<p>&nbsp;<span class="br0">&#125;</span></p>
<p><span class="coMULTI">/************And in the BaseFuncBtn class**********/</span></p>
<p>&nbsp;<span class="kw3">private</span> <span class="kw2">function</span> <span class="kw3">OnRelease</span><span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Calc.<span class="me1">funcKey</span><span class="br0">&#40;</span>str<span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="br0">&#125;</span></div>
<p>A quick explination of the BaseDigitBtn&#8217;s OnRelease function and then we are done:<br />
Entering numbers on a calculator always places the new digit to the far right.  That is easy to take care of by multiplying by 10 to shift what you have to the left and then adding your new number&#8230; untill you try to enter decimals.  With decimals you have to divide by the next highest power of 10 for every spot you move to the right and this can cause some rounding errors.  I take care of that in <strong>Calc.getDispNum();</strong> with the <strong>.toFixed()</strong> which will cut it off and not show the 12,000,000th of a unit that it&#8217;s off.</p>
<p><strong>You can download the source files for this tutorial here:</strong> <a href="http://www.clickpopmedia.com/wp-content/uploads/2008/03/calculator.zip" title="Calculator Flash Source">Calculator Flash Source</a></p>
<p>It shouldn&#8217;t take long at all to add a square root operator key or sin/cos/tan keys.  Try it yourself.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/03/03/putting-static-to-good-use/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

