<?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/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Abrindo o Jogo</title>
	<atom:link href="http://abrindoojogo.com.br/feed" rel="self" type="application/rss+xml" />
	<link>http://abrindoojogo.com.br</link>
	<description></description>
	<lastBuildDate>Thu, 16 Feb 2012 06:07:51 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<copyright>Copyright © Abrindo o Jogo 2011 </copyright>
	<managingEditor>contato@abrindoojogo.com.br (Abrindo o Jogo)</managingEditor>
	<webMaster>contato@abrindoojogo.com.br (Abrindo o Jogo)</webMaster>
	<ttl>1440</ttl>
	<image>
		<url>http://abrindoojogo.com.br/files/logoItunes_144.jpg</url>
		<title>Abrindo o Jogo</title>
		<link>http://abrindoojogo.com.br</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle>PodAbrir - o Podcast do Abrindo o Jogo.</itunes:subtitle>
	<itunes:summary>Dicas e opiniões sobre a indústria dos games, abordando desde o desenvolvimento até o mercado.</itunes:summary>
	<itunes:keywords>jogos, game, development, desenvolvimento, indie, programming</itunes:keywords>
	<itunes:category text="Games &#38; Hobbies">
		<itunes:category text="Video Games" />
	</itunes:category>
	<itunes:category text="Technology" />
	<itunes:author>Abrindo o Jogo</itunes:author>
	<itunes:owner>
		<itunes:name>Abrindo o Jogo</itunes:name>
		<itunes:email>contato@abrindoojogo.com.br</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://abrindoojogo.com.br/files/logoItunes_600.jpg" />
		<item>
		<title>PodAbrir 13 &#8211; 3D Character Design parte 2</title>
		<link>http://abrindoojogo.com.br/podabrir-13-3d-character-design-parte-2</link>
		<comments>http://abrindoojogo.com.br/podabrir-13-3d-character-design-parte-2#comments</comments>
		<pubDate>Thu, 16 Feb 2012 06:07:51 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[Entrevistas]]></category>
		<category><![CDATA[Game Art]]></category>
		<category><![CDATA[Pod-Abrir]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3918</guid>
		<description><![CDATA[Olá gurizada, estamos de volta com mais um podcast sobre desenvolvimento de games. No episódio número 13 do PodAbrir, trazemos a segunda parte da interessante entrevista com Alessandro Lima, Character Design da Aquiris Game Experience. Na continuação, Alessando fala sobre os projetos que participou e também compartilha detalhes do processo de produção.  Na seção sobre [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/02/logo2.jpg"><img class="alignleft size-full wp-image-3996" title="logo2" src="http://abrindoojogo.com.br/wp-content/uploads/2012/02/logo2.jpg" alt="" width="132" height="161" /></a>Olá gurizada,</p>
<p>estamos de volta com mais um podcast sobre desenvolvimento de games. No episódio número 13 do PodAbrir, trazemos a segunda parte da interessante entrevista com Alessandro Lima, Character Design da Aquiris Game Experience.</p>
<p>Na continuação, Alessando fala sobre os projetos que participou e também compartilha detalhes do processo de produção.  Na seção sobre games indie, comentamos sobre o Bastion e a tecnologia Native Client do Google Chrome.</p>
<p><span id="more-3918"></span></p>
<div><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/02/transparente.png"><img class="aligncenter size-full wp-image-4008" title="transparente" src="http://abrindoojogo.com.br/wp-content/uploads/2012/02/transparente.png" alt="" width="7" height="36" /></a></div>
<div><strong>Participantes:</strong></div>
<div>
<ul>
<li>Everton Vieira</li>
<li>Alessandro Nörnberg</li>
<li>Alessandro lima</li>
</ul>
</div>
<div><strong>Categoria:</strong></div>
<div>
<ul>
<li>Técnico: Game Art</li>
</ul>
</div>
<p><strong>Links comentados na seção de recados e e-mails:</strong></p>
<div>
<ul>
<li><a href="http://www.rockheadgames.com/index.html" target="_blank">Site da Rockhead Games</a></li>
<li>Bastion
<ul>
<li><a href="http://supergiantgames.com/" target="_blank">Site da Super Giant Games</a> (desenvolvedora do Bastion)</li>
<li><a href="https://chrome.google.com/webstore/detail/oohphhdkahjlioohbalmicpokoefkgid" target="_blank">Bastion na Chrome Web Store</a></li>
<li><a href="http://youtu.be/qHm2URL0H_o" target="_blank">Vídeo do jogo</a></li>
<li><a href="http://www.youtube.com/playlist?list=PLE92A345D7C2A1B2D" target="_blank">Trilha sonora do Bastion</a></li>
</ul>
</li>
<li>Chrome Native Client (NaCl)
<ul>
<li><a href="https://developers.google.com/native-client/" target="_blank">Site do Chrome Native Client</a> (aqui tem a <a href="https://developers.google.com/native-client/overview" target="_blank">visão geral do funcionamento</a>)</li>
<li><a href="http://en.wikipedia.org/wiki/Google_Native_Client#Criticism_and_Controversies" target="_blank">Críticas ao Chrome Native Client</a>, na Wikipedia.</li>
<li>Mais dois projetos com o Native Client na Chrome Web Store:
<ul>
<li><a href="https://chrome.google.com/webstore/detail/pjlncddmdljpioccbmempchonhlifakc" target="_blank">Wolf Toss</a>, feito com o<a href="http://getmoai.com/" target="_blank"> SDK Moai</a>, que também é compatível com Chrome NaCl.</li>
<li><a href="https://chrome.google.com/webstore/detail/kcfbijoldkenmemnbbkjnpdhnijgahck" target="_blank">Port do MAME</a> (mas apenas o básico)</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>Links comentados neste episódio</strong><strong>:</strong></p>
</div>
<ul>
<li>Site do Alessandro Lima
<ul>
<li><a href="http://www.alessandrolima.com/" target="_blank">www.alessandrolima.com</a></li>
</ul>
</li>
<li>Artistas:
<ul>
<li><a href="http://www.luisroyo.com/" target="_blank">www.luisroyo.com</a></li>
<li><a href="http://www.bromart.com/" target="_blank">www.bromart.com</a></li>
<li><a href="http://www.3d.sk/" target="_blank">www.3d.sk</a></li>
</ul>
</li>
<li>Projetos:
<ul>
<li><a href="http://produtos.delvalle.com.br/valesmagicos/" target="_blank">Vales Magicos</a></li>
<li><a href="http://unity3d.com/gallery/demos/live-demos" target="_blank">Live Demos da Unity 3D</a></li>
<li><a href="http://www.supervoleibrasil.com.br/" target="_blank">Super Volei Brasil</a></li>
<li><a href="http://www.aquiris.com.br/pt/games/detalhes/index.php?id=16" target="_blank">Gillete Young Guns</a></li>
<li><a href="http://www.aquiris.com.br/pt/games/detalhes/index.php?id=8" target="_blank">Axe Dart Temptation</a></li>
<li><a href="http://www.aquiris.com.br/pt/games/detalhes/index.php?id=38" target="_blank">Axe Music Star</a></li>
<li><a href="http://www.goodyeareaglegt.com.br/" target="_blank">Goodyear Eagle GT</a></li>
<li><a href="http://vimeo.com/channels/aquiris" target="_blank">Quantum Conflict</a></li>
</ul>
</li>
</ul>
<div>
<p><strong>Trilha Sonora</strong></p>
<ul>
<li>Heavy Metal in The Night &#8211; <a href="http://www.dreamevil.se/" target="_blank">Dream Evil</a></li>
</ul>
<p><strong>PodCast</strong></p>
<ul>
<li>Siga o nosso podcast em <a href="../feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>.</li>
<li>Para o Itunes, acesse a <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en" target="_blank">store aqui</a>.</li>
</ul>
</div>
<p style="text-align: center;"><a href="http://www.facebook.com/abrindoojogo" target="_blank"><strong>Visitem nossa página no Facebook</strong></a></p>
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-13-3d-character-design-parte-2/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/3918/0/PodAbrir13.mp3" length="60772221" type="audio/mpeg" />
		<itunes:duration>1:03:12</itunes:duration>
		<itunes:subtitle>Olá gurizada,
estamos de volta com mais um podcast sobre desenvolvimento de games. No episódio número 13 do PodAbrir, trazemos a segunda parte da interessante entrevista com Alessandro Lima, Character Design da Aquiris Game Experience.
Na continuaçã[...]</itunes:subtitle>
		<itunes:summary>Olá gurizada,
estamos de volta com mais um podcast sobre desenvolvimento de games. No episódio número 13 do PodAbrir, trazemos a segunda parte da interessante entrevista com Alessandro Lima, Character Design da Aquiris Game Experience.
Na continuação, Alessando fala sobre os projetos que participou e também compartilha detalhes do processo de produção.  Na seção sobre games indie, comentamos sobre o Bastion e a tecnologia Native Client do Google Chrome.


Participantes:


Everton Vieira
Alessandro Nörnberg
Alessandro lima


Categoria:


Técnico: Game Art


Links comentados na seção de recados e e-mails:


Site da Rockhead Games
Bastion

Site da Super Giant Games (desenvolvedora do Bastion)
Bastion na Chrome Web Store
Vídeo do jogo
Trilha sonora do Bastion


Chrome Native Client (NaCl)

Site do Chrome Native Client (aqui tem a visão geral do funcionamento)
Críticas ao Chrome Native Client, na Wikipedia.
Mais dois projetos com o Native Client na Chrome Web Store:

Wolf Toss, feito com o SDK Moai, que também é compatível com Chrome NaCl.
Port do MAME (mas apenas o básico)





Links comentados neste episódio:


Site do Alessandro Lima

www.alessandrolima.com


Artistas:

www.luisroyo.com
www.bromart.com
www.3d.sk


Projetos:

Vales Magicos
Live Demos da Unity 3D
Super Volei Brasil
Gillete Young Guns
Axe Dart Temptation
Axe Music Star
Goodyear Eagle GT
Quantum Conflict




Trilha Sonora

Heavy Metal in The Night &#8211; Dream Evil

PodCast

Siga o nosso podcast em http://abrindoojogo.com.br/feed/podcast.
Para o Itunes, acesse a store aqui.


Visitem nossa página no Facebook
</itunes:summary>
		<itunes:keywords>Entrevistas, Pod-Abrir</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
		<item>
		<title>Tutorial HTML 5 &#8211; Parte 2/3</title>
		<link>http://abrindoojogo.com.br/tutorial-html-5-parte-23</link>
		<comments>http://abrindoojogo.com.br/tutorial-html-5-parte-23#comments</comments>
		<pubDate>Tue, 14 Feb 2012 06:23:47 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3959</guid>
		<description><![CDATA[Na primeira parte do tutorial de HTML 5 vimos como usar a tag &#60;canvas&#62; e como mostrar imagens nela, criando uma pequena biblioteca para facilitar o trabalho. Nesta segunda parte ampliaremos nossa biblioteca adicionando um motor simples, com um gameloop bem básico e tratamento de entrada (mouse e teclado). Na parte anterior criamos um biblioteca básica [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/HTML5-logo.png"><img class="alignleft size-thumbnail wp-image-3349" title="HTML5-logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/HTML5-logo-150x150.png" alt="" width="150" height="150" /></a>Na primeira parte do tutorial de HTML 5 vimos como usar a tag &lt;canvas&gt; e como mostrar imagens nela, criando uma pequena biblioteca para facilitar o trabalho.</p>
<p>Nesta segunda parte ampliaremos nossa biblioteca adicionando um motor simples, com um gameloop bem básico e tratamento de entrada (mouse e teclado).</p>
<p><span id="more-3959"></span>Na <a href="http://abrindoojogo.com.br/tutorial-html-5-parte-13" target="_blank">parte anterior</a> criamos um biblioteca básica para utilização do &lt;canvas&gt;, a qual ficou em um arquivo chamado aojcanvas.js. As rotinas dela servem de atalhos para procedimentos que requerem mais de uma linha de código, como desenhar um retângulo preenchido ou desenhar uma imagem rotacionada na tela.</p>
<p>No entanto isso tudo referia-se apenas ao uso básico do objeto canvas, sem nada que lembrasse um jogo de fato.</p>
<p>A arquitetura comum de um jogo sempre consiste em uma repetição onde temos o tratamento da entrada, atualização da lógica do jogo e atualização da parte visual (mostrar o jogo na tela). Estes procedimentos ficam sendo repetidos indefinidamente, até que o jogo seja desligado. A esta repetição chamamos de game loop e cada volta que este loop dá chamamos de pulso.</p>
<p>Dito isso, vejamos como criar um game loop em javascript para rodar no navegador.</p>
<h2>Game loop</h2>
<p>O nosso &#8220;motor&#8221;, por assim dizer, ficará em um arquivo chamado aojgame.js e nele teremos o código abaixo.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> _aojFPS <span style="color: #339933;">=</span> <span style="color: #CC0000;">25</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> _aojPulseCallback <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> _aojPulsesCount <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> _aojPulsesInLastSecond <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> _aojLastMilisecond <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> aojFPS<span style="color: #009900;">&#40;</span>optionalNewValue<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>optionalNewValue<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        _aojFPS <span style="color: #339933;">=</span> optionalNewValue<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">return</span> _aojFPS<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> aojSetPulseCallback<span style="color: #009900;">&#40;</span>callbackFunction<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    _aojPulseCallback <span style="color: #339933;">=</span> callbackFunction<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> aojStartGameLoop<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: #339933;">!</span>_aojPulseCallback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'É preciso especificar a função a ser chamada a cada pulso, com aojSetPulseCallback. GameLoop não iniciado.'</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><span style="color: #339933;">!</span>_aojCanvas<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'É preciso especificar o canvas a ser usado, com aojSetCanvas. GameLoop não iniciado.'</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: #009900;">&#123;</span>
        _aojLastMilisecond <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>
        setInterval<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'aojPulse()'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1000</span> <span style="color: #339933;">/</span> _aojFPS<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> aojPulse<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>_aojPulseCallback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        _aojPulsesCount <span style="color: #339933;">++;</span>
        <span style="color: #003366; font-weight: bold;">var</span> d <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: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>d.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> _aojLastMilisecond <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            _aojLastMilisecond <span style="color: #339933;">=</span> d.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            _aojPulsesInLastSecond <span style="color: #339933;">=</span> _aojPulsesCount<span style="color: #339933;">;</span>
            _aojPulsesCount <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        _aojPulseCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        aojFillRect<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">6</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #339933;">,</span><span style="color: #CC0000;">50</span><span style="color: #339933;">,</span><span style="color: #CC0000;">20</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'blue'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        aojSetFont<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        aojDrawText<span style="color: #009900;">&#40;</span>_aojPulsesInLastSecond <span style="color: #339933;">+</span> <span style="color: #3366CC;">' fps'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">20</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'yellow'</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>Temos apenas quatro rotinas, sendo as duas primeiras apenas de configuração.</p>
<p><strong>aojFPS()</strong> serve para indicar qual a taxa de frames por segundo desejada para o jogo. Importante notar que este motor simples não tem separação entre update e render &#8211; ele chama apenas uma rotina de pulso.</p>
<p>O nome da rotina de pulso é definido por você, fora do motor, e passado como parâmetro para a segunda rotina de configuração que temos: <strong>aojSetPulseCallback()</strong>.</p>
<p>Callback é como chamamos a técnica de, ao chamar uma rotina (geralmente de uma biblioteca), passar para ela uma rotina nossa para que seja chamada de volta (daí o nome call back). No caso deste nosso motor, a rotina informada em aojSetPulseCallback será chamada a cada pulso.</p>
<p>A terceira rotina do código acima é <strong>aojStartGameLoop()</strong>, que verifica se temos um callback e um canvas especificados e em caso positivo, utiliza o método setInterval (padrão do Javascript) para agendar a execução do método aojPulse a cada X milisegundos.</p>
<p>X, neste caso, equivale a 1000 dividido pela taxa de FPS informada, resultado no tempo de duração de cada pulso. Por exemplo, se informamos 20 FPS, X será 1000/20 = 50 milisegundos. Ou seja, ocorrerá um pulso a cada 50 milisegundos para manter a taxa de 20 por segundo.</p>
<p>Note que não é a nossa rotina de callback que é passada para o setInterval, mas sim outra rotina, interna ao motor, chamada <strong>aojPulse()</strong>. De dentro de aojPulse é que é chamada nossa callback.</p>
<p>Isso é feito assim porque o motor tem algumas ações a serem feitas a cada pulso, além de chamar nossa rotina própria. Estas ações consistem em calcular a taxa real de frames por segundo e mostrar essa informação na tela.</p>
<p>A contagem de pulsos é feita da seguinte maneira (conforme podemos ver no código de aojPulse):</p>
<ol>
<li>A cada pulso incrementamos um contador (_aojPulsesCount);</li>
<li>A cada pulso obtemos o tempo atual e verificamos sua diferença para o tempo armazenado anteriormente (_aojLastMilisecond). Se a diferença é maior que 1000, ou seja, se 1 segundo se passou, então:
<ol>
<li>Armazenamos o tempo atual em _aojLastMilisecond;</li>
<li>Armazenamos a quantidade de pulsos contada pelo contador na variável _aojPulsesInLastSecond;</li>
<li>Zeramos nosso contador, reiniciando a contagem para o próximo segundo.</li>
</ol>
</li>
</ol>
<p>Veja que após fazer isso, a rotina aojPulse chama a callback (que vai executar a lógica do jogo) e depois mostra o valor de _aojPulsesInLastSecond na tela com aojDrawText.</p>
<h2>Usando o game loop</h2>
<p>Para usar este game loop, criamos uma página HTML e inserimos os dois scripts que temos até agora:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;aoj/aojcanvas.js&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;aoj/aojgame.js&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>E dentro da tag &lt;body&gt; declaramos a tag &lt;canvas&gt; com o ID que desejarmos (no exemplo abaixo usei &#8220;canvas&#8221; mesmo).</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;canvas</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;canvas1&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;960&quot;</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;600&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/canvas<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Se tiver dúvidas sobre isso, reveja a primeira parte do tutorial.</p>
<p>Na página HTML declaramos também uma seção de script para a lógica específica do nosso jogo. Veja o exemplo abaixo (que está disponível dentro do ZIP no final do post).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">        <span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
            <span style="color: #003366; font-weight: bold;">var</span> carro <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;">0</span><span style="color: #339933;">,</span>
                dx<span style="color: #339933;">:</span> <span style="color: #CC0000;">30</span><span style="color: #339933;">,</span>
                dy<span style="color: #339933;">:</span> <span style="color: #CC0000;">30</span><span style="color: #339933;">,</span>
                sprite<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #003366; font-weight: bold;">function</span> pulse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                update<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                render<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #003366; font-weight: bold;">function</span> update<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                carro.<span style="color: #660066;">x</span> <span style="color: #339933;">+=</span> carro.<span style="color: #660066;">dx</span><span style="color: #339933;">;</span>
                carro.<span style="color: #660066;">y</span> <span style="color: #339933;">+=</span> carro.<span style="color: #660066;">dy</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">x</span> <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> carro.<span style="color: #660066;">x</span> <span style="color: #339933;">&gt;</span> aojCanvas<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">width</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    carro.<span style="color: #660066;">dx</span> <span style="color: #339933;">*=</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;">if</span> <span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">y</span> <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> carro.<span style="color: #660066;">y</span> <span style="color: #339933;">&gt;</span> aojCanvas<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">height</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    carro.<span style="color: #660066;">dy</span> <span style="color: #339933;">*=</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>
&nbsp;
            <span style="color: #003366; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                aojFillRect<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> aojCanvas<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">width</span><span style="color: #339933;">,</span> aojCanvas<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">height</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'gray'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                aojDrawImage<span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">sprite</span><span style="color: #339933;">,</span> carro.<span style="color: #660066;">x</span><span style="color: #339933;">,</span> carro.<span style="color: #660066;">y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> carregaImagem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                carro.<span style="color: #660066;">sprite</span> <span style="color: #339933;">=</span> aojNewImage<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'img/simple-travel-car.png'</span><span style="color: #339933;">,</span> imagemCarregada<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #003366; font-weight: bold;">function</span> imagemCarregada<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                aojFPS<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                aojSetPulseCallback<span style="color: #009900;">&#40;</span>pulse<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                aojSetCanvas<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'canvas1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                aojStartGameLoop<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;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Vamos analisar este código. Inicia com a declaração de um objeto chamado carro, que contém variáveis utilizadas para manter a posição e a direção de movimento de um sprite na tela.</p>
<p>Em seguida vem uma rotina chamada pulse(). Esta é nossa rotina de callback, que será chamada pelo motor. Dentro dela chamamos duas outras, update() e render(), que utilizamos para separar a lógica da parte de desenho na tela.</p>
<p>Dentro de update temos o código clássico para mover o objeto, fazendo ele rebater nas extremidades da tela. Cada coordenada do carro (x e y) são incrementadas com seu incremento correspondente (dx e dy). Quando atingem o limite da tela, dx (ou dy) tem o sinal invertido e o movimento naquela direção se inverte. Assim temos o efeito de rebater no canto da tela.</p>
<p>Dentro de render() limpamos a tela com aojFillRect() e desenhamos o sprite com aojDrawImage(). O sprite é desenhado na posição (x, y) armazenada no objeto carro.</p>
<p>O próximo código do script é a definição de uma função para ser chamada no evento onload da janela. Nela utilizamos aojNewImage() para carregar a imagem do carro. Lembre-se que esta rotina recebe uma outra como callback, que será chamada quando a imagem for completamente carregada. Nossa rotina de callback para esse caso é <strong>imagemCarregada()</strong> (a última do script).</p>
<p>Dentro de imagemCarregada() temos o código de inicialização, que consiste em informar o FPS desejado, a callback do pulso, o canvas a ser utilizado e finalmente dar o start no game loop.</p>
<p>Importante notar como essa inicialização não é feita no onload da janela, mas sim após a imagem carregar. Sempre precisamos primeiro carregar as imagens (e outros recursos) do jogo antes de colocar ele para rodar. Isso evita que o game loop começe, eventualmente chamando render() que tentaria desenhar o sprite que ainda não teria sido carregado.</p>
<p><a href="http://www.abrindoojogo.com.br/files/tutorial-html5/02/index2.html" target="_blank">Veja esse exemplo em execução aqui</a>.</p>
<h2>Entrada com teclado e mouse</h2>
<p>Passamos para a parte de input. Os navegadores expõem alguns eventos em Javascript para obtermos acesso ao teclado e mouse (em breve teremos para controles de jogo também). Estes eventos são:</p>
<ul>
<li>document.onkeydown, chamado sempre que uma tecla é pressionada. Neste evento vamos armazenar o código da tecla pressionada em uma variável;</li>
<li>document.onkeyup, chamado quando uma tecla é solta. Neste evento limparemos a variável que tinha o código desta tecla.</li>
<li>document.onmousedown, quando o botão esquerdo do mouse é pressionado. Neste evento armazenaremos essa informação em uma variável;</li>
<li>document.onmouseup, quando o botão do mouse é solto. Neste evento limparemos a variável acima;</li>
<li>document.onmousemove, ocorre quanto o mouse se move. Neste evento vamos atualizar duas variáveis que armazenarão a posição X e Y do mouse.</li>
</ul>
<p>Veja que quando ocorrem os eventos acima, não executamos nenhuma lógica de jogo. Ao invés disso, armazenamos as mudanças de estado das teclas em variáveis. Estas variáveis serão depois acessadas em nosso update, para saber o estado de determinadas teclas.</p>
<p>Para armazenar o estado das teclas (solta ou pressionada), ao invés de um monte de variáveis soltas teremos um array com 6 posições. Armazenaremos as setas, um botão de ação e o botão do mouse.</p>
<p>Para saber em qual posição do array está cada informação, definimos algumas variáveis da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> AOJ_KEY_UP <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> AOJ_KEY_DOWN <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> AOJ_KEY_LEFT <span style="color: #339933;">=</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> AOJ_KEY_RIGHT <span style="color: #339933;">=</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> AOJ_KEY_ACTION <span style="color: #339933;">=</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> AOJ_MOUSE <span style="color: #339933;">=</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> _aojKeys <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>A posição do mouse é armazenada em um objeto chamado _aojMousePos que contém as propriedades x e y.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> _aojMousePos <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;">0</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Para facilitar o uso, criamos rotinas para retornar o estado das teclas e posição do mouse. São elas:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> aojIsPressed<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> _aojKeys<span style="color: #009900;">&#91;</span>key<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;">function</span> aojIsReleased<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: #339933;">!</span>_aojKeys<span style="color: #009900;">&#91;</span>key<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;">function</span> aojMouseX<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;">return</span> _aojMousePos.<span style="color: #660066;">x</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> aojMouseY<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;">return</span> _aojMousePos.<span style="color: #660066;">y</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Estas rotinas apenas retornam o valor armazenado no array. Quem modifica este valor são as rotinas dos eventos listados acima. Sua implementação completa é simples e pode ser vista no arquivo aojinput.js que está no ZIP no final do post.</p>
<h2>Utilizando o input</h2>
<p>No ZIP temos também uma página HTML que utiliza o teclado para controlar o sprite do carro. O código da página é igual ao do exemplo acima, com diferença apenas no objeto do carro e na rotina update(). Ah, e claro, ele inclui o script que contem as rotinas de input:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;aoj/aojinput.js&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>O objeto carro possui algumas propriedades a mais, para armazenar a rotação (direção em que o carro se moverá) e a velocidade de movimento.</p>
<p>A rotina update(), ao invés de mover o sprite rebatendo pela tela, agora utiliza a leitura da entrada para determinar para onde mover o carro.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> update<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>aojIsPressed<span style="color: #009900;">&#40;</span>AOJ_KEY_UP<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> aojIsPressed<span style="color: #009900;">&#40;</span>AOJ_MOUSE<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// se tecla para cima pressionada, aumenta a velocidade do carro</span>
        carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">+=</span> <span style="color: #CC0000;">0.5</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// limita a velocidade em 10</span>
            carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>aojIsPressed<span style="color: #009900;">&#40;</span>AOJ_KEY_DOWN<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// se tecla para baixo pressionada, diminui a velocidade do carro</span>
        carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">-=</span> <span style="color: #CC0000;">0.5</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">&lt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// limita em -5 - com velocidade negativa o carro vai dar marcha ré</span>
            carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">5</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: #006600; font-style: italic;">// se nem acima nem abaixo estão pressionadas, diminui um pouco a velocidade.</span>
        carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">-=</span> <span style="color: #CC0000;">0.1</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
            carro.<span style="color: #660066;">speed</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>aojIsPressed<span style="color: #009900;">&#40;</span>AOJ_KEY_LEFT<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// Se pressionada para esquerda, muda a rotação de acordo</span>
        carro.<span style="color: #660066;">rotation</span> <span style="color: #339933;">-=</span> Math.<span style="color: #660066;">abs</span><span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">speed</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">rotation</span> <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
            <span style="color: #006600; font-style: italic;">// Se o angulo diminuir de zero, recomeça em uma volta inteira (2 * PI radianos)</span>
            carro.<span style="color: #660066;">rotation</span> <span style="color: #339933;">=</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>aojIsPressed<span style="color: #009900;">&#40;</span>AOJ_KEY_RIGHT<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        carro.<span style="color: #660066;">rotation</span> <span style="color: #339933;">+=</span> Math.<span style="color: #660066;">abs</span><span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">speed</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">rotation</span> <span style="color: #339933;">&gt;</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span>
            carro.<span style="color: #660066;">rotation</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: #006600; font-style: italic;">// calcula a nova posição aplicando rotação ao ponto</span>
    carro.<span style="color: #660066;">x</span> <span style="color: #339933;">+=</span> Math.<span style="color: #660066;">cos</span><span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">rotation</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> carro.<span style="color: #660066;">speed</span><span style="color: #339933;">;</span>
    carro.<span style="color: #660066;">y</span> <span style="color: #339933;">+=</span> Math.<span style="color: #660066;">sin</span><span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">rotation</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> carro.<span style="color: #660066;">speed</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O código é padrão para movimento de veículos, com velocidade e rotação. Se você tiver dificuldades para entender, dê uma olhada nos nosso posts sobre <a href="http://abrindoojogo.com.br/a-matematica-nos-games-rotacao-de-ponto" target="_blank">rotação</a> e <a href="http://abrindoojogo.com.br/a-matematica-nos-games-velocidade-e-aceleracao" target="_blank">aceleração</a>.</p>
<h2>Conclusão</h2>
<p>Neste artigo vimos um motor de pulso muito básico feito em Javascript. Atenção para o fato de não termos um loop de fato, mas sim um agendamento utilizado o recurso de timer do navegador (setInterval). Um loop real (for, while), infinito como teria que ser, não é aceito pelo navegador. Sempre que encontra um loop destes, que tem o potencial de trancar o processamento da página, o navegador aborta o script. É uma questão de segurança, para impedir o uso deste recurso por páginas maliciosas.</p>
<p>No entanto o setInterval não é a melhor forma de fazer isso. Usei-o aqui por ser mais simples, porém ele apresenta um problema em máquina mais lentas (ou jogos mais pesados). Entenda porque: o setInterval agenda chamadas regulares à rotina aojPulse(), a cada X milisegundos. Até aí tudo bem, é isso que querermos para que nosso jogo pulse a cada X milisegundos.</p>
<p>Mas o que ocorre se a máquina for lenta a ponto da rotina aojPulse demorar mais de X milisegundos para executar? Uma nova chamada será feita a ela e por alguns milisegundos teremos duas aojPulse rodando &#8211; o que vai deixar a coisa ainda mais lenta. Com isso, dalí a X milisegundos, outra vez será chamada a rotina e isso vai acabar causando um acúmulo de rotinas em paralelo que vão degenerar totalmente o desempenho do jogo. Sem falar que as cópias da rotina rodando em paralelo estarão acessando as mesmas variáveis globais, e isso certamente vai causar todo tipo de comportamento estranho na lógica do jogo.</p>
<p>Na próxima parte veremos como fazer isso de uma forma diferente. Veremos também como melhorar a aparência do movimento mostrado na tela. Faremos isso deixando o render() independente do update() e utilizando interpolação das posições. Isso nos permitirá roda a lógica do jogo a taxa baixas enquanto a atualização da animação roda no máximo que a máquina permitir.</p>
<p>Até lá.</p>
<ul>
<li><a href="http://www.abrindoojogo.com.br/files/tutorial-html5/02/index2.html" target="_blank">Visualizar o exemplo do game loop</a></li>
<li><a href="http://www.abrindoojogo.com.br/files/tutorial-html5/02/index.html" target="_blank">Visualziar o exemplo de input</a></li>
<li><a href="http://abrindoojogo.com.br/files/tutorial-html5/02/AoJ-tutorial-HTML5-02.zip" target="_blank">Baixar o código fonte do exemplo</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/tutorial-html-5-parte-23/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Repensando o loop &#8211; Parte 3</title>
		<link>http://abrindoojogo.com.br/repensando-o-loop-parte-3</link>
		<comments>http://abrindoojogo.com.br/repensando-o-loop-parte-3#comments</comments>
		<pubDate>Mon, 06 Feb 2012 10:00:08 +0000</pubDate>
		<dc:creator>Marcelo Martins</dc:creator>
				<category><![CDATA[Som]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3812</guid>
		<description><![CDATA[Caros leitores, Na terceira e última parte artigo “Repensando o Loop”, compartilho algumas soluções para tornar a produção musical do seu jogo mais interessante, sem aumentar significativamente o custo/tempo de projeto. Existem muitas outras soluções disponíveis. Tudo depende do objetivo que você quer atingir e da experiência da sua equipe de áudio. Para ser relevante [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-3904" href="http://abrindoojogo.com.br/repensando-o-loop-parte-3/clavedesol"><img class="alignleft size-full wp-image-3904" src="http://abrindoojogo.com.br/wp-content/uploads/2012/02/clavedesol.jpg" alt="" width="206" height="206" /></a>Caros leitores,</p>
<p>Na terceira e última parte artigo “Repensando o Loop”, compartilho algumas soluções para tornar a produção musical do seu jogo mais interessante, sem aumentar significativamente o custo/tempo de projeto.</p>
<p>Existem muitas outras soluções disponíveis. Tudo depende do objetivo que você quer atingir e da experiência  da sua equipe de áudio. Para ser relevante na indústria de jogos, é necessário encarar desafios e tentar resolvê-los da melhor maneira possível.</p>
<p>Use as dicas abaixo e seja criativo! Se possível, compartilhe aqui no Abrindo o Jogo o resultado dos seus trabalhos!</p>
<p>Boa leitura!</p>
<p><span id="more-3812"></span></p>
<p>Caso não tenha lido a Parte 1, clique <a href="http://abrindoojogo.com.br/repensando-o-loop-parte-1">aqui</a>.<br />
Caso não tenha lido a Parte 2, clique <a href="http://abrindoojogo.com.br/repensando-o-loop-%E2%80%93-parte-2#more-3626">aqui</a>.</p>
<h2>Repensando o loop &#8211; Parte 3</h2>
<p>Para criar músicas em loop que possam ser reutilizadas minimizando a possibilidade de fadiga auditiva, primeiro é necessário avaliar essa necessidade. Tente descobrir quanto tempo em média os jogadores passam durante cada sessão, fase ou segmento do seu jogo. Neste artigo, vamos chamar esse tempo de Tempo de Jogo. Dada a natureza não-linear dos jogos, é impossível saber com precisão essa duração, mas é necessário ter uma ideia baseada no planejamento e, principalmente, analisando os resultados de testes com diversos perfis de jogadores.</p>
<p>Para que a música não se repita, a duração dela precisa ser maior ou igual ao Tempo de Jogo. Esse cenário é o ideal, já que teoricamente o jogador só ouviria música original. Na prática, esse cenário é muito difícil de ser atingido com baixo orçamento. Se a duração da música é igual a 50% do Tempo de Jogo, ela vai se repetir duas vezes, o que é tolerável e não incomoda a maioria dos jogadores. Porém, se a música começar a se repetir de 3 a 5 vezes, é necessário ficar atento. O limite de repetição já está sendo alcançado e a trilha pode afastar o jogador. Se a música se repetir mais de 5 vezes durante o Tempo de Jogo, é extremamente recomendável repensar a produção musical.</p>
<p>A tabela abaixo mostra cenários da relação entre o número de repetições do loop e o resultado sensorial na maioria dos jogadores.</p>
<div id="attachment_3899" class="wp-caption aligncenter" style="width: 519px"><a rel="attachment wp-att-3899" href="http://abrindoojogo.com.br/repensando-o-loop-parte-3/cenarios"><img class="size-full wp-image-3899 " src="http://abrindoojogo.com.br/wp-content/uploads/2012/02/cenários.png" alt="" width="509" height="161" /></a><p class="wp-caption-text">Cenários de implementação musical nos jogos.</p></div>
<p>Se a música do seu jogo se encontra no cenário D, a melhor solução é criar mais conteúdo musical e tentar se aproximar do cenário A.</p>
<p>Entretanto, se não for possível produzir mais conteúdo musical, por motivos de orçamento ou tempo disponível, existem algumas soluções alternativas. É importante ressaltar que até mesmo jogos AAA utilizam essas técnicas, como estratégia para minimizar o custo do projeto. Todas as soluções estão relacionadas ao conceito de arranjos dinâmicos (horizontais e verticais) e podem ser usados com ou sem um motor de áudio dedicado.</p>
<p>Seguem abaixo as soluções, bem como suas vantagens e desvantagens.</p>
<p><strong>Solução 1 &#8211; Inversão das partes da música</strong></p>
<p><strong>Descrição:</strong> Músicas são divididas em partes diferentes que se sucedem ao longo do tempo. Na estrutura de uma música popular, é comum chamar as partes de A, B, ponte e refrão. Essa estrutura existe em todos os gêneros musicais. Com algumas adaptações, é possível alterar a ordem as partes da música, tornando a nova versão levemente diferente. Quanto mais partes a música tiver, maior a possibilidade de combinações.</p>
<p><strong>Vantagens:</strong> A música não começa exatamente da mesma maneira durante o Tempo de Jogo. Isso mitiga a sensação de repetição no momento em que o jogador começa a ouvir a música. É especialmente útil quando a mesma música é usada em diferentes fases.</p>
<p><strong>Desvantagens:</strong> Uma vez que a música completa o ciclo do loop, o jogador percebe que o artefato é o mesmo utilizado anteriormente. Dependendo do nível de experiência do ouvinte, ele pode perceber até mesmo a alteração da ordem das partes antes mesmo que o ciclo se complete.</p>
<p><strong>Sugestão de implementação:</strong> O compositor precisa exportar diferentes versões da música, com a ordem das partes invertida. Se o jogo possuir algum motor de áudio dinâmico, é possível tentar exportar cada parte separadamente e depois montá-las em tempo real usando o motor do jogo.</p>
<p><strong>Solução 2 &#8211; Exclusão da melodia</strong></p>
<p><strong>Descrição:</strong> A melodia é o elemento mais memorável da música. Se você pensar em qualquer música neste momento, é possível que você se lembre justamente dela. Melodias são poderosos artefatos sonoros que, se usados de forma adequada, podem tornar o seu jogo ainda mais memorável. Porém, quando ela se repete em demasia, pode repelir o ouvinte.</p>
<p><strong>Vantagens:</strong> Ao excluir a melodia, é possível aumentar a vida útil da trilha, sem prejudicar a imersão do jogador.</p>
<p><strong>Desvantagens:</strong> Se a melodia for excluída com frequência, a música pode perder o seu impacto e deixar de ser memorável.</p>
<p><strong>Sugestão de implementação:</strong> Peça ao seu compositor para exportar duas versões da música, uma com melodia e outra sem. Depois, reproduza-as alternadamente, tomando cuidado para não repetir muitas vezes a música com melodia. Você também pode emudecer as faixas que reproduzem a melodia, caso o motor do seu jogo tenha essa capacidade.</p>
<p>Essa técnica é usada no Skyview Temple, o primeiro &#8220;calabouço&#8221; do jogo Zelda: Skyward Sword. Quando Link está na sala principal, uma versão com melodia do tema é reproduzida. Ao entrar em salas menores, uma versão sem melodia se torna o pano de fundo sonoro.</p>
<p><strong>Solução 3 &#8211; Implementação do silêncio</strong></p>
<p><strong>Descrição:</strong> Uma solução semelhante à 2, mas um pouco mais radical. Ao repetir a música um determinado número de vezes, é possível simplesmente desligá-la caso o número de repetições se aproxime do cenário D, descrito anteriormente.</p>
<p><strong>Vantagens:</strong> Como não há música, o jogador não corre o risco de ficar entediado.</p>
<p><strong>Desvantagens:</strong> Se o jogo ficar em silêncio por muito tempo, reintroduzir a música de forma repentina pode resultar em um efeito de repulsa semelhante ao da repetição prolongada.</p>
<p><strong>Sugestão de implementação:</strong> Faça com que o seu jogo reproduza a música no máximo 3 vezes (se aproximando do cenário C). Após a terceira repetição, deixe a música desparecer sutilmente. Deixe o jogo em silêncio por um tempo e repita a operação. Também é possível deixar o jogo em silêncio até o término da fase/segmento do jogo.</p>
<p>Essa solução foi utilizada em Halo. Quando o jogador passava muito tempo em uma fase, a música simplemente desaparecia.</p>
<p><strong>Solução 4 &#8211; Lista randômica</strong></p>
<p><strong>Descrição:</strong> Esta solução propõe a utilização de diferentes músicas reproduzidas de forma aleatória, como um reprodutor de música com a opção &#8220;shuffle&#8221; ativada.</p>
<p><strong>Vantagens:</strong> O jogador tem maior diversidade de conteúdo musical disponível durante o Tempo de Jogo. Além disso, a música pode ser criada sob medida para combinar com a temática do projeto. O resultado é uma melhor imersão, comparada à substituição da trilha do jogo pela lista de reprodução do jogador.</p>
<p><strong>Desvantagens:</strong> Por mais diversa que seja a produção musical, em algum momento ela vai se esgotar.</p>
<p><strong>Sugestão de implementação:</strong> Reproduza as músicas em sequência aleatória, tomando cuidado para não reproduzir o mesmo arquivo duas vezes seguidas. Isso também pode ser feito através de alguns middlewares de áudio.</p>
<p><strong>Solução 5 &#8211; Final expansível</strong></p>
<p><strong>Descrição:</strong> Trata-se de um loop curto que pode ser agregado ao final de música e repetido ad infinitum. A música completa pode ser reintroduzida após algum tempo de repetição do final expansível.</p>
<p><strong>Vantagem:</strong> Tem um efeito semelhante ao da solução 3, mas um pouco mais sutil. Ao criar um final em loop, é possível descansar o ouvido do ouvinte e prepará-lo para a próxima repetição.</p>
<p><strong>Desvantagens:</strong> O final expansível, se usado durante muito tempo, pode se tornar inoportuno, da mesma forma qualquer outro loop musical.</p>
<p><strong>Sugestão de implementação:</strong> Peça ao seu compositor para criar um loop de curta duração (30 segundos é mais que suficiente), utilizando o mesmo BPM e elementos percussivos da música que ele vai se conectar. Esse arquivo deve ser flexível o suficiente para se conectar com o começo da música em questão ou de outras músicas presentes no seu jogo.</p>
<p>Para tornar a sua produção musical mais interessante e com baixo custo, tente combinar essas soluções. Você pode criar uma lista randômica (solução 4) com músicas de final expansível (solução 5). Também é possível usar músicas com final expansível (solução 5), cujas repetições sucessivas não tem melodia (solução 2) e caem no silêncio (solução 3), voltando com partes invertidas (solução 1). Basicamente, qualquer combinação de solução pode ser feita e todas terão um resultado semelhante: a expansão da sua produção musical existente, sem aumento significativo de custo de produção.</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/repensando-o-loop-parte-3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PodAbrir 12 &#8211; 3D Character Design parte 1</title>
		<link>http://abrindoojogo.com.br/podabrir-12-3d-character-design-parte-1</link>
		<comments>http://abrindoojogo.com.br/podabrir-12-3d-character-design-parte-1#comments</comments>
		<pubDate>Thu, 02 Feb 2012 19:06:48 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[3D]]></category>
		<category><![CDATA[Game Art]]></category>
		<category><![CDATA[Game Arte]]></category>
		<category><![CDATA[Pod-Abrir]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3876</guid>
		<description><![CDATA[Olá gurizada, Iniciamos a temporada 2012 do nosso podcast sobre desenvolvimento de jogos. O primeiro episódio do ano traz mais uma entrevista bacana com um profissional da área de games. Nosso convidado de hoje é Alessandro Lima, escritor e Lead Character Designer na empresa Aquiris Game Experience. Mais um podcast dedicado aos artistas que acompanham [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/02/logo.png"><img class="alignleft size-full wp-image-3912" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2012/02/logo.png" alt="" width="142" height="177" /></a>Olá gurizada,</p>
<p>Iniciamos a temporada 2012 do nosso podcast sobre desenvolvimento de jogos. O primeiro episódio do ano traz mais uma entrevista bacana com um profissional da área de games. Nosso convidado de hoje é Alessandro Lima, escritor e Lead Character Designer na empresa Aquiris Game Experience.</p>
<p>Mais um podcast dedicado aos artistas que acompanham o AoJ. Porém, o papo é muito legal também para quem não é da área. Não deixe de conferir.</p>
<p><span id="more-3876"></span></p>
<p><strong>Participantes</strong></p>
<ul>
<li> Everton Vieira</li>
<li>Luiz Alessandro</li>
<li>Alessandro Lima</li>
<li><strong>Participação Especial</strong>:  <a href="http://www.alessandrolima.com/indexbr/imagens/foto02.jpg">Nero </a>- O Labrador de estimação do nosso entrevistado <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p><strong>Categoria:</strong></p>
<ul>
<li>Técnico &#8211; Game Art</li>
</ul>
<p><strong>Links comentados neste episódio</strong><strong>:</strong></p>
<ul>
<li>Referências
<ul>
<li><a href="http://www.alessandrolima.com/" target="_blank">Site Oficial</a></li>
<li><a href="http://www.youtube.com/watch?v=AZ-tZLawqKo&amp;feature=player_embedded">Entrevista para o progama Conexão Digital</a></li>
<li><a href="http://www.compumanager.com.br/" target="_blank">CompuManager</a></li>
<li><a href="http://www.southlogic.com/" target="_blank">South Logic</a></li>
<li><a href="http://www.ubisoft.com/" target="_blank">Ubisoft</a></li>
<li><a href="http://www.aquiris.com.br/" target="_blank">Aquiris</a></li>
</ul>
</li>
<li>Projetos:
<ul>
<li><a href="http://www.youtube.com/watch?v=aMpGtw6neaE">Flushed Away (Game Cube)</a></li>
</ul>
</li>
</ul>
<div>
<p><strong>Trilha Sonora</strong></p>
<ul>
<li>Crazy Train &#8211; <a href="http://www.ozzy.com" target="_blank">Ozzy Osbourne</a></li>
</ul>
<p><strong>PodCast</strong></p>
<ul>
<li>Siga o nosso podcast em <a href="../feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>.</li>
<li>Para o Itunes, acesse a <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en" target="_blank">store aqui</a>.</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-12-3d-character-design-parte-1/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/3876/0/PodAbrir12.mp3" length="55244606" type="audio/mpeg" />
		<itunes:duration>0:00:01</itunes:duration>
		<itunes:subtitle>Olá gurizada,
Iniciamos a temporada 2012 do nosso podcast sobre desenvolvimento de jogos. O primeiro episódio do ano traz mais uma entrevista bacana com um profissional da área de games. Nosso convidado de hoje é Alessandro Lima, escritor e Lead Cha[...]</itunes:subtitle>
		<itunes:summary>Olá gurizada,
Iniciamos a temporada 2012 do nosso podcast sobre desenvolvimento de jogos. O primeiro episódio do ano traz mais uma entrevista bacana com um profissional da área de games. Nosso convidado de hoje é Alessandro Lima, escritor e Lead Character Designer na empresa Aquiris Game Experience.
Mais um podcast dedicado aos artistas que acompanham o AoJ. Porém, o papo é muito legal também para quem não é da área. Não deixe de conferir.

Participantes

 Everton Vieira
Luiz Alessandro
Alessandro Lima
Participação Especial:  Nero - O Labrador de estimação do nosso entrevistado  

Categoria:

Técnico &#8211; Game Art

Links comentados neste episódio:

Referências

Site Oficial
Entrevista para o progama Conexão Digital
CompuManager
South Logic
Ubisoft
Aquiris


Projetos:

Flushed Away (Game Cube)




Trilha Sonora

Crazy Train &#8211; Ozzy Osbourne

PodCast

Siga o nosso podcast em http://abrindoojogo.com.br/feed/podcast.
Para o Itunes, acesse a store aqui.

</itunes:summary>
		<itunes:keywords>3D, Pod-Abrir</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
		<item>
		<title>Niklas Jansson´s Art Tutorial &#8211; Traduzido para Português</title>
		<link>http://abrindoojogo.com.br/niklas-jansson%c2%b4s-art-tutorial-traduzido-para-portugues</link>
		<comments>http://abrindoojogo.com.br/niklas-jansson%c2%b4s-art-tutorial-traduzido-para-portugues#comments</comments>
		<pubDate>Tue, 24 Jan 2012 11:34:19 +0000</pubDate>
		<dc:creator>dado.almeida</dc:creator>
				<category><![CDATA[Game Art]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3843</guid>
		<description><![CDATA[Olá pessoal, este é meu primeiro texto para o Abrindo o Jogo. Depois da entrevista que fiz o ano passado fui convidado para participar também do Site. Achei a proposta interessante, mas decidi pensar um pouco sobre como poderia contribuir de uma forma bacana, sem apelar para re-posts ou assuntos já manjados. Para facilitar a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a rel="attachment wp-att-3854" href="http://abrindoojogo.com.br/niklas-jansson%c2%b4s-art-tutorial-traduzido-para-portugues/abrindoojogo_ilust_tutoarne"><img class="size-full wp-image-3854 aligncenter" src="http://abrindoojogo.com.br/wp-content/uploads/2012/01/AbrindooJogo_Ilust_TutoArne.jpg" alt="" width="485" height="141" /></a></p>
<p>Olá pessoal, este é meu primeiro texto para o Abrindo o Jogo.</p>
<p>Depois da <a title="Parte 1 da Entrevista" href="http://abrindoojogo.com.br/podabrir-10-game-art-parte-1" target="_blank">entrevista que fiz o ano passado</a> fui convidado para participar também do Site.<br />
Achei a proposta interessante, mas decidi pensar um pouco sobre como poderia contribuir de uma forma bacana, sem apelar para re-posts ou assuntos já manjados.</p>
<p>Para facilitar a minha tarefa, vou focar os assuntos na área de <strong>Arte para games</strong>, mais precisamente a etapa de <strong>Arte Conceitual</strong>. Acho mais justo deixar o <em>3D</em> e o <em>Pixel-Art</em> para outros Colaboradores; que lidam com isso diariamente. Assim não corro o risco de escrever sobre algo que não experimentei de fato.</p>
<p>Sendo assim, deixa mostrar o que trouxe para vocês hoje&#8230;</p>
<p><span id="more-3843"></span></p>
<p><strong>A tradução do melhor Tutorial para Artistas Digitais!</strong></p>
<p>Já há algum tempo quis traduzir o famoso tutorial escrito por <strong>Arne Niklas Jansson</strong>. Provavelmente você não conhece nenhum dos dois (o sujeito e o artigo que ele escreveu), mas bastam alguns meses lendo os diversos Fóruns da Internet para saber como esse artigo é altamente recomendado a todos que querem melhorar o desenho e a pintura.</p>
<p>Niklas Jansson é um artista que já está há um bom tempo nesse ramo. Ficou bastante conhecido na área pelos <em>‘re-designs’</em> de jogos antigos: análises, descrições dos elementos dos jogos, idéias alternativas para jogabilidade e o mais fantástico (na minha opinião), sua excelente habilidade com Arte Conceitual.</p>
<p>Infelizmente o material publicado de Niklas não é muito &#8211; digamos &#8211; organizado. Os textos podem parecer confusos e há muita coisa perdida nas páginas de seu antigo site. Quem se interessar, pode visitar os links que cito no final do artigo e desvendar por si só todo esse vasto conteúdo. É uma tarefa para poucos, mas a recompensa é valiosa. Garanto.</p>
<p>O artigo <strong>‘The Art Tutorial’</strong> foi escrito originalmente em 2005. De lá pra cá muita coisa mudou no processo de criação de Arte Digital (softwares foram atualizados, técnicas foram inventadas), mas o conteúdo do texto permaneceu atual, por se tratar de conhecimento teórico e dicas realmente úteis&#8230;</p>
<p>Eu confesso que levei anos pra traduzir esse tutorial.</p>
<p>Na verdade, a tradução do texto foi feita em alguns dias, mas para entender e experimentar o que o autor explica foi necessário alguns bons anos e alguns insights, que aos poucos criavam conexões com o que Arne compartilha no artigo.</p>
<p>Para quem esta começando a desenhar agora, talvez o artigo não pareça tão legal assim. Mas se você já tem uma certa quilometragem com o Lápis e a Tablet, recomendo imprimir e guardar como referência. Volta e meia é bom ter o texto em mãos para relembrar algumas das dicas.</p>
<p>Após escrever para o autor (pedir a liberação para publicar, etc.) descobri que existia um outro texto, um pouco mais recente, com alguns pensamentos sobre Arte e Design. Achei válido gastar um tempo a mais e trazer, para a comodidade da nossa língua, algumas idéias dessa <em>Mente-Criativa</em>.</p>
<p>É isso aí!</p>
<p>Espero que gostem, <strong>experimentem</strong> e coloquem algumas das dicas em uso assim que possível.</p>
<p><strong>Aqui o <a href="http://dl.dropbox.com/u/107023/ABRINDOOJOGO/Arne_ArtTutorial_Portuguese.pdf" target="_blank">Link </a>para o artigo traduzido.</strong></p>
<p><em>Ah! Vamos usar os comentários aqui do Abrindo o Jogo para estender o assunto. Se houver dúvidas sobre os termos traduzidos, questões sobre os tópicos abordados, etc. Basta perguntar.</em></p>
<p>Outros Links relacionados:</p>
<ul>
<li><a href="http://www.itchstudios.com/psg/art_tut.htm" target="_blank">O artigo original, em Inglês</a></li>
<li><a href="http://www.itchstudios.com/psg/" target="_blank">Site ‘oficial’ do artista</a></li>
<li><a href="http://androidarts.com/" target="_blank">Blog com os projetos de re-design</a></li>
<li><a href="http://diglett.blogspot.com/" target="_blank">Outro blog, esse com conteúdo aleatório (mas lindas imagens)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/niklas-jansson%c2%b4s-art-tutorial-traduzido-para-portugues/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tutorial HTML 5 &#8211; Parte 1/3</title>
		<link>http://abrindoojogo.com.br/tutorial-html-5-parte-13</link>
		<comments>http://abrindoojogo.com.br/tutorial-html-5-parte-13#comments</comments>
		<pubDate>Wed, 11 Jan 2012 21:35:07 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3748</guid>
		<description><![CDATA[Prometido no ano passado, finalmente o tutorial de HTML 5 chegou! Neste tutorial em 3 partes veremos o básico sobre como usar o objeto &#60;canvas&#62; em conjunto com técnicas que permitem a criação de jogos de forma semelhante ao que já fazemos em outras linguagens. Nesta parte 1 aprenderemos como inicializar o canvas e carregar e [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/HTML5-logo.png"><img class="alignleft size-thumbnail wp-image-3349" title="HTML5-logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/HTML5-logo-150x150.png" alt="" width="150" height="150" /></a>Prometido no ano passado, finalmente o tutorial de HTML 5 chegou! Neste tutorial em 3 partes veremos o básico sobre como usar o objeto &lt;canvas&gt; em conjunto com técnicas que permitem a criação de jogos de forma semelhante ao que já fazemos em outras linguagens.</p>
<p>Nesta parte 1 aprenderemos como inicializar o canvas e carregar e exibir imagens.</p>
<p><span id="more-3748"></span>A primeira coisa que precisamos saber para criar jogos em HTML 5 é&#8230; bem, HTML! É necessário o conhecimento básico de tags e de como criar pelo menos uma página vazia para conter o jogo.</p>
<p>A segunda coisa é um pouco de CSS, que serve para configurar os elementos inseridos na página (bordas, cores, tamanhos, etc). Jogos mais avançados em HTML utilizam muitos elementos fora do &lt;canvas&gt;, que vamos ver nesse tutorial, tirando proveito de outros elementos HTML para apresentar dados e de CSS para formatar este dados.</p>
<p>Finalmente, precisamos saber também Javascript (JS) para fazer a programação da lógica do jogo. A sintaxe é parecida com Java ou C++ e oferece suporte a objetos, embora não seja de fato uma linguagem orientada a objetos. Não oferece, por exemplo, recurso para herança, embora seja possível simular isto com construções mais avançadas.</p>
<p>Vou assumir que você entende pelo menos o mínimo de HTML e CSS e que sabe incluir scripts em uma página. Mas a necessidade disto é tão pequena para este tutorial que é até possível você aprender o necessário só estudando os exemplos.</p>
<p>Dito isso, vamos em frente.</p>
<h2>O elemento &lt;canvas&gt;</h2>
<p>Uma das novidades que a versão 5 da HTML trouxe foi a tag &lt;canvas&gt;, que cria na página um elemento que permite o desenho direto. Antes disso, para exibir imagens era preciso inserir um elemento &lt;img&gt; para cada uma. Ess elemento cria um objeto gráfico no navegador para armazenar e apresentar a imagem &#8211; este tipo de objeto consome recursos do sistema. Se todas imagens fossem sprites animados, teríamos um página bem pesada para o navegador renderizar. Com o canvas, no entanto, podemos desenhar nele todas imagens necessárias e o navegador só vai renderizar o canvas &#8211; como se fosse uma única imagem.</p>
<p>Além disso, com o canvas podemos desenhar primitivas gráficas, como linhas, retângulos e texto, além de ter efeitos de composição na aplicação das imagens. A grosso modo, o canvas é como uma imagem cujo conteúdo pode ser modificado. Utilizamos ele como se fosse a tela, desenhando nele cada quadro do jogo.</p>
<p>A inclusão de um elemento canvas na página é feita com a tag &lt;canvas&gt;&gt;. No exemplo de código abaixo temos uma página HTML que contém esta tag e também um elemento &lt;div&gt; acima do canvas, dentro do qual vai uma informação textual.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;aoj/aojcanvas.js&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;info&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Abrindo o Jogo - exemplo de uso do elemento canvas<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Note que esta página inclui dois arquivos externos:</p>
<p><strong>css/estilos.css</strong>: Contém o código CSS de formatação dos elementos. Esse código se refere aos elementos pelo seu ID, sendo que o div possui o ID &#8220;info&#8221; e o canvas possui o ID &#8220;Canvas1&#8243;.</p>
<p>O conteúdo deste arquivo é o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">body <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">black</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#canvas1</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">absolute</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">50%</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">50%</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">margin-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-480px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">margin-top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-300px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">white</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#info</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">blue</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">yellow</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> Arial<span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">14px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Basicamente o código deste arquivo muda o fundo da página para preto, centraliza o canvas na tela e aplica estilo de fundo, cor e fonte ao div que apresenta o texto. É comum colocarmos os arquivos de estilo dentro de uma pasta &#8220;css&#8221;.</p>
<p><strong>aoj/aojcanvas.js</strong>: este arquivo de script possui o código para inicialização e uso do canvas, contendo algumas rotinas criadas para facilitar a programação. Veremos como usar o canvas a seguir.</p>
<h2>Usando o elemento canvas</h2>
<p>Para obter uma referência ao elemento canvas, usamos o comando document.getElementById(), passando o ID que especificamos para nosso canvas. Obtemos a referência e atribuímos para uma variável, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #003366; font-weight: bold;">var</span> _aojCanvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>canvasId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Para desenhar algo nele, precisamos obter um contexto gráfico, o que é feito com o método getContext do canvas. Esse método requer um parâmetro que, atualmente, só pode ser &#8220;2d&#8221;.</p>
<p>Depois de obter o contexto, atribuindo ele a uma variável, usamos os métodos dele para desenhar. Veja abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<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>
    <span style="color: #003366; font-weight: bold;">var</span> _aojCanvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'canvas1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> _aojCanvas.<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>
    ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// inicia um desenho.</span>
    ctx.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'blue'</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// especifica a cor de preenchimento.</span>
    ctx.<span style="color: #660066;">strokeStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'red'</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// especifica a cor de contorno.</span>
    ctx.<span style="color: #660066;">rect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">200</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// especifica um retângulo.</span>
    ctx.<span style="color: #660066;">rect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">220</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// especifica outro retângulo.</span>
    ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// contorna o desenho (dois retângulos).</span>
    ctx.<span style="color: #660066;">fill</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// preenche o desenho (dois retângulos).</span>
    ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// inicia outro desenho.</span>
    ctx.<span style="color: #660066;">strokeStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'black'</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// muda a cor de contorno.</span>
    ctx.<span style="color: #660066;">rect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// especifica um retângulo.</span>
    ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// contorna o desenho (um retângulo).</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O código acima desenha dois retângulos preenchidos de azul dentro do canvas. Cada desenho é iniciado com beginPath. Se este método não fosse chamado na segunda vez, o terceiro retângulo especificado ainda seria parte do primeiro desenho e o comando stroke iria contornar os três retângulos.</p>
<p>Perceba que o código foi colocado dentro de uma função atribuída ao evento onload da janela, para que seja executado apenas depois dela carregar completamente. Isso é importante porque se não for feito, o código executaria assim que fosse baixado &#8211; o que poderia ocorrer antes mesmo da declaração do canvas ter sido carregada &#8211; o que resultaria em erro porque o objeto canvas não existira ainda na página.</p>
<h2>Métodos de atalho</h2>
<p>A utilização do canvas para desenhar é algo de baixo nível. São precisos vários comandos para desenhar um retângulo na tela, por exemplo.</p>
<p>Para facilitar a programação, é interessante criar funções auxiliares que incluem todas chamadas necessárias para realizar determinadas ações. Assim criamos uma biblioteca própria. O arquivo aojcanvas.js é um exemplo de biblioteca deste tipo, embora incompleta.</p>
<p>Vejamos algumas funções deste arquivo para entender essa prática:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> aojSetCanvas<span style="color: #009900;">&#40;</span>canvasId<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    _aojCanvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>canvasId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> aojFillStyle<span style="color: #009900;">&#40;</span>optionalNewValue<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> _aojCanvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>optionalNewValue<span style="color: #009900;">&#41;</span>
        ctx.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> optionalNewValue<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> ctx.<span style="color: #660066;">fillStyle</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> aojFillRect<span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> w<span style="color: #339933;">,</span> h<span style="color: #339933;">,</span> optionalFillStyle<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> _aojCanvas.<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>
    ctx.<span style="color: #660066;">beginPath</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;">if</span> <span style="color: #009900;">&#40;</span>optionalFillStyle<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ctx.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> optionalFillStyle<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    ctx.<span style="color: #660066;">rect</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> w<span style="color: #339933;">,</span> h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">fill</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A função aojSetCanvas() é usada para informar à nossa biblioteca qual elemento canvas desejamos usar &#8211; podemos ter mais de um canvas na nossa página. Passamos o ID como parâmetro e o elemento é obtido é armazenado em uma variável global, acessível para todas as demais funções.</p>
<p>aojFillStyle() permite obter o estilo de preenchimento atual, e também modificá-lo. Se for passado um parâmetro, ele é usado para modificar o estilo, que em seguida é retornado. Se não for passado o parâmetro, o estilo atual não é modificado, apenas retornado.</p>
<p>E a função aojFillRect() serve para desenhar um retângulo preenchido. Ela pode usar o estilo previamente definido, mas também aceita um quarto parâmetro opcional que, se informado, é usado como estilo para o retângulo.</p>
<p>Este tipo de comando permite mudar nosso exemplo para o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<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>
    aojSetCanvas<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'canvas1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    aojFillRect<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">200</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'blue'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// preenche um retângulo azul.</span>
    aojFillRect<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">220</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'blue'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// preenche outro retângulo azul.</span>
    aojStrokeRect<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">200</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'red'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// contorna um retângulo vermelho.</span>
    aojStrokeRect<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">220</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'red'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// contorna outro retângulo vermelho.</span>
    aojStrokeRect<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'black'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// contorna um retângulo preto.</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Este exemplo ficaria ainda mais claro e resumido se criássemos uma função para desenhar um retângulo preenchido e já contornado. Até que ponto devemos ir na criação de nossa própria biblioteca de funções vai depender da natureza de cada projeto &#8211; aqueles procedimento que são repetidos muitas vezes são os que devem ser transformados em funções. Não recomendo tentar criar uma porção de funções de antemão porque você acabará com muitas que nunca vai utilizar, e mesmo assim não eliminará o risco de precisar de uma que não lembrou.</p>
<h2>Desenhando imagens no canvas</h2>
<p>É importante saber como desenhar primitivas gráficas no canvas, mas o principal recurso ainda é a apresentação de imagens, afinal, quase todo jogo é feito de sprites.</p>
<p>Para carregar uma imagem, basta criar um objeto do tipo Imagem e atribuir a URL do arquivo para o atributo &#8220;src&#8221;. Opcionalmente podemos atribuir uma função para o atributo onload &#8211; esta função será chamada quando o arquivo de imagem for carregado. Este é um recurso importante de usar em jogos com muitas imagens, para garantir que todas tenham sido carregadas antes de iniciar o jogo.</p>
<p>Novamente, para facilitar o trabalho, criamos uma função na nossa biblioteca:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> aojNewImage<span style="color: #009900;">&#40;</span>imgURL<span style="color: #339933;">,</span> optionalLoadCallback<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> imgURL<span style="color: #339933;">;</span>
    img.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> optionalLoadCallback<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> img<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esta função recebe a URL do arquivo da imagem e opcionalmente uma função de callback, que será chamada quando a imagem for carregada.</p>
<p>Para desenhar uma imagem no canvas, temos outra função:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> aojDrawImage<span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</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> ctx <span style="color: #339933;">=</span> _aojCanvas.<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>
    ctx.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> x <span style="color: #339933;">-</span> img.<span style="color: #660066;">width</span> <span style="color: #009966; font-style: italic;">/ 2, y - img.height /</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>_aojShowImageCenter<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<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;">2</span><span style="color: #339933;">*</span>Math.<span style="color: #660066;">PI</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>
        ctx.<span style="color: #660066;">fill</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></pre></div></div>

<p>Nesta função, apenas as duas primeiras linhas são responsáveis por desenhar a imagem no canvas. O IF é usado para desenhar um círculo no ponto (x,y) onde a imagem é desenhada, de forma a enxergarmos onde fica esse ponto. É útil para debugar posicionamento.</p>
<h2>Transformações geométricas</h2>
<p>O canvas oferece métodos para aplicar transformações geométricas no que é desenhado nele. Por exemplo, podemos rotacionar ou aumentar e diminuir uma imagem no momento de desenhá-la.</p>
<p>É importante saber, no entanto, que uma vez especificada uma transformação, ela fica em efeito para tudo que for desenhado depois. Portanto, depois de aplicar uma rotação, por exemplo, e desenhar a imagem desejada, é preciso aplicar a rotação inversa para deixar o canvas no estado normal antes de desenhar as próximas imagens.</p>
<p>Abaixo está uma função para desenhar uma imagem com transformação de escala. Como parâmetros ela recebe o objeto imagem, a posição (x, y) onde ele deve ser desenhado e os fatores de escala sx e sy.</p>
<p>Veja que para o efeito ser aplicado corretamente é preciso usar uma outra transformação em conjunto &#8211; a translação. Fazemos a translação para que a posição da imagem seja transferida para a origem (ponto (0,0)) e então a escala é aplicada. Depois de desenhada a imagem, desfazemos a escala e a translação aplicando estas transformações com o valor inverso.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> aojDrawImageScale<span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> sx<span style="color: #339933;">,</span> sy<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> _aojCanvas.<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>
    ctx.<span style="color: #660066;">translate</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">scale</span><span style="color: #009900;">&#40;</span>sx<span style="color: #339933;">,</span> sy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> <span style="color: #339933;">-</span>img.<span style="color: #660066;">width</span> <span style="color: #009966; font-style: italic;">/ 2, -img.height /</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">scale</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">/</span>sx<span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">/</span>sy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">translate</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>x<span style="color: #339933;">,</span> <span style="color: #339933;">-</span>y<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>_aojShowImageCenter<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<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;">2</span><span style="color: #339933;">*</span>Math.<span style="color: #660066;">PI</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>
        ctx.<span style="color: #660066;">fill</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></pre></div></div>

<p>No arquivo aojcanva.js existem outras funções deste tipo. Este arquivo e os demais estão no Zip no final da página.</p>
<h2>Conclusão</h2>
<p>Neste artigo vimos o basico da utilização do canvas para mostrar imagens.</p>
<p>No site abaixo há um guia de referência do canvas para ser impresso, com todos os comandos. O Autor (Jacob Seidelin) também escreveu um livro sobre jogos em HTML 5.<br />
<a href="http://blog.nihilogic.dk/2009/02/html5-canvas-cheat-sheet.html" target="_blank">http://blog.nihilogic.dk/2009/02/html5-canvas-cheat-sheet.html</a></p>
<p>No próximo artigo veremos como implementar um game loop e utilizar o teclado e mouse.</p>
<ul>
<li><a href="http://www.abrindoojogo.com.br/files/tutorial-html5/01/" target="_blank">Visualizar o exemplo funcionando</a></li>
<li><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/01/AoJ-tutorial-HTML5-01.zip">Baixar o código fonte do exemplo</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/tutorial-html-5-parte-13/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Repensando o Loop – Parte 2</title>
		<link>http://abrindoojogo.com.br/repensando-o-loop-%e2%80%93-parte-2</link>
		<comments>http://abrindoojogo.com.br/repensando-o-loop-%e2%80%93-parte-2#comments</comments>
		<pubDate>Fri, 06 Jan 2012 10:00:36 +0000</pubDate>
		<dc:creator>Marcelo Martins</dc:creator>
				<category><![CDATA[Som]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3626</guid>
		<description><![CDATA[Caros leitores, Chegamos à segunda parte do artigo &#8220;Repensando o Loop&#8221;. Neste texto, convido-os a refletir sobre um grande desafio da produção moderna de jogos: a intolerância à repetição. Na terceira e última parte, que será publicada em 02/2012, vamos falar sobre possíveis soluções de baixo custo para este desafio. Caso não tenha lido a [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-3678" href="http://abrindoojogo.com.br/repensando-o-loop-%e2%80%93-parte-2/repensando-o-loop"><img class="alignleft size-full wp-image-3678" src="http://abrindoojogo.com.br/wp-content/uploads/2012/01/Repensando-o-Loop.gif" alt="" width="169" height="173" /></a>Caros leitores,</p>
<p>Chegamos à segunda parte do artigo &#8220;Repensando o Loop&#8221;.</p>
<p>Neste texto, convido-os a refletir sobre um grande desafio da produção moderna de jogos: a intolerância à repetição.</p>
<p>Na terceira e última parte, que será publicada em 02/2012, vamos falar sobre possíveis soluções de baixo custo para este desafio.</p>
<p>Caso não tenha lido a Parte 1, <a href="http://abrindoojogo.com.br/repensando-o-loop-parte-1">clique aqui</a>.</p>
<p>Boa leitura!</p>
<p><span id="more-3626"></span></p>
<h2>Repensando o loop &#8211; Parte 2</h2>
<p>A indústria de jogos vem evoluindo rapidamente desde a geração dos videogames de 8 e 16 bits. Em 2012, a competitividade nessa indústria tende a ser ainda maior, tornando o mercado cada vez mais segmentado. Os jogos terão de ser produzidos sob medida para atender a perfis diferentes, tornando ainda mais necessária a evolução das técnicas de produção para manter tais produtos mais atraentes, sem aumentar o tempo e custo do projeto.</p>
<p>Nesse contexto, a música nos jogos mantém sua função de promover a imersão do jogador. Porém, esse atingir objetivo também fica mais difícil quando se trata de música de curta duração, que se repete <em>ad infinitum, </em>como é o caso do loop. Essa técnica maravilhosa vai continuar sendo utilizada, mas devidamente adequada às novas exigências do mercado.</p>
<p>Existem diversos motivos que sustentam a revisão e adaptação dessa técnica e eles variam de acordo com o gênero do jogo, o público-alvo e o objetivo que se deseja atingir com o produto. Analisar todos os possíveis motivos não é o objetivo deste artigo, já que cada situação exige uma análise própria e nem sempre a solução pode ser aplicada em todos os contextos. Porém, existe uma característica que permeia quase todas as situações. Essa característica será explorada a seguir.</p>
<h3>A intolerância à repetição</h3>
<p>Alguns jogadores mais experientes desenvolveram sua audição e são capazes de identificar o ponto do loop, o momento em que o segmento musical se repete. O ouvido treinado não aceita a &#8220;mágica&#8221; da extensão, eliminando vantagem de se usar essa técnica. O efeito do loop, antes agradável na geração 8 e 16 bits, hoje tem efeito contrário. Em vez de promover a imersão do jogador, prejudica a experiência de jogo.</p>
<p>Mesmo os jogadores menos experientes são capazes de perceber a repetição. Talvez eles não tenham a audição tão apurada a ponto de perceber o exato momento do ponto do loop, mas sabem que a música está se repetindo. No fim, o resultado é semelhante: a música se torna incômoda e indesejável.</p>
<p>Além disso, a grande oferta de dispositivos de reprodução de música digital a um preço acessível mudou a maneira como se consome música. Os jogadores (e também consumidores de música) têm um arsenal gigantesco de conteúdo musical disponível nos seus bolsos. Muitos estão acostumados a ouvir horas de música diversificada durante o dia e isso os tornou mais exigentes. Quando se deparam com jogos com conteúdo musical que se repete e os irrita, a tendência é simplesmente ignorar a música que está tocando, desligando-a ou abaixando o volume.</p>
<p>Muitos jogos modernos também possuem a opção de substituir a música do jogo pela música armazenada no aparelho. Portanto, não há motivo aparente para um jogador continuar ouvindo música que se repete se ele pode facilmente substituir essa música pelo vasto conteúdo que ele possui.</p>
<p>É importante salientar que essas afirmações são feitas com base na observação do comportamento dos jogadores, assim como conversas informais com outras pessoas que trabalham nessa indústria. O objetivo deste artigo não é ser uma base científica para comprovação de fatos, mas um documento que analisa os desafios deste mercado e pode servir como orientação e inspiração para os profissionais que produzem jogos.</p>
<p>Como dito anteriormente, em nenhum momento este artigo procura anular a utilização do loop. Esta técnica ainda é crucial em praticamente todos os jogos e há muitos exemplos de produtos maravilhosos (alguns que são até referência na produção musical dessa indústria), que continuam usando os loops de maneira muito semelhante às gerações anteriores. O que se busca com essa análise é alertar os produtores de jogos sobre os desafios da criação de música para videogame e o impacto que a utilização do loop pode causar em algumas situações. No fim, a decisão artística de utilização ou não dos loops, bem como a forma de implementação é tomada de acordo com o produto, o público-alvo, o orçamento e o objetivo que se deseja atingir.</p>
<h3>A resposta da indústria</h3>
<p>Produtores de jogos conhecidos como &#8220;AAA&#8221; (jogos com alto valor de produção) já perceberam essa mudança de contexto e muitos atualizaram a abordagem da produção musical dos seus jogos. A solução, em alguns casos, é produzir mais música, tornando o conteúdo mais diversificado. Teoricamente, maior quantidade de música ajudaria a diminuir os efeitos indesejáveis da repetição contínua.</p>
<p>Porém, produzir mais música não é uma solução viável para todos nesta indústria. Existe uma grande quantidade de empresas independentes e de pequeno porte que precisa produzir jogos com baixo orçamento. Muitas vezes, o budget disponível não é necessário para satisfazer a demanda de música do jogador moderno. As empresas continuam &#8220;presas&#8221; às soluções de baixo custo do passado e continuam produzindo loops de curta duração que são reproduzidos durante a maior parte da experiência de jogo. Essa abordagem é econômica, mas nem sempre é eficaz.</p>
<p>Como produzir conteúdo musical atraente e com baixo custo é o assunto da terceira e última parte desse artigo.</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/repensando-o-loop-%e2%80%93-parte-2/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Retrospectiva AoJ 2011</title>
		<link>http://abrindoojogo.com.br/retrospectiva-aoj-2011</link>
		<comments>http://abrindoojogo.com.br/retrospectiva-aoj-2011#comments</comments>
		<pubDate>Thu, 29 Dec 2011 18:50:57 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[Notícias]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3713</guid>
		<description><![CDATA[Mais um ano termina e não tem como não olhar para trás para fazer uma revisão do que foi feito, do que deixamos registrado nestes meses que passaram. É sempre importante rever o trabalho já realizado, orgulhando-se dos acertos, mas aprendendo com os erros. Nesse ano, felizmente, rolou um monte de coisa boa aqui no [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/12/Untitled-1.png"><img class="alignleft size-thumbnail wp-image-3724" title="Untitled-1" src="http://abrindoojogo.com.br/wp-content/uploads/2011/12/Untitled-1-150x150.png" alt="" width="150" height="150" /></a>Mais um ano termina e não tem como não olhar para trás para fazer uma revisão do que foi feito, do que deixamos registrado nestes meses que passaram. É sempre importante rever o trabalho já realizado, orgulhando-se dos acertos, mas aprendendo com os erros.</p>
<p>Nesse ano, felizmente, rolou um monte de coisa boa aqui no blog!</p>
<p>Nesse post fazemos um resumão para relembrar os eventos importantes. Se você perdeu algum destes marcos, vale a pena acessar para não deixar passar!</p>
<div><span id="more-3713"></span></div>
<div>Bem, e aqui vamos nós por esta retrospectiva rápida, passando por alguns dos posts importantes que rolaram por aqui. Se você leu todos em primeira mão, obrigado por ser um leitor tão assíduo!</div>
<h2>Fevereiro</h2>
<div id="_mcePaste">Nosso ano começou tarde, mas começou bem, com o anúncio de um novo colaborador, <strong>Rafael Rodrigues</strong>, fazendo uma análise de Burger Island. Com foco em análise de projetos e mercado, Rafael trouxe sua experiência na área para esclarecer dúvidas sobre a abertura da sua própria empresa.</div>
<div>
<ul>
<li><a href="http://abrindoojogo.com.br/jogo-aberto-burger-island" target="_blank">Primeiro post do Rafael Rodrigues</a></li>
</ul>
</div>
<div><img class="alignright" src="http://abrindoojogo.com.br/wp-content/uploads/2011/02/logo1.png" alt="" width="137" height="82" />Com a entrada do Rafael começamos a explorar o lado empreendedor, com artigos focados no mercado e abertura de empresas. Esse assunto revelou-se, ao longo do ano, um sucesso enorme entre nossos leitores, mostrando que o brasileiro tem espírito empreendedor e interesse em posicionar-se corretamente no mercado.</div>
<div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/montando-uma-empresa-de-games-com-custo-%E2%80%9Cquase%E2%80%9D-zero" target="_blank">Primeiro post sobre empreendedorismo</a></li>
</ul>
</div>
</div>
<div>Também ficamos orgulhosos de divulgar o <strong>Lawn Mower Madness</strong>, jogo que começou como trabalho de aula de nossos alunos, terminando como sucesso para <a href="http://itunes.apple.com/us/app/lawn-mower-madness/id420670876?mt=8" target="_blank">iOS</a> e <a href="https://market.android.com/details?id=com.hvilela.LMM&amp;feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5odmlsZWxhLkxNTSJd" target="_blank">Android</a>.</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/lawn-mower-madness" target="_blank">Lawn Mower Madness</a></li>
</ul>
</div>
<h2>Abril</h2>
<div id="_mcePaste">Sai mais um artigo sobre <strong>padrões de projeto</strong>, campeões de audiência na categoria técnico. Ao longo do ano seriam 4 artigos neste assunto.</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/padroes-de-projeto-memento" target="_blank">Padrão Memento</a></li>
<li><a href="http://abrindoojogo.com.br/padroes-de-projeto-em-games-%E2%80%93-command" target="_blank">Padrão Command</a></li>
<li><a href="http://abrindoojogo.com.br/padroes-de-projeto-em-games-%E2%80%93-state" target="_blank">Padrão State</a></li>
<li><a href="http://abrindoojogo.com.br/padroes-de-projeto-em-games-builder" target="_blank">Padrão Builder</a></li>
</ul>
</div>
<h2>Julho</h2>
<div id="_mcePaste"><img class="alignright" src="http://abrindoojogo.com.br/wp-content/uploads/2011/07/logo21.jpg" alt="" width="81" height="102" />Edição número ZERO do <strong>podAbrir</strong>. Embora tenhamos apostado no conceito, ainda era uma experiência. Será que o pessoal iria aprovar? Bem, terminamos o ano com episódios quinzenais que contam com mais de <strong>15.000</strong> acessos! É, o pessoal gostou!</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/pod-abrir-a-tendencia-dos-jogos-sociais" target="_blank">Primeiro episódio do podAbrir</a></li>
</ul>
</div>
<h2>Agosto</h2>
<div id="_mcePaste"><img class="alignright" src="http://abrindoojogo.com.br/wp-content/uploads/2011/08/Ilustra%C3%A7%C3%A3o-Mario.jpg" alt="" width="122" height="142" />Surge o <strong>AoJCursos</strong>, área dedicada aos cursos pagos do Abrindo o Jogo. Com um sistema próprio e valores acessíveis, oferecemos os cogumelos do conhecimento para você crescer profissionalmente <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/cursos-de-jogos-agora-tem-lugar-certo" target="_blank">Inauguração do AojCursos</a></li>
</ul>
</div>
<div id="_mcePaste">Participação do <strong>Thiago Rosa</strong>, que além de dar uma entrevista sobre games para Android, contribuiu bastante respondendo aos comentários. Chamava nossa atenção para o Android, tanto que continuamos abordando o assunto em  novos artigos.</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/entrevista-games-para-android-com-thiago-rosa" target="_blank">Entrevista sobre Android com Thiago Rosa</a></li>
</ul>
</div>
<h2>Setembro</h2>
<div id="_mcePaste">Buscando estar à frente também no assunto mercado, começamos a explorar novas tendências, como <strong>crowdfunding</strong>, modalidade de financiamento que começava a ser descoberta pelos brasileiros.</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/crowd-funding-alternativa-de-financiamento" target="_blank">Crowdfunding</a></li>
</ul>
</div>
<h2>Outubro</h2>
<div id="_mcePaste"><img class="alignright" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/logo.jpg" alt="" width="155" height="151" />Mais um campeão de audiência na categoria técnico: os artigos sobre a <strong>matemática nos games</strong> mostrou como esse conhecimento é importante para o desenvolvedor &#8211; e, infelizmente, como é mal visto na escola <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/a-matematica-nos-games-rotacao-de-ponto" target="_blank">Rotação de ponto</a></li>
<li><a href="http://abrindoojogo.com.br/a-matematica-nos-games-velocidade-e-aceleracao" target="_blank">Velocidade e aceleração</a></li>
</ul>
</div>
<div>O podAbrir inicia um arco de episódios sobre as <strong>profissões ligadas ao desenvolvimento de jogos</strong>.</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/podabrir-07-o-programador-de-jogos" target="_blank">Primeiro episódio do podAbrir sobre profissões da área de games</a></li>
</ul>
</div>
<h2>Novembro</h2>
<p>Lançamento histórico do game <strong>Minecraft </strong>traz à tona mais uma modalidade de mercado, o <strong>alphafunding</strong>.</p>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/lancamento-do-minecraft-e-alphafunding" target="_blank">Lançamento do Minecraft e alphafunding</a></li>
</ul>
</div>
<div>Primeira entrevista com um convidado no podAbrir. A conversa com o designer de som <strong>Marcelo Martins</strong> foi tão legal que rendeu dois episódios &#8211; e o convite para ele se juntar à nossa equipe.</div>
<div id="_mcePaste">
<ul>
<li>Entrevista sobre sound designer com Marcelo Martins, <a href="http://abrindoojogo.com.br/podabrir-08-designer-de-som-parte-1" target="_blank">parte 1</a> e <a href="http://abrindoojogo.com.br/podabrir-09-designer-de-som-parte-2" target="_blank">parte 2</a></li>
</ul>
</div>
<div><img class="alignright" src="http://abrindoojogo.com.br/wp-content/uploads/2011/11/ImgPlayN1.png" alt="" width="120" height="120" />Entra em cena a <strong>PlayN</strong>, API para jogos do Google. Como não oderia deixar de ser, o Abrindo o Jogo traz em primeira mão um how-to sobre a tecnologia e mais tarde um curso no AoJCursos.</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/tutorial-de-configuracao-do-google-playn" target="_blank">How-to de configuração da Google PlayN</a></li>
</ul>
</div>
<div>Nosso colega de equipe <strong>Roger Machado</strong> fala sobre o <strong>SBGames</strong>, contribuindo com artigos sobre o evento, incluindo um bem polêmico sobre a palestra de <strong>Damian Isla</strong>.</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/sbgames-e-blenderpro-como-foi" target="_blank">Cobertura geral do SBGames e BlenderPro</a></li>
<li><a href="http://abrindoojogo.com.br/sbgames-2011-damian-isla-hey-indie-developers" target="_blank">Artigo sobre a palestra de Damian Isla</a></li>
</ul>
</div>
<h2>Dezembro</h2>
<div id="_mcePaste">O podAbrir entrevista o artista <strong>Dado Almeida</strong>, com tanto sucesso quando a entrevista anterior. Rende mais dois episódios! E os acessos vão subindo&#8230;</div>
<div id="_mcePaste">
<ul>
<li>Entrevista sobre game Art com Dado Almeida, <a href="http://abrindoojogo.com.br/podabrir-10-game-art-parte-1" target="_blank">parte 1</a> e <a href="http://abrindoojogo.com.br/podabrir-11-%E2%80%93-game-art-parte-2" target="_blank">parte 2</a></li>
</ul>
</div>
<div><strong>Marcelo Martins</strong> estréia como membro da equipe do blog, com a primeira parte de um artigo interessantíssimo sobre músicas em loop nos jogos.</div>
<div id="_mcePaste">
<ul>
<li><a href="http://abrindoojogo.com.br/repensando-o-loop-parte-1" target="_blank">Primeiro post do Marcelo Martins</a></li>
</ul>
</div>
<h2>Concluindo&#8230;</h2>
<p>Foi um ano legal! Mas esperamos fechar 2012 com muito mais &#8211; cada comentário, cada e-mail dos leitores nos motiva a seguir com o trabalho, trazendo sempre o melhor possível para a comunidade de desenvolvedores de games do Brasil.</p>
<p>Que no próximo ano todos alcancem o crescimento profissional e encontrem as oportunidades necessárias para entrar de vez neste mercado. Que ele nos dê muito trabalho (sabemos que dá), mas também a realização de sonhos e, porque não, muito dinheiro no bolso!</p>
<p style="text-align: center;"><img class="aligncenter" src="http://aojcursos.com.br/cursos/public/images/cogumelo.png" alt="" width="79" height="79" /></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/retrospectiva-aoj-2011/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Feliz Natal e um ótimo 2012</title>
		<link>http://abrindoojogo.com.br/feliz-natal-e-um-otimo-ano-novo</link>
		<comments>http://abrindoojogo.com.br/feliz-natal-e-um-otimo-ano-novo#comments</comments>
		<pubDate>Fri, 23 Dec 2011 22:14:21 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Notícias]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3706</guid>
		<description><![CDATA[Olá pessoal, Em nome de toda a equipe do Abrindo o Jogo, desejo a todos os leitores, e agora também ouvintes, um  Natal repleto de saúde e paz. Que 2012 seja um ótimo ano para a indústria nacional de games. Aproveito o post para informar que, tendo em vista o período de festividades, faremos um [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/12/natal2.jpg"><img class="alignleft size-full wp-image-3709" title="natal2" src="http://abrindoojogo.com.br/wp-content/uploads/2011/12/natal2.jpg" alt="" width="190" height="154" /></a>Olá pessoal,</p>
<p>Em nome de toda a equipe do Abrindo o Jogo, desejo a todos os leitores, e agora também ouvintes, um  Natal repleto de saúde e paz. Que 2012 seja um ótimo ano para a indústria nacional de games.</p>
<p>Aproveito o post para informar que, tendo em vista o período de festividades, faremos um pequeno recesso nas próximas duas semanas, voltando no dia 09/01 com várias novidades nos posts e podcasts.</p>
<p>O PodAbrir volta dia <strong><span style="color: #008000;">03/02</span></strong> seguindo o arco de entrevistas com profissionais da área. Anote ai na sua agenda para não perder <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Que o Papai Noel traga vários consoles e games de última geração, além de um mercado  promissor para todos nós <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/feliz-natal-e-um-otimo-ano-novo/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PodAbrir 11 – Game Art parte 2</title>
		<link>http://abrindoojogo.com.br/podabrir-11-%e2%80%93-game-art-parte-2</link>
		<comments>http://abrindoojogo.com.br/podabrir-11-%e2%80%93-game-art-parte-2#comments</comments>
		<pubDate>Thu, 15 Dec 2011 08:13:20 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Pod-Abrir]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3603</guid>
		<description><![CDATA[Olá gurizada, Neste que será o penúltimo episódio do ano, daremos continuidade na interessantíssima entrevista sobre Game Art com Dado Almeida. Obviamente, deixamos o melhor para o final. Nessa segunda parte, Dado fala sobre seus projetos atuais e as principais dicas e macetas para se tornar um bom Concept Artist. Não seja maluco de perder. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/12/logo.jpg"><img class="alignleft size-full wp-image-3532" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/12/logo.jpg" alt="" width="150" height="188" /></a>Olá gurizada,  Neste que será o penúltimo episódio do ano, daremos continuidade na interessantíssima entrevista sobre Game Art com Dado Almeida.</p>
<p>Obviamente, deixamos o melhor para o final. Nessa segunda parte, Dado fala sobre seus projetos atuais e as principais dicas e macetas para se tornar um bom Concept Artist. Não seja maluco de perder.</p>
<p><span id="more-3603"></span></p>
<div><strong>Participantes:</strong> Everton Vieira , Alessandro Nörnberg e Dado Almeida</div>
<div><strong>Categoria:</strong> Técnico &#8211; Game Art</div>
<p><br/><br />
<br/><br />
<strong>Links comentados na seção de recados e e-mails:</strong></p>
<div>
<ul>
<li><a href="http://cidadegamer.com.br/" target="_blank">Cidade Gamer</a></li>
<li><a href="http://trine-thegame.com/site/" target="_blank">Game Trine</a></li>
</ul>
<p><strong>Links comentados neste episódio</strong><strong>:</strong></p>
</div>
<ul>
<li>Site do Dado Almeida
<ul>
<li><a href="http://www.dadoalmeida.com/" target="_blank">http://www.dadoalmeida.com</a></li>
</ul>
</li>
<li>Blog de Desenvolvedor do game e da nova UBI Art Framework:
<ul>
<li><a href="http://ubi-art.uk.ubi.com/" target="_blank">http://ubi-art.uk.ubi.com/</a></li>
</ul>
</li>
<li>Link para o Talk of Fight feito pela Aquiris:
<ul>
<li><a href="http://apps.facebook.com/talkorfight/" target="_blank">http://apps.facebook.com/talkorfight/</a></li>
</ul>
</li>
<li>Link para o jogo Fim da Picada:
<ul>
<li><a href="http://apps.facebook.com/fimdapicada/" target="_blank">http://apps.facebook.com/fimdapicada/</a></li>
</ul>
</li>
<li>Comunidades sobre Game Art:
<ul>
<li><a href="http://www.polycount.com/" target="_blank">http://www.polycount.com</a></li>
<li><a href="http://www.gameartisans.org/forums/index.php" target="_blank">http://www.gameartisans.org/forums/index.php</a></li>
<li><a href="http://www.cghub.com/" target="_blank">http://www.cghub.com</a></li>
</ul>
</li>
<li>Site do Concept Artist Paul Richards
<ul>
<li><a href="http://www.autodestruct.com/" target="_blank">http://www.autodestruct.com/</a></li>
</ul>
</li>
</ul>
<div>
<p><strong>Trilha Sonora</strong></p>
<ul>
<li>I, the Jury &#8211; <a href="http://www.grandmagus.com" target="_blank">Grand Magus</a></li>
</ul>
<p><strong>PodCast</strong> Siga o nosso podcast em <a href="../feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>. Para o Itunes, basta copiar e colar este endereço em “Advanced – Subscribe to podcast…&#8221; ou acesse direto na store por <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en">aqui</a>.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-11-%e2%80%93-game-art-parte-2/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/3603/0/podAbrir11.mp3" length="53033332" type="audio/mpeg" />
		<itunes:duration>0:55:15</itunes:duration>
		<itunes:subtitle>Olá gurizada,  Neste que será o penúltimo episódio do ano, daremos continuidade na interessantíssima entrevista sobre Game Art com Dado Almeida.
Obviamente, deixamos o melhor para o final. Nessa segunda parte, Dado fala sobre seus projetos atuais e [...]</itunes:subtitle>
		<itunes:summary>Olá gurizada,  Neste que será o penúltimo episódio do ano, daremos continuidade na interessantíssima entrevista sobre Game Art com Dado Almeida.
Obviamente, deixamos o melhor para o final. Nessa segunda parte, Dado fala sobre seus projetos atuais e as principais dicas e macetas para se tornar um bom Concept Artist. Não seja maluco de perder.

Participantes: Everton Vieira , Alessandro Nörnberg e Dado Almeida
Categoria: Técnico &#8211; Game Art


Links comentados na seção de recados e e-mails:


Cidade Gamer
Game Trine

Links comentados neste episódio:


Site do Dado Almeida

http://www.dadoalmeida.com


Blog de Desenvolvedor do game e da nova UBI Art Framework:

http://ubi-art.uk.ubi.com/


Link para o Talk of Fight feito pela Aquiris:

http://apps.facebook.com/talkorfight/


Link para o jogo Fim da Picada:

http://apps.facebook.com/fimdapicada/


Comunidades sobre Game Art:

http://www.polycount.com
http://www.gameartisans.org/forums/index.php
http://www.cghub.com


Site do Concept Artist Paul Richards

http://www.autodestruct.com/




Trilha Sonora

I, the Jury &#8211; Grand Magus

PodCast Siga o nosso podcast em http://abrindoojogo.com.br/feed/podcast. Para o Itunes, basta copiar e colar este endereço em “Advanced – Subscribe to podcast…&#8221; ou acesse direto na store por aqui.
</itunes:summary>
		<itunes:keywords>Pod-Abrir</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
	</channel>
</rss>

