<?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; Asteroids</title>
	<atom:link href="http://www.clickpopmedia.com/tag/asteroids/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>Collision Detection and Game Design</title>
		<link>http://www.clickpopmedia.com/2008/07/07/collision-detection-and-game-design/</link>
		<comments>http://www.clickpopmedia.com/2008/07/07/collision-detection-and-game-design/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 23:58:21 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Asteroids]]></category>
		<category><![CDATA[Collision Detection]]></category>
		<category><![CDATA[Game Development]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/?p=353</guid>
		<description><![CDATA[

This is the second step in my series of tutorial, the first being Easy Keyboard Controls and Game Design. In this tutorial I will be building on what we already have, adding asteroids and the ability to crash into them.
I&#8217;ve made a few minor changes to the original code and graphics since the last tutorial, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><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/07/asteroids.swf" /><embed type="application/x-shockwave-flash" width="550" height="400" src="http://www.clickpopmedia.com/wp-content/uploads/2008/07/asteroids.swf"></embed></object></p>
<p style="text-align: left;">
This is the second step in my series of tutorial, the first being <a href="http://www.clickpopmedia.com/2008/06/25/easy-keyboard-controls-and-game-design/">Easy Keyboard Controls and Game Design</a>. In this tutorial I will be building on what we already have, adding asteroids and the ability to crash into them.<br />
<span id="more-353"></span>I&#8217;ve made a few minor changes to the original code and graphics since the last tutorial, but nothing big.</p>
<p>So I create a MovieClip with 3 frames and a different asteroid shape on each frame (you could have more or less if you wanted).  I give the asteroids their own class since each is going to have to move independently.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw3">static</span> const LARGE:<span class="kw3">String</span> = <span class="st0">&quot;large&quot;</span>;<br />
<span class="kw3">public</span> <span class="kw3">static</span> const MEDIUM:<span class="kw3">String</span> = <span class="st0">&quot;medium&quot;</span>;<br />
<span class="kw3">public</span> <span class="kw3">static</span> const SMALL:<span class="kw3">String</span> = <span class="st0">&quot;small&quot;</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">var</span> speedX:<span class="kw3">Number</span>;<br />
<span class="kw3">public</span> <span class="kw2">var</span> speedY:<span class="kw3">Number</span>;<br />
<span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">size</span>:<span class="kw3">String</span>;<br />
&#8230;<br />
<span class="kw3">public</span> <span class="kw2">function</span> Move<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; <span class="kw3">this</span>.<span class="me1">x</span> += speedX;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">y</span> += speedY;<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> &gt; <span class="nu0">550</span> + <span class="kw3">this</span>.<span class="kw3">width</span>/<span class="nu0">2</span><span class="br0">&#41;</span> <span class="kw3">this</span>.<span class="me1">x</span> = -<span class="kw3">this</span>.<span class="kw3">width</span>/<span class="nu0">2</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="kw3">this</span>.<span class="kw3">width</span>/<span class="nu0">2</span><span class="br0">&#41;</span> <span class="kw3">this</span>.<span class="me1">x</span> = <span class="nu0">550</span> + <span class="kw3">this</span>.<span class="kw3">width</span>/<span class="nu0">2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">y</span> &gt; <span class="nu0">400</span> + <span class="kw3">this</span>.<span class="kw3">height</span>/<span class="nu0">2</span><span class="br0">&#41;</span> <span class="kw3">this</span>.<span class="me1">y</span> = -<span class="kw3">this</span>.<span class="kw3">height</span>/<span class="nu0">2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">y</span> &lt; -<span class="kw3">this</span>.<span class="kw3">height</span>/<span class="nu0">2</span><span class="br0">&#41;</span> <span class="kw3">this</span>.<span class="me1">y</span> = <span class="nu0">400</span> + <span class="kw3">this</span>.<span class="kw3">height</span>/<span class="nu0">2</span>;<br />
<span class="br0">&#125;</span></div>
<p>What I&#8217;ve done here is give my Asteroid class X and Y speed properties that work with the <strong>Move()</strong> method for motion.  I intend to call the <strong>Move()</strong> method for each asteroid in the <strong>MainLoop()</strong> function.</p>
<p>On creation (in the constructor) I want to know if this asteroid is actually a piece of a larger asteroid or not.  If it is I&#8217;m going to be passing it the base asteroid that this one is breaking off of to use it&#8217;s X:Y coordinates and speed, plus to know what size to make the new asteroid.</p>
<p>Now back to the <strong>Main</strong> class (in the <a href="http://www.clickpopmedia.com/2008/06/25/easy-keyboard-controls-and-game-design/">last tutorial</a> I called this the <strong>Asteroids</strong> class but changed it to <strong>Main</strong> since I wanted an <strong>Asteroid</strong> class).</p>
<p>We need to keep track of our asteroids.  To do that we will use an <strong>Array</strong>.  We will add this to the <strong>Main</strong> constructor:</p>
<div class="dean_ch" style="white-space: wrap;"><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; dCount = <span class="nu0">0</span>;<br />
&#8230;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="me1">refresh_tf</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, resetGame<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; asteroids = <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; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i:<span class="kw3">int</span> = <span class="nu0">0</span>; i&lt;<span class="nu0">6</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; asteroids.<span class="kw3">push</span><span class="br0">&#40;</span><span class="kw2">new</span> Asteroid<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">stage</span>.<span class="me1">addChild</span><span class="br0">&#40;</span>asteroids<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>This is just adding 6 asteroids to the stage and giving a click event to a reset button I decided to add.<br />
<strong>dCount</strong> stands for Death Count with an obvious purpose.</p>
<p>The <strong>resetGame()</strong> function is just resetting all the properties to the default.  I still have to make sure to remove all the asteroids before adding all new ones, but that&#8217;s it.</p>
<p>I moved the contents of the <strong>MainLoop()</strong> from the <a href="http://www.clickpopmedia.com/2008/06/25/easy-keyboard-controls-and-game-design/">previous tutorial</a> into a function called <strong>shipControl()</strong> which is now being called from the new <strong>MainLoop()</strong>;</p>
<p>Our revised <strong>MainLoop()</strong> method is as follows:</p>
<div class="dean_ch" style="white-space: wrap;">protected <span class="kw2">function</span> MainLoop<span class="br0">&#40;</span><span class="kw3">e</span>:TimerEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i <span class="kw1">in</span> asteroids<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; asteroids<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">Move</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>dead<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; deathTime&#8211;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>deathTime &lt;=<span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dead = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; invincibleTime = <span class="nu0">150</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; invincible = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span>ship_mc<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="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shipControl<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>!invincible<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; collisionCheck<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">e</span>.<span class="me1">currentTarget</span>.<span class="me1">currentCount</span>%<span class="nu0">10</span> == <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ship_mc.<span class="kw3">visible</span> = <span class="br0">&#40;</span>ship_mc.<span class="kw3">visible</span><span class="br0">&#41;</span>? <span class="kw2">false</span>: <span class="kw2">true</span>;<br />
&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; invincibleTime&#8211;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>invincibleTime &lt;= <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ship_mc.<span class="kw3">visible</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; invincible = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</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></div>
<p>These nested <strong>if..else</strong> statements are here to handle death and resurrection (RIGHT ON!).</p>
<p>So we have our asteroids flying about the screen, but we have yet to make them destroy your ship.  You should notice above the call for to a method call <strong>collisionCheck()</strong>;<br />
Here is that function now:</p>
<div class="dean_ch" style="white-space: wrap;">protected <span class="kw2">function</span> collisionCheck<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; <span class="kw2">var</span> p1:Point = <span class="kw2">new</span> Point<span class="br0">&#40;</span>ship_mc.<span class="me1">p1</span>.<span class="me1">x</span>, ship_mc.<span class="me1">p1</span>.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; p1 = ship_mc.<span class="kw3">localToGlobal</span><span class="br0">&#40;</span>p1<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> p2:Point = <span class="kw2">new</span> Point<span class="br0">&#40;</span>ship_mc.<span class="me1">p2</span>.<span class="me1">x</span>, ship_mc.<span class="me1">p2</span>.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; p2 = ship_mc.<span class="kw3">localToGlobal</span><span class="br0">&#40;</span>p2<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> p3:Point = <span class="kw2">new</span> Point<span class="br0">&#40;</span>ship_mc.<span class="me1">p3</span>.<span class="me1">x</span>, ship_mc.<span class="me1">p3</span>.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; p3 = ship_mc.<span class="kw3">localToGlobal</span><span class="br0">&#40;</span>p3<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> p4:Point = <span class="kw2">new</span> Point<span class="br0">&#40;</span>ship_mc.<span class="me1">p4</span>.<span class="me1">x</span>, ship_mc.<span class="me1">p4</span>.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; p4 = ship_mc.<span class="kw3">localToGlobal</span><span class="br0">&#40;</span>p4<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> p5:Point = <span class="kw2">new</span> Point<span class="br0">&#40;</span>ship_mc.<span class="me1">p5</span>.<span class="me1">x</span>, ship_mc.<span class="me1">p5</span>.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; p5 = ship_mc.<span class="kw3">localToGlobal</span><span class="br0">&#40;</span>p5<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i <span class="kw1">in</span> asteroids<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><span class="br0">&#40;</span>asteroids<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">hitTestPoint</span><span class="br0">&#40;</span>p1.<span class="me1">x</span>, p1.<span class="me1">y</span>, <span class="kw2">true</span><span class="br0">&#41;</span> ||<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; asteroids<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">hitTestPoint</span><span class="br0">&#40;</span>p2.<span class="me1">x</span>, p2.<span class="me1">y</span>, <span class="kw2">true</span><span class="br0">&#41;</span> ||<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; asteroids<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">hitTestPoint</span><span class="br0">&#40;</span>p3.<span class="me1">x</span>, p3.<span class="me1">y</span>, <span class="kw2">true</span><span class="br0">&#41;</span> ||<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; asteroids<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">hitTestPoint</span><span class="br0">&#40;</span>p4.<span class="me1">x</span>, p4.<span class="me1">y</span>, <span class="kw2">true</span><span class="br0">&#41;</span> ||<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; asteroids<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">hitTestPoint</span><span class="br0">&#40;</span>p5.<span class="me1">x</span>, p5.<span class="me1">y</span>, <span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp;amp;&amp;amp; !dead<span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; destroyShip<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; remove<span class="br0">&#40;</span>i<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><br />
<span class="br0">&#125;</span></div>
<p>Each asteroid does a <strong>hitTest</strong> with each point on my <strong>ship_mc</strong>.  It&#8217;s important that I&#8217;m using <strong>hitTestPoint()</strong> here because it is capable of checking based on the actual shape of the movie clip.  A regular <strong>hitTest</strong> between two <strong>MovieClips</strong> will only check to see if the bounding boxes are overlapping&#8230;  in our case that could still be quite 20 pixels or more away from an actual collision.  This is exactly what makes realistic 2D physics so difficult in ActionScript.</p>
<p>Anyways, the Hit Test may be a little buggy in some cases, but <strong>hitTestPoint</strong> works pretty well for us here.  After we detect a hit of course we have to destroy the ship and asteroid and set the death timer.  the <strong>destroyShip()</strong> function is trivial enough, but I would like to take a quick look at a line from the remove() method:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">stage</span>.<span class="me1">addChild</span><span class="br0">&#40;</span>asteroids<span class="br0">&#91;</span>asteroids.<span class="kw3">push</span><span class="br0">&#40;</span><span class="kw2">new</span> Asteroid<span class="br0">&#40;</span>asteroids<span class="br0">&#91;</span>num<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
<p>I really just need to explain how this slightly complicated jumble works.  Reading this from the inner most parenthases out;</p>
<p>We are creating a new Asteroid object (passing it our parent asteroid that has just been destroyed).<br />
<strong>new Asteroid(asteroids[num])</strong></p>
<p>We add that Asteroid object to the end of our asteroids Array which is returning the new length of the Array.<br />
<strong>asteroids.push(&#8230;)</strong></p>
<p>We then use that new length (minus 1) to add our newest asteroid to the stage.<br />
<strong>stage.addChild(asteroids[...-1]);</strong></p>
<p>Eh, see now?  Collision detection is easy!  I think my next installment might be a little more interesting when I add levels, lives, and a scoring system.</p>
<p>&#8230;  No bullets you ask?  Well that&#8217;s just an extension of what I&#8217;ve already written here right?  The only extra thing you have to remember is that the bullets have a limited lifespan.</p>
<p>If you are still confused and can&#8217;t do it on your own (if you want to <em>learn</em> you really aught to at least try) then you can always check out the finished source when it&#8217;s released.</p>
<p>The source code for the example in this tutorial can be found here: <a href="http://www.clickpopmedia.com/wp-content/uploads/2008/07/asteroidsv2source.rar">Asteroids &#8211; V2 Source</a></p>
<p><a href="http://www.clickpopmedia.com/2008/06/25/easy-keyboard-controls-and-game-design/">&lt; Lesson 1: Easy Keyboard Controls and Game Design</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/07/07/collision-detection-and-game-design/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Easy Keyboard Controls and Game Design</title>
		<link>http://www.clickpopmedia.com/2008/06/25/easy-keyboard-controls-and-game-design/</link>
		<comments>http://www.clickpopmedia.com/2008/06/25/easy-keyboard-controls-and-game-design/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 01:21:07 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Asteroids]]></category>
		<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Keyboard]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/?p=340</guid>
		<description><![CDATA[
In this tutorial I will be going over some of the basic elements to making a game in Flash. This being the first in a short series of tutorials on the subject, I will cover the main game loop and keyboard controls.

First off we need to set up some simple graphics.  I did some [...]]]></description>
			<content:encoded><![CDATA[<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/06/asteroids.swf" /><embed type="application/x-shockwave-flash" width="550" height="400" src="http://www.clickpopmedia.com/wp-content/uploads/2008/06/asteroids.swf"></embed></object><br />
In this tutorial I will be going over some of the basic elements to making a game in Flash. This being the first in a short series of tutorials on the subject, I will cover the main game loop and keyboard controls.<br />
<span id="more-340"></span><br />
First off we need to set up some simple graphics.  I did some REALLY simple graphics as you can see.  The <strong>ship_mc</strong> being just a triangle and on the 3rd frame of the ship movie clip it get&#8217;s a little fire tail.  Since I am just imitating <em>Atari Interactive, Inc.</em>&#8217;s<em> Asteroids</em>, we don&#8217;t really need anything more then that for now.<br />
Now, to get our initial code setup:</p>
<div class="dean_ch" style="white-space: wrap;">package <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">*</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">*</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="kw3">text</span>.<span class="me1">*</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">utils</span>.<span class="me1">Timer</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">class</span> Asteroids <span class="kw3">extends</span> <span class="kw3">MovieClip</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">var</span> mainTimer:Timer;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> Asteroids<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mainTimer = <span class="kw2">new</span> Timer<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mainTimer.<span class="me1">addEventListener</span><span class="br0">&#40;</span>TimerEvent.<span class="me1">TIMER</span>, MainLoop<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ship_mc.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &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">DEACTIVATE</span>, deactive<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &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">ACTIVATE</span>, active<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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>, kDown<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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>, kUp<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">function</span> MainLoop<span class="br0">&#40;</span><span class="kw3">e</span>:TimerEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">function</span> deactive<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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mainTimer.<span class="kw3">stop</span><span class="br0">&#40;</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; &nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">function</span> active<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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mainTimer.<span class="kw3">start</span><span class="br0">&#40;</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; &nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">function</span> kDown<span class="br0">&#40;</span><span class="kw3">e</span>:KeyboardEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">function</span> kUp<span class="br0">&#40;</span><span class="kw3">e</span>:KeyboardEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</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></div>
<p>So far this is just a skeleton of our game.  We have our <strong>KEY_DOWN</strong> and <strong>KEY_UP</strong> events which will handle all of our keyboard controls later.  But, more importantly, we have our <strong>mainTimer</strong>.  By setting up our game engine to run based on a timer I can later change the frame rate without changing the game dynamics (I left the frame rate at 12/sec for the example above).  This is also useful if your game has too many graphical elements and the frame rate drops on some machines, this will preserve the speed of the game itself.<br />
So, please notice that I have the Timer set to &#8220;tick&#8221; every 20 milliseconds (1000 milliseconds to 1 seconds) which is about 50 ticks per second. Because of that, we are going to have some small values to work with when playing with flight speed and rotation in our ship.<br />
But, first let us think about keyboard controls:</p>
<div class="dean_ch" style="white-space: wrap;">protected <span class="kw2">var</span> thrust:<span class="kw3">Boolean</span>;<br />
protected <span class="kw2">var</span> rpm:<span class="kw3">Number</span>;<br />
protected <span class="kw2">function</span> kDown<span class="br0">&#40;</span><span class="kw3">e</span>:KeyboardEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
<span class="co1">//&nbsp; &nbsp; &nbsp; trace(e.keyCode);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">37</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">65</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rpm = <span class="nu0">-4</span>;<br />
<span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;LEFT&quot;);</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">e</span>.<span class="me1">keyCode</span> == <span class="nu0">38</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">87</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">104</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thrust = <span class="kw2">true</span>;<br />
<span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;UP&quot;);</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">e</span>.<span class="me1">keyCode</span> == <span class="nu0">39</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">68</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">102</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rpm = <span class="nu0">4</span>;<br />
<span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;RIGHT&quot;);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
protected <span class="kw2">function</span> kUp<span class="br0">&#40;</span><span class="kw3">e</span>: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><span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">37</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">65</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rpm = <span class="nu0">0</span>;<br />
<span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;LEFT&quot;);</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">e</span>.<span class="me1">keyCode</span> == <span class="nu0">38</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">87</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">104</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thrust = <span class="kw2">false</span>;<br />
<span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;UP&quot;);</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">e</span>.<span class="me1">keyCode</span> == <span class="nu0">39</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">68</span> || <span class="kw3">e</span>.<span class="me1">keyCode</span> == <span class="nu0">102</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rpm = <span class="nu0">0</span>;<br />
<span class="co1">//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;RIGHT&quot;);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p><strong>rpm</strong> and <strong>thrust</strong> are going to control our ships flight in the <strong>MainLoop</strong> later.  The <strong>keyCode</strong> is a number which represents the key being pressed or released on the keyboard.  I prefer to set a value on down because the <strong>KEY_DOWN</strong> event will be fired off numerous times very quickly if the key is held too long.  I have the controls set up to work with WASD, the arrow keys, or the num pad.<br />
To find the key values I just traced <strong>e.keyCode</strong> in the <strong>kUp()</strong> function and tried pressing the keys in question.  This got me the numbers you see in the code above.  The commented out traces are there to make sure we have the correct keys, since we don&#8217;t have any other indicator yet.</p>
<p>The next step is a simple one (except for some of the math):</p>
<div class="dean_ch" style="white-space: wrap;">protected const TOP_SPEED:<span class="kw3">Number</span> = <span class="nu0">10</span>;<br />
protected const ACCELERATION:<span class="kw3">Number</span> = .<span class="nu0">1</span>;<br />
protected const FRICTION:<span class="kw3">Number</span> = .<span class="nu0">995</span>;</p>
<p>protected <span class="kw2">var</span> mainTimer:Timer;<br />
protected <span class="kw2">var</span> speedX:<span class="kw3">Number</span>;<br />
protected <span class="kw2">var</span> speedY:<span class="kw3">Number</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">function</span> Asteroids<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; rpm = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; speedX = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; speedY = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#8230;<br />
<span class="br0">&#125;</span></p>
<p>protected <span class="kw2">function</span> MainLoop<span class="br0">&#40;</span><span class="kw3">e</span>:TimerEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ship_mc.<span class="me1">rotation</span> += rpm;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> dx:<span class="kw3">Number</span> = ACCELERATION * <span class="kw3">Math</span>.<span class="kw3">cos</span><span class="br0">&#40;</span><span class="br0">&#40;</span>ship_mc.<span class="me1">rotation*</span><span class="kw3">Math</span>.<span class="kw3">PI</span><span class="br0">&#41;</span>/<span class="nu0">180</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> dy:<span class="kw3">Number</span> = ACCELERATION * <span class="kw3">Math</span>.<span class="kw3">sin</span><span class="br0">&#40;</span><span class="br0">&#40;</span>ship_mc.<span class="me1">rotation*</span><span class="kw3">Math</span>.<span class="kw3">PI</span><span class="br0">&#41;</span>/<span class="nu0">180</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>thrust<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; speedX += dx;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; speedY += dy;<br />
<span class="co1">//We want to have a max speed in any direction of the compass</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> speed = speedX*speedX + speedY*speedY;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>speed &gt;= TOP_SPEED*TOP_SPEED<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; speedX *= <span class="br0">&#40;</span>TOP_SPEED*TOP_SPEED<span class="br0">&#41;</span>/speed;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; speedY *= <span class="br0">&#40;</span>TOP_SPEED*TOP_SPEED<span class="br0">&#41;</span>/speed;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ship_mc.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="nu0">3</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; ship_mc.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="co1">//I know there is no friction in space, but I can&#8217;t remember if Asteroids had it or not.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; speedX *= FRICTION;<br />
&nbsp; &nbsp; &nbsp; &nbsp; speedY *= FRICTION;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; ship_mc.<span class="me1">x</span> += speedX;<br />
&nbsp; &nbsp; &nbsp; &nbsp; ship_mc.<span class="me1">y</span> += speedY;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ship_mc.<span class="me1">x</span> &gt; <span class="nu0">560</span><span class="br0">&#41;</span> ship_mc.<span class="me1">x</span> = <span class="nu0">-10</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ship_mc.<span class="me1">x</span> &lt; <span class="nu0">-10</span><span class="br0">&#41;</span> ship_mc.<span class="me1">x</span> = <span class="nu0">560</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ship_mc.<span class="me1">y</span> &gt; <span class="nu0">410</span><span class="br0">&#41;</span> ship_mc.<span class="me1">y</span> = <span class="nu0">-10</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ship_mc.<span class="me1">y</span> &lt; <span class="nu0">-10</span><span class="br0">&#41;</span> ship_mc.<span class="me1">y</span> = <span class="nu0">410</span>;<br />
<span class="br0">&#125;</span></div>
<p>Here we have initialized some variables in the constructor first.  Then we filled in our <strong>MainLoop</strong> to give our spaceship some life.  I would think the <strong>rotation</strong> is self evident&#8230;  it&#8217;s the first line of the method.  I used some constants in my math (<strong>ACCELERATION, TOP_SPEED,</strong> and <strong>FRICTION</strong>) so that I can easily adjust the game settings all in one place, without searching for the parts of the code that I need changed.<br />
The last group of <strong>if</strong> statements above are checking to see in our ship has flown off the screen and if it has it will be moved to the other side.</p>
<p>That&#8217;s all for now.  Next time I will probably add some asteroids and talk a little about <a href="http://www.clickpopmedia.com/2008/07/07/collision-detection-and-game-design/">collision detection</a>.</p>
<p>You can download the source for this example here: <a href="http://www.clickpopmedia.com/wp-content/uploads/2008/06/asteroidssource.rar">AsteroidsSource.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/06/25/easy-keyboard-controls-and-game-design/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

