<?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</title>
	<atom:link href="http://srodek.info/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.3.2</generator>
		<item>
		<title>Kompilatory CSS</title>
		<link>http://srodek.info/blog/457/kompilatory-css</link>
		<comments>http://srodek.info/blog/457/kompilatory-css#comments</comments>
		<pubDate>Mon, 15 Aug 2011 18:54:28 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Organizacja pracy]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=457</guid>
		<description><![CDATA[Witaj Świecie po raz n-ty! Kilka miesięcy temu miałem wrócić, a na blogu w dalszym ciągu cisza. No cóż, od kilku miesięcy pracuję na rynku zagranicznym i czasu mam coraz mniej. Ostatnio jednak wziąłem się za porządkowanie własnej pracy i udaje mi się znaleźć kilka wieczorów na napisanie paru zdań. Wróćmy jednak na chwilę do [...]]]></description>
			<content:encoded><![CDATA[<p>Witaj Świecie po raz n-ty! Kilka miesięcy temu miałem wrócić, a na blogu w dalszym ciągu cisza. No cóż, od kilku miesięcy pracuję na rynku zagranicznym i czasu mam coraz mniej. Ostatnio jednak wziąłem się za porządkowanie własnej pracy i udaje mi się znaleźć kilka wieczorów na napisanie paru zdań.</p>
<p>Wróćmy jednak na chwilę do pracy. Porównując to co aktualnie robię z tym czym zajmowałem się na etacie mogę śmiało powiedzieć, że różnica poziomów jest fenomenalna. O ile w poprzedniej pracy nauczyłem się naprawdę dużo, to jako freelancer pochłaniam wiedzę dużo szybciej. W kolejnych kilku artykułach chciałbym napisać jak przebiega mój standardowy dzień oraz jakich używam narzędzi oraz technik aby usprawnić swoją pracę. Temat na dzisiaj to kompilator CSS.<br />
<span id="more-457"></span></p>
<h2>Czym jest kompilator CSS?</h2>
<p>Kompilatory CSS to proste programy wprowadzające różnego rodzaju ulepszenia do języka arkuszy stylów. Dodają one nowe elementy do CSS, które po procesie kompilacji są zamieniane na zwykłe reguły rozumiane przez przeglądarki internetowe.</p>
<p>Prosty przykład:</p>
<p>Najbardziej przydatnym elementem wszystkich kompilatorów jest zagnieżdżanie reguł. Dzięki temu wizualnie widzimy, który element znajduje się wewnątrz innego.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#element</span><span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">16px</span><span style="color: #00AA00;">;</span>
    strong<span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">red</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
    em<span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">blue</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>W tym przypadku posiadamy element o id #element który może posiadać wewnątrz siebie elementy strong i em. Kod ten zostanie przekompilowany do postaci:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#element</span><span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">16px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#element</span> strong<span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">red</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#element</span> em<span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">blue</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<h2>Dlaczego warto?</h2>
<p>Przede wszystkim skraca się czas tworzenia strony, a w przypadku jej przyszłej modyfikacji praca nad arkuszem jest dużo prostsza. Podczas tworzenia małych stronek się tego nie odczuwa jednak przy większych projektach moim zdaniem kompilator CSS jest niezbędny. Aktualnie tworzę szablony do WordPressa i klienci często chcą aby dodać im jakąś funkcjonalność albo zgłaszają problemy kompatybilności szablonu z różnymi egzotycznymi wtyczkami(często pojawiają się konflikty CSS). W przypadku odpowiedniego kompilatora zarządzanie tym wszystkim nawet po upływie miesiąca jest dużo prostsze. Co więcej, kompilatory często zgłaszają błędy składni, niektóre wymagają idealnego porządku(np. średnika na końcu każdej reguły), udostępniają kompresowanie kodu i dużo, dużo więcej.</p>
<h2>Dostępne rozwiązania</h2>
<p>Kompilatorów CSS jest na prawdę sporo. Ja ograniczę się do czterech najbardziej popularnych. Praktycznie wszystkie spośród przedstawionych przeze mnie aplikacji udostępniają podstawowe funkcje kompilatora CSS np:</p>
<ul>
<li>Zagnieżdżanie elementów</li>
<li>Zmienne(w tym możliwość użycia zmiennych do nazw parametrów)</li>
<li>Operacje arytmetyczne</li>
<li>Obsługa importowania</li>
<li>Mieszanie reguł</li>
<li>Wiele wbudowanych funkcji np. zaogkrąglanie liczb, rozjaśnianie kolorów, czy zmiana koloru na szary odpowiednik</li>
</ul>
<p>Oczywiście różne kompilatory obsługują wymienione opcje w różnym stopniu. Pozostawiam to wam do dokładniejszego przetestowania.</p>
<h2>Sass</h2>
<p>Mój faworyt. Lekki, napisany w Ruby kompilator działający w czasie rzeczywistym.</p>
<p>Dodatkowo obsługiwane opcje:</p>
<ul>
<li>Instrukcje sterujące: @if, @while, @for oraz @each</li>
<li>Tryb interaktywny</li>
<li>Praca w czasie rzeczywistym</li>
<li>Dwa rodzaje składni: klasyczna, kompatybilna z CSS oraz oparta na wcięciach(podobna jak w plikach YAML, Pythonie lub Ruby)</li>
<li>Wsparcie dla Eclipse oraz NetBeans(poprzez nieoficjalne wtyczki)</li>
</ul>
<p>Strona projektu: <a href="http://sass-lang.com">http://sass-lang.com</a></p>
<h2>Less</h2>
<p>Bardzo potężny kompilator napisany w JavaScript. Jego ogromnym atutem jest działanie na dwóch płaszczyznach — po stronie klienta oraz po stronie serwera. Pierwsze rozwiązanie możemy zastosować podczas pracy nad stroną, drugie aby skompilować ostateczny plik i umieścić na serwerze.</p>
<p>Ciekawe opcje:</p>
<ul>
<li>Podwójny tryb pracy: po stronie klienta oraz poprzez konsolę</li>
<li>Przestrzenie nazw</li>
<li>Bardzo fajna składnia CSS-podobna</li>
<li>Możliwość umieszczania kodu JavaScript wewnątrz arkusza stylów</li>
<li>Bardzo fajna dokumentacja</li>
</ul>
<p>Strona projektu: <a href="http://lesscss.org">http://lesscss.org</a></p>
<h2>CleverCSS</h2>
<p>Trzeci na mojej osobistej liście. Lekki, napisany w Pythonie(lub w Haskellu). Posiada podstawową funkcjonalność i obsługuje tylko składnię opartą na wcięciach. </p>
<p>Przykład użycia:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#main</span> p<span style="color: #00AA00;">:</span>
  font-<span style="color: #00AA00;">&gt;</span>
    family<span style="color: #00AA00;">:</span> Verdana<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span>
    <span style="color: #000000; font-weight: bold;">size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1.1em</span>
    style<span style="color: #00AA00;">:</span> <span style="color: #993333;">italic</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#main</span> p <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> Verdana<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1.1em</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-style</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">italic</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>CleverCSS w Pyhonie: <a href="http://sandbox.pocoo.org/clevercss/">http://sandbox.pocoo.org/clevercss/</a></p>
<p>CleverCSS w Haskellu: <a href="http://sandbox.pocoo.org/clevercss-hs/">http://sandbox.pocoo.org/clevercss-hs/</a></p>
<h2>Hss</h2>
<p>Ostatni komplator umieszczam ze względu na sentyment do niego(oraz referer ale o tym za chwilę). Był on pierwszym kompilatorem, którego używałem i ze względu na jego prostotę jest ciekawym rozwiązaniem na początek. Jest to francuska produkcja na potrzeby firmy Motion-Twin(jeżeli ktoś zajmuje się programowaniem gier to zapewne ich zna) — firmy, która stworzyła bardzo przyjemną grę typu „Arkanoid“ — <a href="http://aphabounce.com">Alpha Bounce</a> (Jeżeli chcesz się zarejestrować możesz podać mój nick jako referer — „Hellson“).</p>
<p>Niestety HSS jest bardzo sztywnym kompilatorem. Jego jedynym plusem jest wsparcie dla tzw. „CSS hacks“. Wpisując np. <em>opacity: 0.6</em> kompilator sam doda odpowiednie filtry dla IE. Oczywiście nie zawsze jest to plus. Wiele osób(w tym ja) stara się tworzyć czyste pliki css a wszelkiego rodzaju sztuczki dla IE umieszczać w oddzielnych plikach.</p>
<p>Strona projektu: <a href="http://ncannasse.fr/projects/hss">http://ncannasse.fr/projects/hss</a></p>
<p>W następnym artykule postaram się zaprezentować kilka najważniejszych elementów kompilatora SASS. Jeżeli jednak to was nie interesuje(np. jeżeli wolicie sami poczytać dokumentację), to proszę piszcie. Zajmę się wtedy artykułem na temat kolejnych ciekawych elementów mojej codziennej pracy.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/457/kompilatory-css/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Długo, długo nic</title>
		<link>http://srodek.info/blog/445/dlugo-dlugo-nic</link>
		<comments>http://srodek.info/blog/445/dlugo-dlugo-nic#comments</comments>
		<pubDate>Sat, 09 Apr 2011 18:47:26 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=445</guid>
		<description><![CDATA[Jak zapewne zauważyliście od około pół roku jestem całkowicie nieosiągalny. Postanowiłem jednak powrócić do aktywnego pisania na blogu. Co więcej w między czasie tworzę nowy design(już na HTML5) więc odświeżę również wygląd. Dlaczego nie mam czasu dodawać nowych artykułów? W sierpniu poprzedniego roku krążąc po witrynach agencji interaktywnych z Lublina znalazłem na jednej z nich(nazwy [...]]]></description>
			<content:encoded><![CDATA[<p>Jak zapewne zauważyliście od około pół roku jestem całkowicie nieosiągalny. Postanowiłem jednak powrócić do aktywnego pisania na blogu. Co więcej w między czasie tworzę nowy design(już na HTML5) więc odświeżę również wygląd. Dlaczego nie mam czasu dodawać nowych artykułów? W sierpniu poprzedniego roku krążąc po witrynach agencji interaktywnych z Lublina znalazłem na jednej z nich(nazwy firmy nie podam) dziurę XSS(sic!). Poinformowałem ich o tym, a oni zaproponowali mi pracę. Zainteresowany odesłałem e-mail.<span id="more-445"></span></p>
<p>Niestety praca kolidowałaby ze studiami więc postanowiłem, że zmienię je na zaoczne. Pomyślałem, że dzięki temu zaoszczędzę sporo czasu, ponieważ zajęcia zazwyczaj odbywają się z ogromnymi „okienkami“ pomiędzy nimi. Mając 2 godziny wolnego czasu możesz wrócić do mieszkania, ale samo przejście się w obie strony zajmuje godzinę. Rozpoczynać pracę tylko po to aby programować 50 minut nie ma sensu, chodzić wszędzie z laptopem nie lubię, a telefon mam za słaby aby zapisywać w nim coś dłuższego. Złożyłem więc podanie i przeniesiono mnie na studia niestacjonarne. To był dobry ruch. Nie oszukujmy się — studia nie kształcą(przynajmniej nie programistów), a na zaocznych mam dużo łatwiej. Odrzuconych zostało sporo przedmiotów, a te które pozostały są na dużo niższym poziomie. Nie muszę się więc uczyć durnych rzeczy, których i tak nigdy nie wykorzystam(z drugiej strony jednak żałuję, że np. nie mam przedmiotu Bezpieczeństwo systemów komputerowych, który na studiach dziennych jest). Oczywiście studia kosztują więc musiałem znaleźć pracę. Na odpowiedź od wcześniej wspomnianej firmy czekałem około 5 tygodni(co za firma!) i do tego czasu, złożyłem CV w kilku innych miejscach. Pracę dostałem w <a href="http://netrix.com.pl">Netrix Group</a>.</p>
<p>Pracę na etacie jednak ciężko pogodzić z własnymi projektami. Z jednej strony od poniedziałku do piątku wycięte z życia 10h(1h dojazd, 8h pracy, 1h powrót do mieszkania), z drugiej studia w weekendy. Ogólny brak czasu na cokolwiek. Jeśli dorzuci się do tego jeszcze pisanie pracy licencjackiej to ilość wolnego czasu redukuje się do zera. Oczywiście pozostają wieczory ale te musiałem poświęcać na pisanie programów na studia. Przetrwałem tak 8 miesięcy i postanowiłem zmienić kolejną rzecz w moim życiu. W poprzednim tygodniu powiedziałem szefowi, że odchodzę. Popracuję do końca miesiąca i wracam na poważnie do własnych projektów.</p>
<p>Chciałbym podać kilka ważnych aspektów dla tych, którzy planują znaleźć pracę na etacie.</p>
<ol>
<li>Studia na w miarę porządnej uczelni jest ciężko pogodzić z pracą. Osobiście odradzam takie połączenie ponieważ po pół roku masz dość studiowania i pisania totalnie bezsensownych projektów tylko po to aby ktoś wpisał Ci trójkę lub czwórkę w indeks.</li>
<li>Warto się zatrudnić przynajmniej na kilka miesięcy ponieważ poznajesz ludzi, umiejących robić rzeczy, o którym sam wcześniej nawet nie wiedziałeś. Podczas pracy w Netrix Group poznałem dużo ciekawych rzeczy. Przede wszystkim poszerzyłem wiedzę na temat Zend Framework, opanowałem kilka nowych rzeczy z PostgreSQL-a. Poprawiłem swoją wiedzę na temat „cięcia stron“ oraz JavaScriptu. Poznałem kilka ciekawych bibliotek (np. ExtJS) oraz niesamowite IDE — PhpStorm(kosztuje $200 ale na prawdę się opłaca. Nie wiem jak to zrobiła czeska firma JetBrains ale mimo, że aplikacja napisana jest, tak jak inne znane IDE, w Javie i posiada dużo więcej opcji działa 5 razy szybciej niż Eclipse lub NetBeans. W domu wciąż pracuję z NetBeans ale jak tylko pojawi się rozsądna promocja(ostatnio było 50% ceny) kupuję licencję <img src='http://srodek.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</li>
<li>Jeżeli mieszkasz(tak jak ja) w innym mieście niż rodzice oraz dziadkowie i chciałbyś ich odwiedzić od czasu do czasu to musisz mieć świadomość, że będzie to utrudnione. Aby wrócić do domu rodzinnego muszę jechać około 1.5h. Jeżeli po pracy wyjadę z Lublina o 17:00 to o 18:30 będę w mieszkaniu rodziców. Zostając u nich na noc, następnego dnia muszę wstać o 5 aby dojechać do pracy na czas. Weekendy odpadają ponieważ zajęcia na studiach są co tydzień(przynajmniej na UMCS).</li>
</ol>
<p>Tak więc w skrócie: 1 maja kończę pracę, 1 lipca kończę studia i powracam do tworzenia gier www.</p>
<p>Co dalej? Znów będę wolnym strzelcem. Odłożyłem trochę pieniędzy i dwa, może trzy, miesiące jestem w stanie przeżyć bez pracy. Spróbuję poszukać kontaktów w USA i uderzyć w rynek zagraniczny aby pracując mniej zarabiać więcej. </p>
<p>PS: licencjat piszę na temat Bezpieczeństwa aplikacji www. Nie wiem jak są rozdzielane prawa do publikowania pracy, ale spróbuję się tego dowiedzieć i jeżeli tylko będę mógł, to opublikuję całość w formie kilkunastu artykułów.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/445/dlugo-dlugo-nic/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Mohebo Framework 0.3</title>
		<link>http://srodek.info/blog/418/mohebo-framework-0-3</link>
		<comments>http://srodek.info/blog/418/mohebo-framework-0-3#comments</comments>
		<pubDate>Sat, 11 Sep 2010 14:02:30 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Moje projekty]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=418</guid>
		<description><![CDATA[Ukończyłem kolejną wersję mojego frameworka php. Zmian jest niewiele lecz dotyczą głównego rdzenia oraz struktury frameworka. Jeżeli zajdą kolejne w strukturze plików i katalogów będą one jedynie drobnymi zabiegami kosmetycznymi. Zaktualizowałem stronę frameworka — http://mohebo.com. Przepisałem dokumentację, tak aby przykłady działały w wersji 0.3. W przypadku błędów, problemów itp. proszę o kontakt bezpośredni. Najważniejsze zmiany: [...]]]></description>
			<content:encoded><![CDATA[<p>Ukończyłem kolejną wersję mojego frameworka php. Zmian jest niewiele lecz dotyczą głównego rdzenia oraz struktury frameworka. Jeżeli zajdą kolejne w strukturze plików i katalogów będą one jedynie drobnymi zabiegami kosmetycznymi. Zaktualizowałem stronę frameworka — http://mohebo.com. Przepisałem dokumentację, tak aby przykłady działały w wersji 0.3. W przypadku błędów, problemów itp. proszę o kontakt bezpośredni.</p>
<p><span id="more-418"></span></p>
<p>Najważniejsze zmiany:</p>
<ul>
<li>Rozbudowałem klasę logującą błędy to wyświetlanie backtrace’u w postaci pokolorowanego kodu php wyciągniętego z plików powodujących błąd.</li>
<li>Zmiana struktury katalogów. /system został przekształcony w /library. Katalog /log wskoczył wewnątrz application oraz doszedł nowy katalog bin(w nim będzie dostępna konsola).</li>
<li>Zmiana nazw klas i plików. Teraz każdy plik i klasa rozpoczyna się wielką literą.</li>
<li>Przebudowa autoloadera. W przypadku stworzenia obiektu klasy Klasa_Cos_Innego lub KlasaCosInnego zostanie autmatycznie odczytany plik Klasa/Cos/Innego.php. Jednak w przypadku tworzenia obiektu klasy Klasa_Cos_InnegoTutaj już Klasa/Cos/InnegoTutaj.php. Dzięki temu zachowałem w pewnym stopniu kompatybilność z PSR-0 jednocześnie pozostawiając własną metodologię nienaruszoną.</li>
<li>Dodanie metod init() orad end() do controllera. init() jest wykonywane przed uruchomieniem akcji, end() po. Uwaga: jeżeli jedna akcja wykona inną init() oraz end() zostaną wywołane tylko raz.</li>
<p>Link bezpośredni do paczki: <a href="http://srodek.info/files/MoheboFramework-0.3.tar.gz">http://srodek.info/files/MoheboFramework-0.3.tar.gz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/418/mohebo-framework-0-3/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Własna skórka dla Chrome</title>
		<link>http://srodek.info/blog/404/wlasna-skorka-dla-chrome</link>
		<comments>http://srodek.info/blog/404/wlasna-skorka-dla-chrome#comments</comments>
		<pubDate>Sun, 18 Jul 2010 12:10:25 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=404</guid>
		<description><![CDATA[Wczoraj przypadkowo trafiłem na stronę udostępniającą motywy dla przeglądarki ze stajni Google. Postanowiłem, że sprawdzę czym to się je i zostałem miło zaskoczony — cały proces jest bardzo, bardzo prosty. Wystarczy stworzyć kilka grafik oraz plik manifest.json zawierający ustawienia kolorów. Niestety ilość dostępnych opcji jest bardzo ograniczona i z niecierpliwością czekam na jakieś bogatsze możliwości [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj przypadkowo trafiłem na stronę udostępniającą motywy dla przeglądarki ze stajni Google. Postanowiłem, że sprawdzę czym to się je i zostałem miło zaskoczony — cały proces jest bardzo, bardzo prosty. Wystarczy stworzyć kilka grafik oraz plik manifest.json zawierający ustawienia kolorów. Niestety ilość dostępnych opcji jest bardzo ograniczona i z niecierpliwością czekam na jakieś bogatsze możliwości w przyszłych wersjach chrome.</p>
<p><span id="more-404"></span></p>
<p>Paczkę wrzuciłem na serwer. Wystarczy kliknąć <a href="/files/chromium/msrodek.crx">tutaj</a></p>
<p>Oto jak wygląda Chromium z moją skórką.</p>
<p><a href="http://srodek.info/wp-content/uploads/2010/07/theme-screenshot.png"><img src="http://srodek.info/wp-content/uploads/2010/07/theme-screenshot-300x173.png" alt="" title="Theme screenshot" width="300" height="173" class="aligncenter size-medium wp-image-405" /></a></p>
<p>Jako główny kolor wybrałem zieleń ponieważ uspokaja on oczy. Całość urozmaiciłem ivadersami oraz <a href="http://www.youtube.com/watch?v=J---aiyznGQ">kotem grającym na klawiszach</a>. Ciężko było przygotować grafikę(np. invadersów musiałem ręcznie rysować), ale mam nadzieję, że efekt jest ciekawy <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/404/wlasna-skorka-dla-chrome/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>openSUSE 11.3</title>
		<link>http://srodek.info/blog/402/opensuse-11-3</link>
		<comments>http://srodek.info/blog/402/opensuse-11-3#comments</comments>
		<pubDate>Sat, 17 Jul 2010 17:09:04 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=402</guid>
		<description><![CDATA[Dzisiaj spędziłem trochę czasu na porządkowanie dysku twardego. Usunąłem praktycznie wszystko, a backup nagrałem na płytę. Przeinstalowałem system ponieważ poprzednia wersja strasznie wolno działała. Co nowego w openSUSE 11.3? Przede wszystkim zwiększenie prędkości. Całe KDE pracuję troszkę szybciej i stabilniej(ale to może być spowodowane wcześniejszymi paczkami z repozytorium Factory). Przyspieszył m.in. Amarok oraz Firefox. Flash [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj spędziłem trochę czasu na porządkowanie dysku twardego. Usunąłem praktycznie wszystko, a backup nagrałem na płytę. Przeinstalowałem system ponieważ poprzednia wersja strasznie wolno działała. Co nowego w openSUSE 11.3? Przede wszystkim zwiększenie prędkości. Całe KDE pracuję troszkę szybciej i stabilniej(ale to może być spowodowane wcześniejszymi paczkami z repozytorium Factory). Przyspieszył m.in. Amarok oraz Firefox. Flash niestety wciąż działa niezadowalająco. Zmienił się oczywiście kernel na nowszy, a wraz z nim wolne sterowniki do kart graficznych. Zmienie uległa samba oraz kilka innych rzeczy, dodano również nowy system plików Btrfs. Dla użytkowników Wine ciekawą informacją jest nowy Xorg(1.8.0). Nie jestem pewien czy ten system idzie w dobrym kierunku(prędkość pozostawia wiele do życzenia) jednak konfiguracja wszystkiego to jedynie kilka kliknięć i właśnie za to go lubię <img src='http://srodek.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Tuż po instalacji dointalowałem NetBeans 6.9 oraz skonfigurowałem Apache/MySQL, PHP. Pierwsze co mi później przyszło na myśl, to dopisanie obsługi PDO oraz Doctrine w moim Frameworku. Środowisko mam już przygotowane, więc czas się wziąć do pracy…</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/402/opensuse-11-3/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mohebo Framework 0.2</title>
		<link>http://srodek.info/blog/397/mohebo-framework-0-2</link>
		<comments>http://srodek.info/blog/397/mohebo-framework-0-2#comments</comments>
		<pubDate>Fri, 16 Jul 2010 23:51:51 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Moje projekty]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=397</guid>
		<description><![CDATA[Dzisiaj, po dwóch latach ciężkiej pracy, wydałem kolejną wersję mojego frameworka. Poprawek nie ma wiele jednak spora ich część znacznie ułatwia pracę. Najważniejszą jednak jest chyba zmiana licencji z LGPL na MIT. W ciągu kilka najbliższych dni postaram się napisać kilka artykułów z serii „Tworzymy portal w oparciu o Mohebo Framework“. Mam nadzieję, że przypadnie [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj, po dwóch latach ciężkiej pracy, wydałem kolejną wersję mojego frameworka. Poprawek nie ma wiele jednak spora ich część znacznie ułatwia pracę. Najważniejszą jednak jest chyba zmiana licencji z LGPL na MIT. W ciągu kilka najbliższych dni postaram się napisać kilka artykułów z serii „Tworzymy portal w oparciu o Mohebo Framework“. Mam nadzieję, że przypadnie on wam do gustu. Wszelkie opinie i komentarze proszę zamieszczać tutaj lub dołączyć się do dyskusji na <A href="http://forum.php.pl/index.php?showtopic=102221&#038;view=getnewpost">forum.php.pl</a></p>
<p>Paczka jest dostępna pod adresem: <a href="http://srodek.info/files/MoheboFramework-0.2.tar.gz">http://srodek.info/files/MoheboFramework-0.2.tar.gz</a><br />
Dokumentację można znaleźć na <a href="http://mohebo.com">http://mohebo.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/397/mohebo-framework-0-2/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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>Prokrastynacja</title>
		<link>http://srodek.info/blog/376/prokrastynacja</link>
		<comments>http://srodek.info/blog/376/prokrastynacja#comments</comments>
		<pubDate>Wed, 07 Jul 2010 11:28:34 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=376</guid>
		<description><![CDATA[Prokrastynacja lub zwlekanie (z łac. procrastinatio – odroczenie, zwłoka) – w psychologii: patologiczna tendencja do nieustannego przekładania pewnych czynności na później, ujawniającą się w różnych dziedzinach życia. Bywa żartobliwie nazywana „syndromem studenta“. Prokrastynator ma problemy z zabraniem się do pracy i odkłada jej wykonanie, zwłaszcza wtedy, gdy nie widzi natychmiastowych efektów. Źródło: http://pl.wikipedia.org/wiki/Prokrastynacja Tak, cierpię [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Prokrastynacja lub zwlekanie (z łac. procrastinatio – odroczenie, zwłoka) – w psychologii: patologiczna tendencja do nieustannego przekładania pewnych czynności na później, ujawniającą się w różnych dziedzinach życia. Bywa żartobliwie nazywana „syndromem studenta“.<br />
Prokrastynator ma problemy z zabraniem się do pracy i odkłada jej wykonanie, zwłaszcza wtedy, gdy nie widzi natychmiastowych efektów.</p></blockquote>
<p>Źródło: <a href="http://pl.wikipedia.org/wiki/Prokrastynacja">http://pl.wikipedia.org/wiki/Prokrastynacja</a></p>
<p>Tak, cierpię na to zaburzenie. I mój przypadek jest dosyć ciekawy. Pracuję intensywnie ale tuż przed ukończeniem porzucam projekt i rozpoczynam kolejny. Oczywiście staram się walczyć z moim lenistwem i dzisiaj chciałbym zaprezentować mój nowy sposób na zmuszanie się do pracy i zwiększanie motywacji.</p>
<p><span id="more-376"></span></p>
<p>Pierwszym krokiem jest stworzenie pliku index.html, który będzie zawierał tekst zachęcający nas do pracy.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span> 
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span style="color: #000066;">dir</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;ltr&quot;</span> <span style="color: #000066;">lang</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;pl-PL&quot;</span>&gt;</span> 
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span> 
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;content-type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span> 
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span> Pracuj, pracuj...<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span> 
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;font-family:helvetica; width:600px; margin:auto; background:#eee; padding:20px; border:1px solid #ccc;&quot;</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>WEŹ SIĘ DO ROBOTY!<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Lista rzeczy do zrobienia<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
		    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>Dokumentacja<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
		    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>Kolejna część artykułu o tankach<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
		    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>Spisanie tabulatur<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
		    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>Pisanie książki<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Zarobisz dużo pieniędzy i będziesz bogaty.<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>JEŻELI NIE WYKONUJESZ PUNKTU 3. NIE IDŹ PO GITARĘ! ZOSTAŃ TAM GDZIE JESTEŚ!<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p>Teraz przechodzimy do edycji pliku /etc/hosts</p>
<pre class="console">sudo mcedit /etc/hosts</pre>
<p>Dopisujemy kilka adresów stron internetowych, na oglądanie których tracimy najwięcej czasu.</p>
<pre class="console">
127.0.0.1        facebook.com
127.0.0.1        wykop.pl
127.0.0.1        youtube.com
127.0.0.1        demotywatory.pl
127.0.0.1        nk.pl
</pre>
<p>Przekierowanie gotowe. Możemy wziąć się do pracy.</p>
<p>Informacja dla użytkowników systemów z rodziny Windows. Jeżeli dobrze pamiętam, plik hosts znajduje się w C:\windows\system32, a przynajmniej tam się znajdował, gdy ja korzystałem z Microsoft Windows XP.
<p>Aby rozwiać wszelkie wątpliwości — pisanie tego artykułu to również forma odwlekania mojej pracy <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/376/prokrastynacja/feed</wfw:commentRss>
		<slash:comments>7</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>
	</channel>
</rss>

