<?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>PyRuby blog &#187; zen zombie</title>
	<atom:link href="http://www.pyruby.com/tag/zen-zombie/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pyruby.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 12 Dec 2011 11:03:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>HTML 5 Canvas game &#8211; Test Driven</title>
		<link>http://www.pyruby.com/2010/06/08/html-5-canvas-game/</link>
		<comments>http://www.pyruby.com/2010/06/08/html-5-canvas-game/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 05:00:35 +0000</pubDate>
		<dc:creator>PyRuby</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[card game]]></category>
		<category><![CDATA[html5 canvas]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[zen zombie]]></category>

		<guid isPermaLink="false">http://www.pyruby.com/?p=83</guid>
		<description><![CDATA[<p></p>
<p>I&#8217;ve been busy for the last month, working with a couple of friends to put together an online version of Ninja Pirate Zombie Robot.  This was initially going to be an iPhone app, written in Objective C, but after further consideration, we decided to write it using HTML 5 canvas.</p>
<p>The libraries we are using [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://zenzombie.com/wordpress/wp-content/uploads/2010/05/4heads.png" alt="Ninja Pirate Zombie Robot" /></p>
<p>I&#8217;ve been busy for the last month, working with a couple of friends to put together an online version of <a href="http://zenzombie.com/games/ninja-pirate-zombie-robot/">Ninja Pirate Zombie Robot</a>.  This was initially going to be an iPhone app, written in Objective C, but after further consideration, we decided to write it using HTML 5 canvas.</p>
<p>The libraries we are using for our JavaScript card game are <a href="http://jsunittest.com/">JSUnitTest</a>, <a href="http://github.com/kangax/protolicious/blob/master/event.simulate.js">event.simulate.js</a> and <a href="http://www.prototypejs.org/">JS Prototype</a>.  The choices here are largely due to our experience of writing test driven, object oriented code as our day jobs.  This was our first game, so this post may not reflect the very best way to write an HTML5 game, so if there are things we could improve on, please let me know.</p>
<h3>Test first</h3>
<p>This article will just cover our initial set up.  I&#8217;ll write a subsequent article on tips and tricks we learnt along the way.  First we set up a test case using JSUnitTest.  This comprised of 3 files.</p>
<p>HTML web page which runs and displays the results of the tests</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;html&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;head&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;title&gt;JavaScript unit test file&lt;/title&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;script src=&quot;../lib/jsunittest.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;script src=&quot;../lib/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;script src=&quot;../lib/event.simulate.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;script src=&quot;../src/game.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &lt;link rel=&quot;stylesheet&quot; href=&quot;unittest.css&quot; type=&quot;text/css&quot; /&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/head&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;body&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;div id=&quot;content&quot;&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;div id=&quot;header&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;h1&gt;Ninja Pirate Zombie Robot unit test file&lt;/h1&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;!&#8211; Log output (one per Runner, via {testLog: &quot;testlog&quot;} option)&#8211;&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &lt;p&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Running &lt;strong&gt;test_game.js&lt;/strong&gt;.
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;/p&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;div id=&quot;game&quot;&gt;&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;script src=&quot;test_game.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &lt;/body&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/html&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>The TestCase</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> Test.<span class="me1">Unit</span>.<span class="me1">Runner</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setup: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">game</span> = <span class="kw2">new</span> Game<span class="br0">&#40;</span><span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; teardown: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">game</span> = <span class="kw2">null</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; testGameStartsWith2Players: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">with</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; assertEqual<span class="br0">&#40;</span><span class="nu0">2</span>, game.<span class="me1">players</span>.<span class="me1">length</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>, <span class="br0">&#123;</span> testLog: <span class="st0">&quot;game&quot;</span><span class="br0">&#125;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>And the bare minimum initial game code</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Game = <span class="kw2">Class</span>.<span class="me1">create</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">players</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>This was our starting point for our game, which yielded one failing test.  We decided to build the rules of the game first, before dealing with the rendering and computer player components.  Given that we wouldn&#8217;t have the chance to pair on most of the code, we wanted to get the central domain model for the game sorted, so we could then work on other parts in parallel.</p>
<p>In my next post, I&#8217;ll cover defining the game domain model, which encapsulates all the rules of the game.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pyruby.com/2010/06/08/html-5-canvas-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

