<?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>Tech Blur</title>
	<atom:link href="http://ablitz.com/tech-hacks/feed/" rel="self" type="application/rss+xml" />
	<link>http://ablitz.com/tech-hacks</link>
	<description></description>
	<lastBuildDate>Mon, 26 Sep 2011 06:26:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>HTML-5 Canvas Element, Part-I</title>
		<link>http://ablitz.com/tech-hacks/html-5-canvas-element-part-i/</link>
		<comments>http://ablitz.com/tech-hacks/html-5-canvas-element-part-i/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 03:00:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://ablitz.com/tech-hacks/html-5-canvas-element-part-i-2/</guid>
		<description><![CDATA[One weekend, I decided to try out developing some simple gaming loops on html 5. I am new to html-5 and JavaScript as well. This is my first project using either. There have been a lot of talk going on about html-5 being the next generation app platform. All mobile platforms including android, IOS and [...]]]></description>
			<content:encoded><![CDATA[<p><font size="2">One weekend, I decided to try out developing some simple gaming loops on html 5. I am new to html-5 and JavaScript as well. This is my first project using either. There have been a lot of talk going on about html-5 being the next generation app platform. All mobile platforms including android, IOS and the upcoming windows 8 are featuring support of html-5 apps so does all the modern browsers on your pc.</font></p>
<p><font size="2">To start with, get the background setup with the canvas element of html-5. To invoke canvas with required parameters and to check whether the browser supports canvas, try using</font></p>
<p>&#160;</p>
<div class="csharpcode">
<pre class="alt"><font face="Bitstream Vera Sans Mono"><font size="1"><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">canvas</span> <span class="attr">id</span><span class="kwrd">=&quot;graphics&quot;</span> <span class="attr">width</span><span class="kwrd">=&quot;920&quot;</span> <span class="attr">height</span><span class="kwrd">=&quot;560&quot;</span> <span class="attr">style</span><span class="kwrd">=&quot;background-color: #A9A9A9;&quot;</span><span class="kwrd">&gt;</span></font></font></pre>
<pre><font face="Bitstream Vera Sans Mono"><font size="1"><span class="lnum">   2:  </span>  Canvas not supported! Update/Switch your browser!</font></font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><font size="1"><span class="lnum">   3:  </span><span class="kwrd">&lt;/</span><span class="html">canvas</span><span class="kwrd">&gt;</span></font></font></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p></p>
<p>Usually, the graphics component of the app is developed over &lt;canvas&gt;, but the logic is written using JavaScript. For music/sound components, &lt;audio&gt; can be used.</p>
<p>Here is the grid that’s designed as the background of the app we are going to develop.</p>
<p><a href="http://ablitz.com/wp-tech/wp-content/uploads/2011/09/grid.png"><img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="grid" border="0" alt="grid" src="http://ablitz.com/wp-tech/wp-content/uploads/2011/09/grid_thumb.png" width="438" height="268" /></a></p>
<p>The JS code for above:</p>
<p>&#160;</p>
<div class="csharpcode">
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   1:  </span><span class="kwrd">function</span> layout_grid()</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   2:  </span>{</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   3:  </span>  cur_y = init_y;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   4:  </span>&#160;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   5:  </span>  <span class="kwrd">for</span>(j=0;j&lt;=maxPosY;j++)</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   6:  </span>  {</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   7:  </span>    <span class="kwrd">for</span>(i=0;i&lt;=maxPosX;i++)</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   8:  </span>    {</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   9:  </span>      <span class="kwrd">if</span>((i+j)%2==0)</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  10:  </span>        ctx.fillStyle = <span class="str">&quot;#DEDEDE&quot;</span>;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  11:  </span>      <span class="kwrd">else</span></font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  12:  </span>        ctx.fillStyle = <span class="str">&quot;#CDCDCD&quot;</span>;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  13:  </span>      ctx.fillRect(init_x+i*width_x,cur_y,width_x,width_y);</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  14:  </span>    }</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  15:  </span>    cur_y = cur_y+width_y;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  16:  </span>  }</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  17:  </span>}</font></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>where </p>
<div class="csharpcode">
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   1:  </span>  ctx = canvas.getContext(<span class="str">&quot;2d&quot;</span>);</font></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>A control loop is usually written in following steps:</p>
<ol>
<li>detect the user input </li>
<li>determine the next position/action </li>
<li>update the graphics </li>
<li>play sound/feedback </li>
</ol>
<p>Say for a simple case of moving an agent through the grid, we can follow through the above steps. User input are the arrow keys- ‘up’, ‘down’, ‘left’ and ‘right’. Next position is calculated basing on the current position of the agent on the grid and current input. Then the canvas with the new position of the agent is updated.</p>
<p>&#160;</p>
<div class="csharpcode">
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   1:  </span><span class="kwrd">function</span> step()</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   2:  </span>{</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   3:  </span>  <span class="kwrd">var</span> xdir=0;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   4:  </span>  <span class="kwrd">var</span> ydir=0;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   5:  </span>&#160;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   6:  </span>  <span class="rem">//detect user input</span></font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   7:  </span>  <span class="kwrd">if</span> ((37 <span class="kwrd">in</span> keys &amp;&amp; keys[37]) || (65 <span class="kwrd">in</span> keys &amp;&amp; keys[65])){ <span class="rem">//left</span></font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   8:  </span>    xdir = -1;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   9:  </span>  }</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  10:  </span>  <span class="kwrd">if</span> ((39 <span class="kwrd">in</span> keys &amp;&amp; keys[39]) || (68 <span class="kwrd">in</span> keys &amp;&amp; keys[68])){ <span class="rem">//right</span></font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  11:  </span>    xdir = 1;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  12:  </span>  }</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  13:  </span>  <span class="kwrd">if</span> ((38 <span class="kwrd">in</span> keys &amp;&amp; keys[38]) || (87 <span class="kwrd">in</span> keys &amp;&amp; keys[87])){ <span class="rem">//up</span></font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  14:  </span>    ydir = -1;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  15:  </span>  }</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  16:  </span>  <span class="kwrd">if</span> ((40 <span class="kwrd">in</span> keys &amp;&amp; keys[40]) || (83 <span class="kwrd">in</span> keys &amp;&amp; keys[83])){ <span class="rem">//down</span></font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  17:  </span>    ydir = 1;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  18:  </span>  }</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  19:  </span>&#160;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  20:  </span>  <span class="rem">//determine next position/action</span></font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  21:  </span>  calc_next_state(xdir,ydir);</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  22:  </span>&#160;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  23:  </span>  <span class="rem">//update the canvas</span></font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  24:  </span>  ctx.clearRect(0, 0, canvas.width, canvas.height);</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  25:  </span>  layout_grid();</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  26:  </span>  ctx.drawImage(agent, init_x+agentPosX*width_x, init_y+agentPosY*width_y);</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  27:  </span>}</font></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Using ‘a’,’s’,’d’,’f’ key combo in addition to the arrow keys.</p>
<p>ctx.clearRect() function clears the grid, otherwise it will show the previous position of the agent. Let’s skip to the outline of the JS code: </p>
<div class="csharpcode">
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   1:  </span>&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   2:  </span><span class="kwrd">const</span> FPS = 10;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   3:  </span>&#160;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   4:  </span><span class="rem">//initialized variables and parameters</span></font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   5:  </span>XXX</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   6:  </span>XXX</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   7:  </span>&#160;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">   8:  </span><span class="rem">//load agent image</span></font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">   9:  </span><span class="kwrd">var</span> agent = <span class="kwrd">new</span> Image();</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  10:  </span>agent.src = <span class="str">&quot;agent.gif&quot;</span>;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  11:  </span>&#160;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  12:  </span><span class="rem">//intialize canvas object</span></font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  13:  </span><span class="kwrd">var</span> canvas = <span class="kwrd">null</span>;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  14:  </span><span class="kwrd">var</span> ctx = <span class="kwrd">null</span>;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  15:  </span><span class="kwrd">var</span> keys = <span class="kwrd">new</span> Array();</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  16:  </span>&#160;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  17:  </span><span class="rem">//primary function on load</span></font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  18:  </span>window.onload = init;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  19:  </span>window.addEventListener(<span class="str">'keydown'</span>,keyDown,<span class="kwrd">true</span>);</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  20:  </span>window.addEventListener(<span class="str">'keyup'</span>,keyUp,<span class="kwrd">true</span>);</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  21:  </span>&#160;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  22:  </span><span class="kwrd">function</span> keyDown(evt){</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  23:  </span> keys[evt.keyCode] = <span class="kwrd">true</span>;</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  24:  </span>}</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  25:  </span><span class="kwrd">function</span> keyUp(evt){</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  26:  </span> keys[evt.keyCode] = <span class="kwrd">false</span>;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  27:  </span>}</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  28:  </span>&#160;</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  29:  </span><span class="kwrd">function</span> init()</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  30:  </span>{</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  31:  </span>  canvas = document.getElementById(<span class="str">&quot;graphics&quot;</span>);</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  32:  </span>  ctx = canvas.getContext(<span class="str">&quot;2d&quot;</span>);</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  33:  </span>  layout_grid();</font></pre>
<pre><font face="Bitstream Vera Sans Mono"><span class="lnum">  34:  </span>  setInterval(step, 1000 / FPS);</font></pre>
<pre class="alt"><font face="Bitstream Vera Sans Mono"><span class="lnum">  35:  </span>}</font></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Note that function ‘init’ is the main function that is loaded initially. It initializes canvas context and draws the grid then calls the ‘step’ control loop. Now, here is the embedded output of this application. Simple movements up/down/left/right (or a/s/d/f) moves the agent through the grid restricted by the boundaries. </p>
<p><a href="http://ablitz.com/testdir/new.html">http://ablitz.com/testdir/new.html</a></p>
<p>&#160;</p>
<p>&#160;</p>
<p>Here goes few links for your reference:</p>
<p><a href="http://simon.html5.org/dump/html5-canvas-cheat-sheet.html">http://simon.html5.org/dump/html5-canvas-cheat-sheet.html</a></p>
<p><a href="http://www.script-tutorials.com/html5-game-development-lesson-1/">http://www.script-tutorials.com/html5-game-development-lesson-1/</a></p>
<p><a href="http://www.ibm.com/developerworks/web/library/wa-html5fundamentals/index.html?ca=drs-">http://www.ibm.com/developerworks/web/library/wa-html5fundamentals/index.html?ca=drs-</a>&lt;/P</p>
]]></content:encoded>
			<wfw:commentRss>http://ablitz.com/tech-hacks/html-5-canvas-element-part-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

