<?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>Michał Środek &#187; JavaScript</title>
	<atom:link href="http://srodek.info/category/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://srodek.info</link>
	<description>Mój osobisty blog</description>
	<lastBuildDate>Mon, 15 Aug 2011 19:00:06 +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>Poruszanie się po mapie</title>
		<link>http://srodek.info/blog/387/poruszanie-sie-po-mapie</link>
		<comments>http://srodek.info/blog/387/poruszanie-sie-po-mapie#comments</comments>
		<pubDate>Fri, 09 Jul 2010 22:17:32 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Gry]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Moje projekty]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=387</guid>
		<description><![CDATA[Mimo, że czołg w mojej grze jeździ, porusza się przez ściany. Dzisiaj zwalczę ten problem dodając kilka linijek kodu odpowiedzialnych za wykrywanie kolizji obiektów, tak aby czołg nie mógł znajdować się w tej samej pozycji co mur lub woda. Przede wszystkim przebudujmy kilka linijek odpowiedzialnych za wykrywanie zdarzeń klawiatury. O ile kod ten wciąż nie [...]]]></description>
			<content:encoded><![CDATA[<p>Mimo, że czołg w mojej grze jeździ, porusza się przez ściany. Dzisiaj zwalczę ten problem dodając kilka linijek kodu odpowiedzialnych za wykrywanie kolizji obiektów, tak aby czołg nie mógł znajdować się w tej samej pozycji co mur lub woda.</p>
<p><span id="more-387"></span></p>
<p>Przede wszystkim przebudujmy kilka linijek odpowiedzialnych za wykrywanie zdarzeń klawiatury. O ile kod ten wciąż nie jest doskonały i wymaga dalszego doszlifowania, o tyle aktualnie musi nam wystarczać.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">37</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// LEFT</span>
<span style="color: #009900;">&#123;</span>
	GameTank.<span style="color: #660066;">changeDirection</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">x</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
		GameTank.<span style="color: #660066;">changePosition</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">38</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// UP</span>
<span style="color: #009900;">&#123;</span>
	GameTank.<span style="color: #660066;">changeDirection</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">y</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span>
		GameTank.<span style="color: #660066;">changePosition</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">39</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// RIGHT</span>
<span style="color: #009900;">&#123;</span>
	GameTank.<span style="color: #660066;">changeDirection</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">x</span><span style="color: #339933;">&lt;</span><span style="color: #CC0000;">480</span><span style="color: #009900;">&#41;</span>
		GameTank.<span style="color: #660066;">changePosition</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">40</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// DOWN</span>
<span style="color: #009900;">&#123;</span>
	GameTank.<span style="color: #660066;">changeDirection</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">y</span><span style="color: #339933;">&lt;</span><span style="color: #CC0000;">480</span><span style="color: #009900;">&#41;</span>
		GameTank.<span style="color: #660066;">changePosition</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Co się zmieniło? Wszelkie polecenia zmiany położenia czołgu są teraz przekazywane do metody <em>GameTank.changePosition()</em>. To ona zabezpiecza grę przed przecinaniem się obiektów.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">changePosition<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span>y<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> newPosition <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span><span style="color: #339933;">+</span>x<span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span><span style="color: #339933;">+</span>y<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> newField <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>Math.<span style="color: #660066;">ceil</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>newPosition<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> Math.<span style="color: #660066;">ceil</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>newPosition<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> offset <span style="color: #339933;">=</span> newPosition<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">%</span>32<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
			<span style="color: #003366; font-weight: bold;">var</span> fields <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">else</span>
			<span style="color: #003366; font-weight: bold;">var</span> fields <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">else</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> offset <span style="color: #339933;">=</span> newPosition<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">%</span>32<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>y<span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
			<span style="color: #003366; font-weight: bold;">var</span> fields <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">else</span>
			<span style="color: #003366; font-weight: bold;">var</span> fields <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">var</span> checkField <span style="color: #339933;">=</span> GameBoard.<span style="color: #660066;">board</span><span style="color: #009900;">&#91;</span>newField<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>fields<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>newField<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>fields<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>checkField<span style="color: #339933;">==</span><span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> checkField<span style="color: #339933;">==</span><span style="color: #CC0000;">1</span> <span style="color: #339933;">||</span> offset<span style="color: #339933;">==</span><span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> offset<span style="color: #339933;">&gt;</span><span style="color: #CC0000;">29</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>offset<span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span> <span style="color: #339933;">&amp;&amp;</span> offset<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">6</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span><span style="color: #339933;">+=</span>x<span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span><span style="color: #339933;">+=</span>y<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">else</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #003366; font-weight: bold;">var</span> checkField <span style="color: #339933;">=</span> GameBoard.<span style="color: #660066;">board</span><span style="color: #009900;">&#91;</span>newField<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>fields<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>newField<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>fields<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>checkField<span style="color: #339933;">==</span><span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> checkField<span style="color: #339933;">==</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span><span style="color: #339933;">+=</span>x<span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span><span style="color: #339933;">+=</span>y<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span></pre></div></div>

<p>Najpierw określam współrzędne nowego położenia czołgu(jego górnego lewego narożnika) oraz współrzędne pola na krórym się znajduje. Następnie wyznaczam odstęp(offset) jaki dzieli czołg od krawędzi kratki(Pamiętajmy, że czołg nie jest szeroki na 32px tak jak pole na mapie). Dzięki określeniu pewnej granicy błędu nie będziemy musieli ustawiać się idealnie aby przejechać między dwoma obszarami blokującymi. Znacznie ułatwi to sterowanie.</p>
<p>Kolejnym krokiem jest określenie 2 pól(fields), na podstawie których badane będą kolizje. To jakie pola wybierze skrypt zależy od kierunku w jakim się poruszamy. A są to:</p>
<p><img src="http://srodek.info/wp-content/uploads/2010/07/tanksMap.png" alt="" title="tanksMap" width="390" height="272" class="aligncenter size-full wp-image-391" /></p>
<p>Następnie jest sprawdzany rodzaj tych pól oraz odległość czołgu o nich. Jeżeli wszystko się zgadza, pozycja czołgu zostaje zmieniona.</p>
<p>Całość działa całkiem sprawnie. Efekt końcowy możesz zobaczyć <a href="/examples/game-0.0.5/">tutaj</a></p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/387/poruszanie-sie-po-mapie/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Optymalizacja obiektu canvas</title>
		<link>http://srodek.info/blog/370/optymalizacja-obiektu-canvas</link>
		<comments>http://srodek.info/blog/370/optymalizacja-obiektu-canvas#comments</comments>
		<pubDate>Tue, 06 Jul 2010 18:32:03 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Moje projekty]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=370</guid>
		<description><![CDATA[Jak zapewne zauważyłeś podczas czytania mojego poprzedniego artykułu gra, którą tworzę działa troszkę wolno. Dzieje się tak dlatego, że mapa jest generowana od nowa w każdej klatce działania programu. Spróbujmy to zoptymalizować. Zasada jest bardzo prosta. To co możemy generować raz, generujemy tylko raz. Następnie zapisujemy wynik do oddzielnego obiektu &#60;canvas&#62; i w razie potrzeby [...]]]></description>
			<content:encoded><![CDATA[<p>Jak zapewne zauważyłeś podczas czytania mojego poprzedniego artykułu gra, którą tworzę działa troszkę wolno. Dzieje się tak dlatego, że mapa jest generowana od nowa w każdej klatce działania programu. Spróbujmy to zoptymalizować.</p>
<p><span id="more-370"></span></p>
<p>Zasada jest bardzo prosta. To co możemy generować raz, generujemy tylko raz. Następnie zapisujemy wynik do oddzielnego obiektu &lt;canvas&gt; i w razie potrzeby kopiujemy do głównego obiektu naszej gry.</p>
<p>Na potrzeby mojego przykładu stworzyłem dynamicznie dwa nowe obiekty canvas, jeden przechowujący wygenerowaną mapę, drugi czołg(obracanie obrazków jest bardzo czasochłonne).</p>
<p>Uporządkowałem troszkę kod umieszczając wszelkie dane czołgu do klasy GameTank</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> GameTank <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	x<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
	y<span style="color: #339933;">:</span><span style="color: #CC0000;">480</span><span style="color: #339933;">,</span>
	canvas<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
	ctx<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
	direction<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span>  <span style="color: #006600; font-style: italic;">// 0= LEFT 1 =UP, 2 = RIGHT, 3=DOWN</span>
&nbsp;
	changeDirection<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>newDirection<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>newDirection<span style="color: #339933;">!=</span>GameTank.<span style="color: #660066;">direction</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			GameTank.<span style="color: #660066;">direction</span> <span style="color: #339933;">=</span> newDirection<span style="color: #339933;">;</span>
&nbsp;
			GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">clearRect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">direction</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">:</span>
					GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">90</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">180</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">:</span>
					GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">180</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">180</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">:</span>
					GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">270</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">180</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
				<span style="color: #003366; font-weight: bold;">default</span><span style="color: #339933;">:</span>
					GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			GameTank.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	init<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'canvas'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">32</span><span style="color: #339933;">;</span> 
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">32</span><span style="color: #339933;">;</span> 
&nbsp;
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>W analogiczny sposób tworzony jest obiekt &lt;cavas&gt; dla mapy</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> GameBoard <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	canvas<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
	ctx<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
	TEXTURE_ID<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>ICE<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> BRICK<span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> WATER<span style="color: #339933;">:</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
	textures<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'images/ice.png'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'images/brick.png'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'images/water.png'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
	board<span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>
		<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	drawBoard<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 			<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">clearRect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">512</span><span style="color: #339933;">,</span><span style="color: #CC0000;">512</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> y<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> y<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">16</span><span style="color: #339933;">;</span> y<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> x<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> x<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">16</span><span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">board</span><span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#123;</span>
						<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
						<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">board</span><span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
						<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">fillRect</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">*</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span>y<span style="color: #339933;">*</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
						<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	preloadTextures<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> img <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		img.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		img.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
			GameBoard.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">createPattern</span><span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> <span style="color: #3366CC;">'repeat'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameBoard.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
				GameBoard.<span style="color: #660066;">preloadTextures</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
				GameBoard.<span style="color: #660066;">drawBoard</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				GameTank.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				window.<span style="color: #660066;">setInterval</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">mainLoop</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	init<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'canvas'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">512</span><span style="color: #339933;">;</span> 
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">512</span><span style="color: #339933;">;</span> 
&nbsp;
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">preloadTextures</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Główna klasa gry jedynie składa obraz ze wszystkich elementów</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> GameMain <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	canvas<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
	ctx<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
	img<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	mainLoop<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
 			GameMain.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">clearRect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">512</span><span style="color: #339933;">,</span><span style="color: #CC0000;">512</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			GameMain.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameBoard.<span style="color: #660066;">canvas</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">512</span><span style="color: #339933;">,</span><span style="color: #CC0000;">512</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">512</span><span style="color: #339933;">,</span><span style="color: #CC0000;">512</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">37</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// LEFT</span>
			<span style="color: #009900;">&#123;</span>
				GameTank.<span style="color: #660066;">changeDirection</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">x</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
					GameTank.<span style="color: #660066;">x</span><span style="color: #339933;">-=</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">38</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// UP</span>
			<span style="color: #009900;">&#123;</span>
				GameTank.<span style="color: #660066;">changeDirection</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">y</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
					GameTank.<span style="color: #660066;">y</span><span style="color: #339933;">-=</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">39</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// RIGHT</span>
			<span style="color: #009900;">&#123;</span>
				GameTank.<span style="color: #660066;">changeDirection</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">x</span><span style="color: #339933;">&lt;</span><span style="color: #CC0000;">480</span><span style="color: #009900;">&#41;</span>
					GameTank.<span style="color: #660066;">x</span><span style="color: #339933;">+=</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">40</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// DOWN</span>
			<span style="color: #009900;">&#123;</span>
				GameTank.<span style="color: #660066;">changeDirection</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">y</span><span style="color: #339933;">&lt;</span><span style="color: #CC0000;">480</span><span style="color: #009900;">&#41;</span>
					GameTank.<span style="color: #660066;">y</span><span style="color: #339933;">+=</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			GameMain.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameTank.<span style="color: #660066;">canvas</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span>GameTank.<span style="color: #660066;">x</span><span style="color: #339933;">,</span>GameTank.<span style="color: #660066;">y</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 			FrameCounter.<span style="color: #660066;">updateFPS</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
	init<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'game'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;2d&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'images/btank.png'</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span>.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			GameBoard.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'keydown'</span><span style="color: #339933;">,</span> keyHandler.<span style="color: #660066;">keyDown</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'keyup'</span><span style="color: #339933;">,</span> keyHandler.<span style="color: #660066;">keyUp</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Kolejną, obok generowania grafiki, czasochłonną operacją jest liczenie czasu. Spróbujmy ograniczyć wywoływanie pewnych funkcji w liczniku FPS. Czas liczył będę co 10 klatek.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> FrameCounter <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	x<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
	lastFrameTime<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	updateFPS<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span><span style="color: #339933;">==</span><span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #003366; font-weight: bold;">var</span> currentTime <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'fps'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> Math.<span style="color: #660066;">floor</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">10000</span><span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span>currentTime<span style="color: #339933;">-</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">lastFrameTime</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'fps'</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">lastFrameTime</span> <span style="color: #339933;">=</span> currentTime<span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span><span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">else</span>
			<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span><span style="color: #339933;">++</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Poza przyspieszeniem gry zauważymy również zmiany w działaniu samego licznika. Jego odświeżanie będzie rzadsze i jednocześnie przyjemniejsze dla ludzkiego oka.</p>
<p>Technika, którą tutaj pokazałem bardzo przypomina tą ze zwykłych gier DHTML budowanych w oparciu o odpowiednio pozycjonowane znaczniki &lt;div&gt;. Dlaczego nie robię tak samo w przypadku znaczników &lt;canvas&gt;? Po prostu sądzę, że takie rozwiązanie jest mniej eleganckie. Tworzenie jednego obrazu lepiej przypomina klasyczne gry komputerowe. Czas( oraz licznik FPS) pokaże, czy nie zmienię zdania…</p>
<p>Działające demo dostępne jest <a href="http://srodek.info/examples/game-0.0.4/">TUTAJ</a>.</p>
<p>Dlaczego tak długo nie pisałem? No cóż miałem sporo pracy, a czerwiec to nie najlepszy czas aby odnaleźć dodatkowych kilka godzin. Jutro postaram się opisać coś bardziej skomplikowanego <img src='http://srodek.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/370/optymalizacja-obiektu-canvas/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Obsługa klawiatury oraz licznik FPS</title>
		<link>http://srodek.info/blog/328/obsluga-klawiatury-oraz-licznik-fps</link>
		<comments>http://srodek.info/blog/328/obsluga-klawiatury-oraz-licznik-fps#comments</comments>
		<pubDate>Sat, 22 May 2010 21:58:18 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Gry]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Moje projekty]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=328</guid>
		<description><![CDATA[W dzisiejszym artykule pokażę prosty sposób na wychwycenie zdarzenia przytrzymania klawiszy klawiatury oraz rozpoczniemy mierzenie prędkości naszej gry tj. współczynnika FPS. Umieścimy na naszej mapie czołg oraz umożliwimy sterowanie nim za pomocą klawiszy strzałek. UWAGA: Artykuł jest kontynuacją poprzedniego: Canvas — Rysujemy mapę Przede wszystkim potrzebujemy czołgu. Na potrzeby artykułu oraz mojej gry stworzyłem prosty [...]]]></description>
			<content:encoded><![CDATA[<p>W dzisiejszym artykule pokażę prosty sposób na wychwycenie zdarzenia przytrzymania klawiszy klawiatury oraz rozpoczniemy mierzenie prędkości naszej gry tj. współczynnika <abbr title="Frame Per Second - klatki na sekundę">FPS</abbr>. Umieścimy na naszej mapie czołg oraz umożliwimy sterowanie nim za pomocą klawiszy strzałek.</p>
<p><span id="more-328"></span></p>
<p class="warning">UWAGA: Artykuł jest kontynuacją poprzedniego: <a href="http://srodek.info/blog/270/rysujemy-mape">Canvas — Rysujemy mapę</a></p>
<p>Przede wszystkim potrzebujemy czołgu. Na potrzeby artykułu oraz mojej gry stworzyłem prosty szkic w <abbr title="GNU Image Manipulation Program">GIMP-ie</abbr>:</p>
<p><img src="http://srodek.info/wp-content/uploads/2010/05/btank.png" alt="Czołg" title="Czołg" width="32" height="32"/></a></p>
<p>Zanim umieścimy go na planszy, przeanalizujmy kilka innych ważnych aspektów.</p>
<h3>Obsługa klawiatury</h3>
<p>Aby sterować naszym czołgiem musimy stworzyć obiekt przechwytujący zdarzenia klawiatury. Najbardziej problematyczny jest jednak sposób ich działania w JavaScript. Dla przeciętnego klawisza są wywoływane 4 zdarzenia:</p>
<ol>
<li>keydown</li>
<li>keypress</li>
<li>textInput</li>
<li>keyup</li>
</ol>
<p>Zdarzenie textInput  zdefiniowane niedawno przez <abbr title="World Wide Web Consorcium">W3C</abbr> obsługują, bodajże, tylko przeglądarki w oparciu o silnik WebKit. Z pozostałymi zdarzeniami jest różnie. Keypress jest pomijane w przypadku klawiszy specjalnych takich jak shift, alt i ctrl. Niestety nie ma jasno zdefiniowanej listy klawiszy specjalnych. Przeglądarki w oparciu o WebKit zaliczają do nich np. klawisze strzałek, FireFox już nie. Co więcej identyfikacja klawiszy w różnych przeglądarkach jest realizowana w oparciu o inne pola(event.keyCode, event.which oraz event.charCode). Na szczęście wszystkie całkiem sprawnie obsługują pole <em>keyCode</em>, więc nie jest to aż tak ogromny problem(pomijając fakt, że czasami keyCode dla tego samego klawisza jest inny w różnych przeglądarkach). Podsumowując. <strong>Obsługa klawiatury w JavaScript to istny koszmar</strong> i moim zdaniem powinna zostać przebudowana. Wystarczy pozostawić keydown, textInput oraz keyup oraz ujednolicić kody klawiszy. Jest jednak lista klawiszy bezpiecznych(działających identycznie lub bardzo podobnie w różnych środowiskach). Znalazłem w sieci ciekawe <a href="http://unixpapa.com/js/key.html">zestawienie</a> na ten temat.</p>
<p>Warto wiedzieć w jaki sposób działa zdarzenie przytrzymania klawisza. Przeglądarki realizują to bardzo dziwnie. W przypadku wciśnięcia klawisza jest wywoływana akcja keydown, keypress oraz keyup. Następnie wywoływane jest ponownie zdarzenie keydown, po nim keypress oraz znów keyup. I tak, aż do momentu puszczenia klawisza. W naszym przypadku zdarzenie keypress pominiemy(tym bardziej, że w przypadku strzałek nie zawsze jest ono wywoływane) więc zaobserwujemy:<br />
<strong><br />
keydown<br />
keyup<br />
keydown<br />
keyup<br />
(…)<br />
keydown<br />
keyup<br />
</strong></p>
<p>Oczywiście w przypadku naszej gry akcja utrzymywania klawisza musi być ciągła dlatego musimy opóźnić zwolnienie klawisza. Napiszmy prostą klasę.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> keyHandler <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    keyLastEvent<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #006600; font-style: italic;">//true = keyDown, false = keyUp</span>
    keyStatus<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
    keyDown<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// ustawienie statusu na jeden(klawisz wcisniety po raz pierwszy)</span>
        <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">keyStatus</span><span style="color: #009900;">&#91;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">===</span>undefined<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            keyHandler.<span style="color: #660066;">keyStatus</span><span style="color: #009900;">&#91;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
            keyHandler.<span style="color: #660066;">keyLastEvent</span><span style="color: #009900;">&#91;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">else</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>keyHandler.<span style="color: #660066;">keyLastEvent</span><span style="color: #009900;">&#91;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// ostatnia akcja byl keyUp =&gt; powtarzane down, up; down, up</span>
                keyHandler.<span style="color: #660066;">keyStatus</span><span style="color: #009900;">&#91;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">++;</span>
&nbsp;
            keyHandler.<span style="color: #660066;">keyLastEvent</span><span style="color: #009900;">&#91;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    keyUp<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        keyHandler.<span style="color: #660066;">keyLastEvent</span><span style="color: #009900;">&#91;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">// odcisniecie klawisza z 10ms opóźnieniem</span>
        window.<span style="color: #660066;">setTimeout</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">decreaseKeyStatus</span><span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    decreaseKeyStatus<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>keyCode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">keyStatus</span><span style="color: #009900;">&#91;</span>keyCode<span style="color: #009900;">&#93;</span><span style="color: #339933;">--;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    isHolded<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>key<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">keyStatus</span><span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Klasa zawiera tablicę klawiszy. W przypadku wciśnięcia np. strzałki w lewo(keyCode = 37) następuje zwiększenie o jeden wartości keyStatus[37]. Jeżeli ta wartość jest większa od zera metoda isHolded() zwraca true co informuje nas, że klawisz jest przytrzymywany. W przypadku systemów z rodziny Windows zdarzenie keyUp nie jest powtarzane. Zatem zwiększenie wartości naszego licznika powinno nastąpić tylko raz w przypadku pierwszego pojawienia się zdarzenia keyDown. Aby wiedzieć jakiego rodzaju zdarzenie zostało ostatnio wywołane(up czy down) stworzyłem zmienną keyLastEvent i modyfikuję ją wg. potrzeb. Dzięki takiej budowie naszej klasy(tj. bez warunkowych lini kodu zależnych od systemu operacyjnego lub przeglądarki) akcja przytrzymania klawisza zostanie poprawnie rozpoznana nawet w przypadku poprawienia błędów w jednej z przeglądarek.</p>
<p>Aby kod ten zadziałał potrzebujemy dodatkowo określić, które z naszych funkcji nasłuchują. Zrobimy to w metodzie init() obiektu GameBoard tuż pod kodem ładującym tekstury.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">preloadTextures</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'keydown'</span><span style="color: #339933;">,</span> keyHandler.<span style="color: #660066;">keyDown</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'keyup'</span><span style="color: #339933;">,</span> keyHandler.<span style="color: #660066;">keyUp</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Pętla główna</h3>
<p>W przypadku gier ważne jest utworzenie pętli głównej programu. Będzie ona za każdym razem sprawdzała stan zdarzeń pochodzących z klawiatury, sieci oraz sztucznej inteligencji. W przypadku małych gier(np. kółko i krzyżyk, sudoku, saper) jest to nieistotne, u nas — w grze pełnej animacji — po prostu konieczne.</p>
<p>Stwórzmy dodatkowy obiekt będący centralną sterownią naszej gry.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> GameMain <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    img<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    x<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
    y<span style="color: #339933;">:</span><span style="color: #CC0000;">480</span><span style="color: #339933;">,</span>
    direction<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span>  <span style="color: #006600; font-style: italic;">// 0= LEFT 1 =UP, 2 = RIGHT, 3=DOWN</span>
    mainLoop<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
            GameBoard.<span style="color: #660066;">drawBoard</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">37</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// LEFT</span>
            <span style="color: #009900;">&#123;</span>
                GameMain.<span style="color: #660066;">direction</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">x</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
                    GameMain.<span style="color: #660066;">x</span><span style="color: #339933;">-=</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">38</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// UP</span>
            <span style="color: #009900;">&#123;</span>
                GameMain.<span style="color: #660066;">direction</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">y</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
                    GameMain.<span style="color: #660066;">y</span><span style="color: #339933;">-=</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">39</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// RIGHT</span>
            <span style="color: #009900;">&#123;</span>
                GameMain.<span style="color: #660066;">direction</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">x</span><span style="color: #339933;">&lt;</span><span style="color: #CC0000;">480</span><span style="color: #009900;">&#41;</span>
                    GameMain.<span style="color: #660066;">x</span><span style="color: #339933;">+=</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">40</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// DOWN</span>
            <span style="color: #009900;">&#123;</span>
                GameMain.<span style="color: #660066;">direction</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">y</span><span style="color: #339933;">&lt;</span><span style="color: #CC0000;">480</span><span style="color: #009900;">&#41;</span>
                    GameMain.<span style="color: #660066;">y</span><span style="color: #339933;">+=</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
            <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">37</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">41</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>keyHandler.<span style="color: #660066;">isHolded</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                    document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'key-'</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">background</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'red'</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">else</span>
                    document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'key-'</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">background</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'white'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">translate</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">x</span><span style="color: #339933;">,</span>GameMain.<span style="color: #660066;">y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">direction</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">:</span>
                    GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">90</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">180</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">:</span>
                    GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">180</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">180</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">:</span>
                    GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">270</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">180</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                <span style="color: #003366; font-weight: bold;">default</span><span style="color: #339933;">:</span>
                    GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #009900;">&#125;</span>
            GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
             FrameCounter.<span style="color: #660066;">updateFPS</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    init<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'images/btank.png'</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">img</span>.<span style="color: #660066;">tank</span>.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            GameBoard.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Metoda mainLoop() będzie wywoływana co określony, bardzo krótki czas. Dzięki temu będziemy w stanie na bierząco wychwytywać nadchodzące zdarzenia.</p>
<p>Podzielona jest ona na kilka akcji. Pierwszą z nich jest rysowanie mapy. Następnie sprawdzamy poszczególne klawisze strzałek. W przypadku przytrzymania jedngo z nich, zmieniamy współrzędne naszego czołgu — pola x oraz y klasy GameMain. Kolejnym krokiem jest zapisanie stanu obiektu canvas. Translacja o wektor, obrót w odpowiednim kierunku oraz rysowanie czołgu. Następnie przywracamy stan obszaru canvas i wywołujemy licznik <abbr title="Frame Per Second - klatki na sekundę">FPS</abbr></p>
<p>Odczyt grafiki czołgu umieściłem w metodzie init(). Jest to nasza nowa metoda inicjalizująca, którą musimy wywołać aby uruchomić grę.</p>
<h3>Licznik FPS</h3>
<p>Ważnym elementem podczas testowania gry jest licznik FPS. Dzięki niemu będziemy mogli określić, które elementy gry są napisane nieoptymalnie oraz, który kod należy wymienić. Oko ludzkie jest w stanie zaobserwować jedynie 25 klatek filmu w każdej sekundzie. Dla mnie jest to jednak mało. Spróbujmy sprawdzić aby gra posiadała przynajmniej 40fps. Moja klasa licząca ilość klatek wygląda następująco:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> FrameCounter <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    lastFrameTime<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    updateFPS<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> currentTime <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'fps'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> Math.<span style="color: #660066;">floor</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1000</span><span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span>currentTime<span style="color: #339933;">-</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">lastFrameTime</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'fps'</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">lastFrameTime</span> <span style="color: #339933;">=</span> currentTime<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Jak ten kod działa? W każdej klatce obliczana jest różnica pomiędzy aktualnym czasem oraz czasem wyświetlania poprzedniej klatki. W ten sposób możemy obliczyć czas(w milisekundach) wykonywania się jednej klatki. Dzieląc przez tą wartość 1000 otrzymujemy ilość klatek na sekundę. </p>
<h3>Uruchomienie</h3>
<p>Zmieniona została klasa inicjująca naszą grę więc w metodzie GameBoard.preloadTextures() musi zajść lekka zmiana:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    preloadTextures<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> img <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        img.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        img.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            GameBoard.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">createPattern</span><span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> <span style="color: #3366CC;">'repeat'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameBoard.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
                GameBoard.<span style="color: #660066;">preloadTextures</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">else</span>
                window.<span style="color: #660066;">setInterval</span><span style="color: #009900;">&#40;</span>GameMain.<span style="color: #660066;">mainLoop</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span></pre></div></div>

<p>Gotowe! Pełny kod źródłowy z dzisiejszego artykułu jest dostępny również <a href="/examples/game-0.0.3/index.html">online</a>,  jako działająca całość. Zapraszam do testów.</p>
<h3>Optymalizacja</h3>
<p>Po uruchomieniu gry zapewne zauważyłeś, że działa ona bardzo wolno. Jedynie przeglądarki działające w oparciu o WebKit potrafią osiągnąć oczekiwane 40 klatek. Poniżej dołączam małe zestawienie przeglądarek(aktualne ustawienia — odświeżanie klatki co 10ms —  powoduje, że maksymalna ilość klatek na sekundę to 100).</p>
<table>
<tr>
<th>Przeglądarka</th>
<th><abbr title="Frame Per Second - klatki na sekundę">fps</abbr></th>
</tr>
<tr>
<td>Safari (OS X)</td>
<td>50–60</td>
</tr>
<tr>
<td>Google Chrome(5.0.375.38 beta, GNU/Linux)</td>
<td>58–60</td>
</tr>
<tr>
<td>Mozilla Firefox(3.5.9, GNU/Linux)</td>
<td>31–33</td>
</tr>
<tr>
<td>Konqueror(4.3.5–0.1.1, GNU/Linux)</td>
<td>15–17</td>
</tr>
<tr>
<td>Opera(10.10, GNU/Linux)</td>
<td>12–16</td>
</tr>
</table>
<p>Oczywiście jest to zbyt mało aby gra była w pełni grywalna, ponieważ na mapie poruszać będzie się kilka czołgów otoczonych szeregiem animacji. Pamiętajmy jednak, że kod, który umieściłem na serwerze jest niezoptymalizowany. W kolejnych artykułach przedstawię sztuczki jak przyspieszyć rysowanie elementów w obiekcie canvas oraz jak skrócić czas wykonywania się zwykłego kodu JavaScript.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/328/obsluga-klawiatury-oraz-licznik-fps/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Canvas — Rysujemy mapę</title>
		<link>http://srodek.info/blog/270/rysujemy-mape</link>
		<comments>http://srodek.info/blog/270/rysujemy-mape#comments</comments>
		<pubDate>Sat, 15 May 2010 23:40:17 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Gry]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Moje projekty]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=270</guid>
		<description><![CDATA[Dzisiaj stworzę pierwszą wersję planszy do mojej gry. Spróbujmy wykreować obszar 16x16, generowany na podstawie tablicy z informacjami o poszczególnych polach. Po wygenerowaniu mapy pozostanie ona całkowicie statyczna więc liczenie fps pozostawię do kolejnego artykułu. Dzisiaj zajmijmy się stworzeniem głównej klasy oraz kilku metod inicjalizujących naszą planszę. Przede wszystkim potrzebujemy obiektu canvas o rozmiarach 512x512px(16x16 [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj stworzę pierwszą wersję planszy do mojej gry. Spróbujmy wykreować obszar 16x16, generowany na  podstawie tablicy z informacjami o poszczególnych polach. Po wygenerowaniu mapy pozostanie ona całkowicie statyczna więc liczenie <abbr title="Frame per second - Ilość klatek na sekundę">fps</abbr> pozostawię do kolejnego artykułu. Dzisiaj zajmijmy się stworzeniem głównej klasy oraz kilku metod inicjalizujących naszą planszę.</p>
<p><span id="more-270"></span></p>
<p>Przede wszystkim potrzebujemy obiektu canvas o rozmiarach 512x512px(16x16 pól o rozmiarach 32x32px).</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;canvas id=&quot;gameBoard&quot; width=&quot;512&quot; height=&quot;512&quot;&gt;&lt;/canvas&gt;</pre></div></div>

<p>Do wygenerowania mapy potrzebujemy również kilku tekstur. Tymczasowo posiadam jedynie trawę, wodę, cegłę oraz lód.</p>
<ol>
<li><img src="http://srodek.info/wp-content/uploads/2010/05/brick.png" alt="" width="32" height="32" /></li>
<li><img src="http://srodek.info/wp-content/uploads/2010/05/gameback.png" alt="" width="32" height="32" /></li>
<li><img src="http://srodek.info/wp-content/uploads/2010/05/ice.png" alt="" width="32" height="32" /></li>
<li><img src="http://srodek.info/wp-content/uploads/2010/05/water.png" alt="" width="32" height="32" /></li>
</ol>
<p>Trawę ustawiłem jako tło elementu canvas bezpośrednio w pliku CSS. Spróbujmy stworzyć główną klasę o nazwie GameBoard.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> GameBoard <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    ctx<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
    TEXTURE_ID<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>ICE<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> BRICK<span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> WATER<span style="color: #339933;">:</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
    textures<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'images/ice.png'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'images/brick.png'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'images/water.png'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
    board<span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
    drawBoard<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> y<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> y<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">16</span><span style="color: #339933;">;</span> y<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> x<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> x<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">16</span><span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">board</span><span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">board</span><span style="color: #009900;">&#91;</span>y<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">fillRect</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">*</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span>y<span style="color: #339933;">*</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #339933;">,</span><span style="color: #CC0000;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    preloadTextures<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> img <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        img.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        img.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            GameBoard.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> GameBoard.<span style="color: #660066;">ctx</span>.<span style="color: #660066;">createPattern</span><span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> <span style="color: #3366CC;">'repeat'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>GameBoard.<span style="color: #660066;">textures</span><span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
                GameBoard.<span style="color: #660066;">preloadTextures</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">else</span>
                GameBoard.<span style="color: #660066;">drawBoard</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    init<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'gameBoard'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ctx</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">canvas</span>.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;2d&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">preloadTextures</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pierwsze pole naszego obiektu — ctx(context) to kontekst obiektu canvas. Po przez niego odwołujemy do wszystkich metod rysujących. Następny obiekt — TEXTURE_ID — jest niczym innym jak zbiorem stałych(troszkę to przypomina enum znane z c++). W tym przykładzie nie jest on w ogóle używany jednak w przyszłości wygodniejsze będzie odwoływanie się za pomocą nazw. Kolejne pole — textures — to tablica adresów do naszych tekstur. Zauważ, że indeksy w tej tablicy odpowiadają wartościom stałych w TEXTURE_ID( TEXTURE_ID.ICE = 1 oraz textures[1] = ‚images/ice.png’). Przyjąłem, że tekstura zerowa to po prostu tekstura pusta(pełna przezroczystość). Na końcu widnieje tablica <em>board</em> zawierająca informacje o każdym polu. Liczba od 0 do 3 określa rodzaj tekstury.</p>
<h3>init()</h3>
<p>Metoda ta wyłapuje kontekst naszego pola canvas zapisuje go do pola <em>ctx</em> oraz wywołuje metodę preloadTextures(1). Rozpoczniemy ładowanie tekstur rozpoczynając od tej o identyfikatorze jedynki(zero jest zarezerwowane dla tekstury pustej).</p>
<h3>preloadTextures()</h3>
<p>Jako parametr metoda ta przyjmuje identyfikator tekstury(jej indeks w tablicy textures). Najpierw tworzymy pusty obraz, a następnie ustalamy jego adres. Po załadowaniu pliku z grafiką generujemy nowy wzór za pomocą ctx.createPattern() oraz nadpisujemy nim adres przechowywany w tablicy textures. Następnie sprawdzamy czy tekstura o identyfikatorze o jeden większym istnieje. Jeśli tak ładujemy ją. Jeśli nie wyświetlamy mapę</p>
<h3>drawBoard()</h3>
<p>Ta metoda rysuje pole po polu przechodząc przez wszystkie elementy z tablicy board. Sądzę, że kod jest oczywisty.</p>
<p>Efekt działania skryptu:</p>
<p><a href="http://srodek.info/wp-content/uploads/2010/05/board.png"><img src="http://srodek.info/wp-content/uploads/2010/05/board.png" alt="" title="board" width="512" height="512" class="aligncenter size-full wp-image-292" /></a></p>
<h3>Co następnym razem?</h3>
<p>Umieścimy na planszy naszą postać oraz zaprogramujemy metody odpowiedzialne za wyłapywanie zdarzeń klawiatury. Możliwe stanie się płynne poruszanie po mapie.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/270/rysujemy-mape/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Canvas — zarządzanie pikselami</title>
		<link>http://srodek.info/blog/190/canvas-zarzadzanie-pikselami</link>
		<comments>http://srodek.info/blog/190/canvas-zarzadzanie-pikselami#comments</comments>
		<pubDate>Sat, 17 Apr 2010 15:26:05 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[grafika]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=190</guid>
		<description><![CDATA[Pracuję aktualnie nad oskryptowaniem, które zostanie użyte na stronie mojego przyjaciela(http://szescian.pl/). Sęk w tym, że jego bujna wyobraźnia wygenerowała coś, z czym mogę mieć niemałe problemy. Mówiąc krótko: dużo matematyki oraz sporo generowania wielokątów. Postanowiłem, że użyję do tego celu technologii canvas. Mając chwilę czasu chciałbym się z wami podzielić kilkoma fajnymi technikami. O rysowaniu [...]]]></description>
			<content:encoded><![CDATA[<p>Pracuję aktualnie nad oskryptowaniem, które zostanie użyte na stronie mojego przyjaciela(<a href="http://szescian.pl">http://szescian.pl/</a>). Sęk w tym, że jego bujna wyobraźnia wygenerowała coś, z czym mogę mieć niemałe problemy. Mówiąc krótko: dużo matematyki oraz sporo generowania wielokątów. Postanowiłem, że użyję do tego celu technologii canvas. Mając chwilę czasu chciałbym się z wami podzielić kilkoma fajnymi technikami. O rysowaniu wielokątów napiszę innym razem. Dzisiaj chciałbym pokazać wam coś co dla wielu prawdopodobnie wydawałoby się niemożliwe <img src='http://srodek.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Spróbujemy przekonwertować, piksel po pikselu, obrazy za pomocą JavaScript.<br />
<span id="more-190"></span></p>
<p>Jako obraz poglądowy wybrałem jedno z moich zdjęć:<br />
<a href="http://srodek.info/wp-content/uploads/2010/04/test.jpg"><img class="aligncenter size-medium wp-image-191" title="test" src="http://srodek.info/wp-content/uploads/2010/04/test-e1271443513261-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>Spróbujmy najpierw stworzyć obiekt canvas, nadać mu identyfikator oraz po prostu wczytać do niego obrazek.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;canvas id=&quot;myCanvas&quot; width=&quot;600&quot; height=&quot;150&quot;&gt;Brak obsługi Canvas&lt;/canvas&gt;</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// wybranie elementu &lt;canvas&gt;</span>
<span style="color: #003366; font-weight: bold;">var</span> myCanvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'myCanvas'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// sprawdzenie czy można pobrać kontekst</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>myCanvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// pobranie &quot;kontekstu 2d&quot;</span>
  <span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> myCanvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ctx<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// stworzenie nowego obrazka</span>
  <span style="color: #003366; font-weight: bold;">var</span> img <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #006600; font-style: italic;">// okreslenie adresu</span>
  img.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'/examples/canvas1/mini.jpg'</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// stworzenie zdarzenie wywołanego po wczytaniu obrazka</span>
  img.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'load'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// rysuj obrazek rozpoczynajac od wspolrzednych 0,0 pola canvas</span>
    ctx.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Kolejnym krokiem jest wczytanie informacji o pliku. Chcę stworzyć 3 modyfikacje mojego zdjęcia więc robię to trzykrotnie.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">   <span style="color: #006600; font-style: italic;">// Get the pixels.</span>
    <span style="color: #003366; font-weight: bold;">var</span> imgdata <span style="color: #339933;">=</span> ctx.<span style="color: #660066;">getImageData</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> imgdata2 <span style="color: #339933;">=</span> ctx.<span style="color: #660066;">getImageData</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> imgdata3 <span style="color: #339933;">=</span> ctx.<span style="color: #660066;">getImageData</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Spróbujmy wykonać pierwsze przekształcenie polegające na konwersji zdjęcia do palety szarości.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">   <span style="color: #003366; font-weight: bold;">var</span> pix <span style="color: #339933;">=</span> imgd.<span style="color: #660066;">data</span><span style="color: #339933;">;</span> 
   <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> n <span style="color: #339933;">=</span> pix.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0.2989</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">0.5870</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">0.1140</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// czerwony</span>
      pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0.2989</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">0.5870</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">0.1140</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// zielony</span>
      pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0.2989</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">0.5870</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">0.1140</span><span style="color: #339933;">*</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// niebieski</span>
    <span style="color: #009900;">&#125;</span>
    ctx.<span style="color: #660066;">putImageData</span><span style="color: #009900;">&#40;</span>imgdata<span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Krótkie wytłumaczenie:<br />
Najpierw została pobrana tablica pikseli. Sposób zapisu danych na ich temat jest troszkę nietypowy. Każdy piksel jest mieszaniną trzech(czerwony, zielony, niebieski) kolorów oraz współczynnika przezroczystości. Dlatego, nasza tablica posiada 90 tys. elementów(150x150x4). Skacząc w pętli co cztery elementy, za każdym razem otrzymujemy nowy piksel do przebadania. Każdy z nich jest przekształcany na jeden z odcieni szarości. Na końcu obraz jest umieszczany w miejscu o współrzędnych 150,0(pierwszych 150 pikseli zajmuje nieprzekształcone zdjęcie, które umieściliśmy już wcześniej.</p>
<p>Spróbujmy odwrócić kolory:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">&nbsp;
   <span style="color: #003366; font-weight: bold;">var</span> pix <span style="color: #339933;">=</span> imgdata2.<span style="color: #660066;">data</span><span style="color: #339933;">;</span>
   <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> n <span style="color: #339933;">=</span> pix.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">255</span> <span style="color: #339933;">-</span> pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// czerwony</span>
      pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">255</span> <span style="color: #339933;">-</span> pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// zeilony</span>
      pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">255</span> <span style="color: #339933;">-</span> pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// niebieski</span>
    <span style="color: #009900;">&#125;</span>
    ctx.<span style="color: #660066;">putImageData</span><span style="color: #009900;">&#40;</span>imgdata2<span style="color: #339933;">,</span> <span style="color: #CC0000;">300</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ostatnim przekształceniem będzie zabawa z kolorami <img src='http://srodek.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Wydzieliłem również pas pikseli, który będzie przekształcany w inny sposób. W ten sposób można tworzyć efekty punktowe(np. podświetlić na biało oczy).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">   <span style="color: #003366; font-weight: bold;">var</span> pix <span style="color: #339933;">=</span> imgdata3.<span style="color: #660066;">data</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> n <span style="color: #339933;">=</span> pix.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">15000</span> <span style="color: #339933;">||</span> i<span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">75000</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
              pix<span style="color: #009900;">&#91;</span>i  <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">25</span><span style="color: #339933;">+</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">2</span><span style="color: #339933;">+</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">5</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// czerwony</span>
              pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">25</span><span style="color: #339933;">+</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">2</span><span style="color: #339933;">+</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">5</span> <span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// zielony</span>
              pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">25</span><span style="color: #339933;">+</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">2</span><span style="color: #339933;">+</span>pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">2</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// niebieski</span>
	  <span style="color: #009900;">&#125;</span>
	  <span style="color: #000066; font-weight: bold;">else</span>
	  <span style="color: #009900;">&#123;</span>
              pix<span style="color: #009900;">&#91;</span>i  <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> pix<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// czerwony</span>
              pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">2</span><span style="color: #339933;">+</span><span style="color: #CC0000;">50</span> <span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//zielony</span>
              pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> pix<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span><span style="color: #CC0000;">2</span><span style="color: #339933;">+</span><span style="color: #CC0000;">40</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// niebieski</span>
	  <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    ctx.<span style="color: #660066;">putImageData</span><span style="color: #009900;">&#40;</span>imgdata3<span style="color: #339933;">,</span> <span style="color: #CC0000;">450</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Oczywiście musimy jeszcze uzupełnić parametry funkcji oraz zamknąć wszystkie nawiasy.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pamiętajmy jednak, że element canvas jest niedostepny w starszych przeglądarkach Internet Explorer. Jeśli się nie mylę dopiero 9 wersja zacznie go obsługiwać poprawnie.</p>
<p>Cały przykład dostępny w postaci pliku js: <a href="/examples/canvas1/canvas.js">canvas.js</a></p>
<p>Efekt działania:<br />
<canvas id="myCanvas" width="600" height="150">Brak obsługi Canvas</canvas><script type="text/javascript" src="/examples/canvas1/canvas.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/190/canvas-zarzadzanie-pikselami/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Podgląd historii</title>
		<link>http://srodek.info/blog/166/podglad-historii</link>
		<comments>http://srodek.info/blog/166/podglad-historii#comments</comments>
		<pubDate>Wed, 17 Feb 2010 22:43:14 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=166</guid>
		<description><![CDATA[Różne przeglądarki w różny sposób zarządzają historią. Firefox domyślnie przechowuje ją przez 90 dni, Opera i IE około 20–30 a Chrome w nieskończoność. Czy twoja historia przeglądarki jest bezpieczna? Niestety nie do końca. Czy może ją podglądać twórca strony, na którą wchodzisz? W pewnym sensie tak. Dzisiaj przedstawię sposób w jaki sposób sprawdzić czy użytkownik [...]]]></description>
			<content:encoded><![CDATA[<p>Różne przeglądarki w różny sposób zarządzają historią. Firefox domyślnie przechowuje ją przez 90 dni, Opera i IE około 20–30 a Chrome w nieskończoność. Czy twoja historia przeglądarki jest bezpieczna? Niestety nie do końca. Czy może ją podglądać twórca strony, na którą wchodzisz? W pewnym sensie tak. Dzisiaj przedstawię sposób w jaki sposób sprawdzić czy użytkownik odwiedzał jakąś stronę.</p>
<p><span id="more-166"></span></p>
<h3>Sposób działania</h3>
<p>Nie da się(a przynajmniej nie w takiej postaci jaką dzisiaj pokażę) przeglądać całej historii. Jest jednak sposób aby wyciągnąć informację o tym czy użytkownik odwiedził konkretny adres www. Wszystko dlatego, że CSS posiada pseudoklasę :visited dzięki której można określij inne ostylowanie dla linków odwiedzonych. Przy użyciu JavaScript w łatwy sposób można sprawdzić, które linki mają inny styl i wysłać o nich informację na serwer.</p>
<h3>Implementacja</h3>
<p>Są dwie techniki, dzięki którym możemy wysłać informację na serwer. Pierwsza(moim zdaniem gorsza) w dużym skrócie wygląda tak:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;http://google.pl&quot; class=&quot;google&quot;&gt;Google!&lt;/a&gt;</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">a<span style="color: #6666ff;">.google</span><span style="color: #3333ff;">:visited</span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'http://example.com?sitevisited=google'</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Jeśli link jest odwiedzony zostanie wysłane zapytanie o tło do serwera example.com. Serwer wcale nie musi zwracać obrazka. Wystarczy, że doda użytkownika do swojej bazy danych.</p>
<p>Druga — znacznie ciekawsza — wykorzystuje JS, również działa w tle i także jest praktycznie nie widoczna dla użytkownika(trzeba zajrzeć do kodu). Co więcej nie musimy określać oddzielnych klas CSS dla każdego adresu. Przejdzmy do kodowania. Przede wszystkim potrzebujemy kontener na linki oraz styl dla odnośników odwiedzonych.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">  <span style="color: #cc00cc;">#tempLinkContainer</span> a<span style="color: #3333ff;">:visited</span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span><span style="color: #993333;">none</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Używam <em>display</em> a nie np. <em>color</em> ponieważ poszczególne przeglądarki różnie interpretują kolory — Opera przechowuje je w postaci heksadecymalnej #RRBBGG, a Firefox w systemie dzisiętnym rgb(R,G,B). <em>Display</em> jest jednolity więc nie będzie z nim problemów. Czas na rdzeń skryptu JavaScript.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> checkLink<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> myLink <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  myLink.<span style="color: #660066;">href</span><span style="color: #339933;">=</span> url<span style="color: #339933;">;</span>
  <span style="color: #003366; font-weight: bold;">var</span> container <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tempLinkContainer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  container.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>myLink<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>myLink.<span style="color: #660066;">currentStyle</span><span style="color: #009900;">&#41;</span>
    <span style="color: #003366; font-weight: bold;">var</span> visited <span style="color: #339933;">=</span> myLink.<span style="color: #660066;">currentStyle</span>.<span style="color: #660066;">display</span><span style="color: #339933;">==</span><span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">else</span>
    <span style="color: #003366; font-weight: bold;">var</span> visited <span style="color: #339933;">=</span> document.<span style="color: #660066;">defaultView</span>.<span style="color: #660066;">getComputedStyle</span><span style="color: #009900;">&#40;</span>myLink<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">display</span><span style="color: #339933;">==</span><span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
  container.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>myLink<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> visited<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Funkcja jako parametr przyjmuje adres url strony którą chcemy sprawdzić. Najpierw tworzony jest element <em>a</em> i uzupełniany jest jego parametr <em>href</em>. Następnie ten element jest umieszczany w naszym elemencie div. W ten sposób link otrzymuje odpowiednie ostylowanie jeśli jest odwiedzony. Jedyne co nam pozostaje to sprawdzenie parametru <em>display</em>. W tym celu należy pobrać styl obliczany naszego linku. Niestety IE(wraz z Operą) obsługują to troszke inaczej niż Firefox, Safari i inne przeglądarki — stąd ta instrukcja warunkowa. Wynik jest zapisywany do zmiennej <em>visited</em>, link niszczony i wartość na końcu zwracana. Efekt można zobaczyć <a href="/examples/checkHistory">tutaj</a>. Zauważ, że linki odwiedzone otrzymują klasę visited(ustawienie koloru na zielony). Żadna pseudoklasa <em>:visited</em>, nie definiuje zielonego koloru — jest to zasługa JavaScript.</p>
<p>Oczywiście ta technika nie jest idealna — rozróżnia np. linki typu:</p>
<ul>
<li>http://httpd.apache.org/docs/2.0/mod/core.html#errorlog</li>
<li>http://httpd.apache.org/docs/2.0/mod/core.html</li>
<li>http://httpd.apache.org</li>
</ul>
<p>Jednak łatwo domyśleć się, że większość użytkowników odwiedzających np. Facebook.com najpierw uruchamia jego stronę główną. Technikę tą można użyć nie tylko do szpiegowania użytkowników. Można dzięki niej uatrakcyjnić stronę internetową serwując różne rzeczy w zależności od historii np. można umieścić informację na temat profilu na Facebook.com zamiast na nasza-klasa.pl jeśli użytkownik nie odwiedza naszej-klasy a odzwiedza facebooka.</p>
<p>W weekend planuję przysiąść do poprawek mojego blogu więc prawdopodobnie spróbuję dodać kilka ciekawych opcji.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/166/podglad-historii/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ClickJacking</title>
		<link>http://srodek.info/blog/145/clickjacking</link>
		<comments>http://srodek.info/blog/145/clickjacking#comments</comments>
		<pubDate>Fri, 12 Feb 2010 01:04:47 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ClickJacking]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=145</guid>
		<description><![CDATA[Przez ostatnich kilka tygodni zacząłem interesować się hackingiem bezpieczeństwem stron internetowych. Postanowiłem więc napisać co nieco na temat zabezpieczania stron przed takimi atakami jak np. SQL Injection, XSS. Pokażę równiez metody podglądania kodu źródłowego, lub uruchamiania własnego kodu php na stronach o słabych zabezpieczeniach lub złej konfiguracji serwera. Dzisiaj natomiast w luźny sposób opiszę co [...]]]></description>
			<content:encoded><![CDATA[<p>Przez ostatnich kilka tygodni zacząłem interesować się <del datetime="2010-02-11T15:07:18+00:00">hackingiem</del> bezpieczeństwem stron internetowych. Postanowiłem więc napisać co nieco na temat zabezpieczania stron przed takimi atakami jak np. SQL Injection, XSS. Pokażę równiez metody podglądania kodu źródłowego, lub uruchamiania własnego kodu php na stronach o słabych zabezpieczeniach lub złej konfiguracji serwera. Dzisiaj natomiast w luźny sposób opiszę co to ClickJacking.</p>
<p>Rozpocznijmy od małej gry, którą napisałem przy użyciu jQuery na potrzeby tego artykułu. Polega ona na bardzo szybkim klikaniu w pojawiający się czerwony prostokąt. Dasz radę? <a href=" http://srodek.info/examples/clickjacking/">Zagraj!</a><br />
<span id="more-145"></span><br />
<a href="http://en.wikipedia.org/wiki/Clickjacking">ClickJacking</a> polega na — tłumacząc dosłownie — „porywaniu kliknięć“. Zasada jest prosta. Niewidzialna ramka jest ukrywana pod stroną za pomocą css(a dokładniej z-index). Czeka ona w tle, aż potencjalna ofiara zechce kliknąć w pewne pole na ekranie. Wtedy warstwa ramki przechodzi nad warstwę gry. Użytkownik myśląc, że klika w prawdziwy element w rzeczywistości uruchamia mechanizm z ramki. Brzmi niepozornie? Atak taki wykorzystywany jest na wiele sposobów. Można np. umieścić w ramcę stronę <a href="http://www.facebook.com/#!/settings/?tab=privacy&#038;section=profile">facebook.com</a> oraz odpowiednio sprecyzować pola w które należy kliknąć. Dzięki temu użytkownik zmieni swoje ustawienia dotyczące prywatności umożliwiając kradzież swoich danych osobowych i możliwość przeglądania zdjęć. Wbrew pozorom są setki niezabezpieczonych stron internetowych. Jedną z nich była kiedyś <a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager02.html">witryna konfiguracyjna wtyczki flash</a>. Odpowiednio sprecyzowana strona pozwalała na zmianę ustawieć wtyczki tak aby możliwy był dostęp do kamery internetowej(sic!). Dzięki temu hakerzy mogli nawet podglądać swoje ofiary. Na szczęście Adobe wprowadziło zabezpieczenia, które uniemożliwiają przeprowadzenie takiego ataku.</p>
<h3>Jak się chronić?</h3>
<p>Zwykli użytkownicy mogą zainstalować wtyczkę <a href="http://noscript.net/">NoScript</a>, która chroni przed tym atakiem. W przypadku twórców stron internetowych sprawa jest prosta. Nie wolno pozwalać uruchamiać naszej strony w ramce(tym bardziej, że ramki to już przestarzała technologia). Robi tak GMail, nasza-klasa, o2 i inni.<br />
Kod(tzw. <a href="http://en.wikipedia.org/wiki/Framekiller">Framekiller</a>) jest bardzo prosty:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>top<span style="color: #339933;">!=</span>self<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        top.<span style="color: #660066;">location</span>.<span style="color: #660066;">href</span><span style="color: #339933;">=</span>self.<span style="color: #660066;">location</span>.<span style="color: #660066;">href</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>W przypadku uruchomienia strony w ramce strona nadrzędna zostanie przekierowana na stronę w ramce.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/145/clickjacking/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

