<?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 &#187; Tutorial</title>
	<atom:link href="http://abrindoojogo.com.br/category/tecnico/tutorial/feed" rel="self" type="application/rss+xml" />
	<link>http://abrindoojogo.com.br</link>
	<description></description>
	<lastBuildDate>Thu, 17 May 2012 17:40:33 +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>Leitor no Controle &#8211; Side Scrolling com Game Maker</title>
		<link>http://abrindoojogo.com.br/leitor-no-controle-side-scrolling-com-game-maker</link>
		<comments>http://abrindoojogo.com.br/leitor-no-controle-side-scrolling-com-game-maker#comments</comments>
		<pubDate>Wed, 28 Mar 2012 15:00:43 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4235</guid>
		<description><![CDATA[Olá pessoal, Graças ao leitor Otávio Ortiz, temos o primeiro Leitor no Controle de 2012. Expert no assunto, Otávio traz dicas de como montar um game side scrolling utilizando o engine Game Maker, que aliás recentemente ganhou uma nova versão compatível com HTML5. Reforço que os demais leitores podem &#8211; e devem, seguir o exemplo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-3498" title="colaboradores_internautas" src="http://abrindoojogo.com.br/wp-content/uploads/2011/11/colaboradores_internautas.png" alt="" width="150" height="175" />Olá pessoal,</p>
<p>Graças ao leitor Otávio Ortiz, temos o primeiro <strong>Leitor no Controle</strong> de 2012. Expert no assunto, Otávio traz dicas de como montar um game <em>side scrolling</em> utilizando o engine Game Maker, que aliás recentemente ganhou uma nova versão compatível com HTML5.</p>
<p>Reforço que os demais leitores podem &#8211; e devem, seguir o exemplo do Otávio enviando o seu artigo ou tutorial para contato@abrindoojogo.com.br</p>
<p><span id="more-4235"></span></p>
<h3>Como fazer o efeito side scrolling no game maker</h3>
<div id="_mcePaste">Neste tutorial vou mostrar como adicionar o efeito <em>side scrolling</em> no game maker. O primeiro passo é criar um personagem, se você tiver dificuldade com isso, consulte este outro <a href="http://abrindoojogo.com.br/tutorial-game-maker-ola-mundo-interativo">post</a>.</div>
<div></div>
<div id="_mcePaste">Bom, começamos criando uma <em>room </em>comum. Para a tela deslizar, precisamos ter uma room maior do que o campo de visão total então nas configurações, clique na aba <em>setings </em>vá até a área <em>width </em>e coloque 2000.</div>
<div><img class="aligncenter size-full wp-image-4238" title="tela2" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/tela2.gif" alt="" width="525" height="344" /></div>
<div id="_mcePaste">Se você executar o game agora, ele mostrará toda a área da <em>room </em>de uma vez só, então precisamos de uma view que mostrará somente a área que precisamos. Clique na aba <em>views</em>, agora marque a caixa <em>enable the use of views</em>. Desta maneira você está habilitando o uso de áreas visíveis da room. Em seguida marque a caixa <em>visible when room starts</em> para que o game já inicie com uma view ativa. As configurações x,y,w e h são para posicionar o retângulo visível.</div>
<div><img class="aligncenter size-full wp-image-4239" title="tela3" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/tela3.gif" alt="" width="516" height="301" /></div>
<div id="_mcePaste">Agora só falta fazer seguir o objeto. Para isso clique no botão de <em>object following. S</em>urgirá uma lista de seus objetos, selecione o seu personagem ou o objeto que você quer que a câmera siga. As configurações Hbor e Vbor servem para marcar a distancia horizontal e vertical que a câmera deve manter do objeto. As configurações Hsp e Vsp são a velocidade horizontal e vertical da câmera enquanto segue o objeto.</div>
<div><img class="aligncenter size-full wp-image-4240" title="tela4" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/tela4.gif" alt="" width="490" height="422" /></div>
<div id="_mcePaste">E é isso, agora é só executar e ver a câmera seguindo o seu objeto,  este efeito é conhecido com <em>side scrolling</em>. Espero ter ajudado, um abraço a todos e qualquer sugestão utilize os comentários. Para dúvidas sobre esta técnica ou qualquer outra, utilizem o <a href="http://forum.abrindoojogo.com.br/">fórum  do AoJ</a>, lá tem um área só sobre Game Maker a qual sou moderador. Até <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
<p><a href="mailto:otavioortiz@gmail.com">Otávio Ortiz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/leitor-no-controle-side-scrolling-com-game-maker/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial HTML 5 &#8211; Parte 3/3</title>
		<link>http://abrindoojogo.com.br/tutorial-html-5-parte-33</link>
		<comments>http://abrindoojogo.com.br/tutorial-html-5-parte-33#comments</comments>
		<pubDate>Tue, 13 Mar 2012 12:16:48 +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=3979</guid>
		<description><![CDATA[Esta é a terceira e última parte deste tutorial básico sobre jogos em HTML5. Nela veremos como melhorar a aparência das animações utilizando interpolação das posições. Veremos como separar a lógica do jogo da renderização, fazendo a lógica rodar a uma taxa fixa (e baixa) e atualizando a tela o mais rápido possível. Embora esta [...]]]></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>Esta é a terceira e última parte deste tutorial básico sobre jogos em HTML5. Nela veremos como melhorar a aparência das animações utilizando interpolação das posições.</p>
<p>Veremos como separar a lógica do jogo da renderização, fazendo a lógica rodar a uma taxa fixa (e baixa) e atualizando a tela o mais rápido possível. Embora esta seja uma técnica genérica, útil em qualquer tecnologia, é especialmente aplicável em jogos HTML onde o ideal é atualizar a lógica do jogo mais lentamente.</p>
<p><span id="more-3979"></span>Continuaremos com o exemplo da <a href="http://abrindoojogo.com.br/tutorial-html-5-parte-23" target="_blank">parte anterior</a>, sendo que os arquivos aojcanvas.js e aojinput.js permanecem inalterados. Nossa maior modificação não será no motor em sí, mas na própria página do jogo, onde temos a divisão do pulso em update() e render().</p>
<p>No entanto o motor recebe uma pequena modificação. Iniciaremos por ela.</p>
<h2>Substituindo setInterval por setTimeout</h2>
<p>Na conclusão da parte anterior, comentei sobre um problema que pode afetar o jogo caso a lógica demore muito para executar. No caso, o problema ocorre se a lógica levar mais tempo para executar do que o esperado para cada pulso.</p>
<p>Imagine que o pulso está agendado (com setInterval) para ser chamado a cada 50 milisegundos, mas por algum motivo nossa lógica leva 60 milisegundos. Ela ainda vai estar executando quando for disparado um novo pulso, iniciando novo processamento da lógica do jogo. Isso gera duas execuções em paralelo, diminuindo ainda mais a performance, piorando o prolema.</p>
<p>Para resolver isso, trocamos o uso de setInterval por setTimeout. A diferença entre elas é a seguinte:</p>
<ul>
<li>setInterval agenda chamadas contínuas para a rotina informada. Ou seja, fica chamando a rotina automaticamente a cada X milisegundos.</li>
<li>setTimeout agenda apenas um execução da rotina. Ou seja, chama a rotina daqui a x milisegundos e só. Para executar a rotina novamente, precisamos agendar com um novo setTimeout.</li>
</ul>
<p>A mudança que faremos, então, consiste em trocar a chamada de setInterval presente em aojStartGameLoop(), como também adicionar uma chama semelhante dentro de aojPulse. Veja abaixo.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><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: #006600; font-style: italic;">// mesmo código de antes</span>
       setTimeout<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'aojPulse()'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// trocamos setInterval por setTimeout</span>
       <span style="color: #006600; font-style: italic;">// isso vai chamar aojPulse apenas uma vez, então dentro dela precisamos de outros setTimeout</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: #006600; font-style: italic;">// mesmo código de antes</span>
        setTimeout<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'aojPulse()'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// adicionamos uma chamada a setTimeout - a cada pulso agendamos outro</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bem, se você tiver prestado atenção, percebeu que o código acima não é exatamente equivalente ao que tínhamos antes. Estamos passando zero milisegundos para o setTimeout, o que faz com que a próxima execução seja agenda para imediatamente &#8211; ou, na prática, para tão logo seja possível. Ou seja, não respeitamos mais o limite de FPS informado, rodando, ao invés disso, na velocidade máxima possível.</p>
<p>Se colocarmos esse game loop nos exemplos anteriores, sem modificá-los, teremos a ação deles acelerada, porque neles a lógica roda a cada pulso, sem nenhum filtro. Mas a modificação que faremos nos exemplos dará conta disso.</p>
<h2>Separando update() e render()</h2>
<p>Vamos lembrar como era a relação entre nosso pulso e as rotinas update() e render() no exemplo anterior.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><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>
    ... <span style="color: #006600; font-style: italic;">// lógica do jogo</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>
    ... <span style="color: #006600; font-style: italic;">// atualiza a imagem na tela</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Não poderia ser mais simples. A cada pulso executamos um update e um render. Vejamos agora o que muda. O código está abaixo e logo após a explicação.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> _lastMilisecond <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> _updatesCount <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> _updatesInLastSecond <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> _lastUpdateMilisecond <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> _frameCount <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> pulse<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> 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> _lastMilisecond <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #CC0000;">50</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        _lastMilisecond <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>
        update<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        _frameCount <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    _frameCount <span style="color: #339933;">++;</span>
    render<span style="color: #009900;">&#40;</span>_frameCount <span style="color: #009966; font-style: italic;">/ (_aojPulsesInLastSecond /</span> _updatesInLastSecond<span style="color: #009900;">&#41;</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>
    _updatesCount <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> _lastUpdateMilisecond <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        _lastUpdateMilisecond <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>
        _updatesInLastSecond <span style="color: #339933;">=</span> _updatesCount<span style="color: #339933;">;</span>
        _updatesCount <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;">// lógica do jogo</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Vamos analisar a rotina pulse() primeiro. Em linhas gerais, agora ela executa update() a cada x milisegundos e executa render() sempre, ou seja, a cada pulso. O filtro para update é feito com o seguinte algoritmo:</p>
<ol>
<li>A cada pulso é obtido o tempo atual;</li>
<li>Se a diferença entre o tempo atual e o tempo armazenado anteriormente (_lastMilisecond) for maior do que 50 milisegundos:
<ol>
<li>Armazenamos o tempo atual em _lastMilisecond;</li>
<li>Zeramos _frameCount (explicada abaixo);</li>
<li>Chamamos update();</li>
</ol>
</li>
</ol>
<p>O efeito disto é que update() é chamado a cada 50 milisegundos. Ignorei a rotina de informar o FPS desejado e utilizei o valor fixo 50, mas poderia ter feito algo configurável. Executando um update a cada 50 milisegundos terei 20 updates por segundo. Na realidade, teremos um pouco menos, porque a estes 50 milisegundos somamos o tempo de execução da própria rotina update().</p>
<p>O código colocado dentro da rotina update é comum e serve para contar quantas vezes por segundo ela é chamada. É o mesmo código que tínhamos dentro de aojPulse() no exemplo anterior.</p>
<p>A variável _frameCount serve para contar quantos frames (que nesse caso são iguais a pulsos) ocorrem entre duas chamadas de update. Por isso é zerada quando ocorre um update e a partir daí vai sendo incrementada a cada pulso.</p>
<p>Veja no gráfico abaixo como se comporta essa variável. Vamos assumir que a duração aqui seja 1 segundo, ou seja, temos 20 pulsos por segundo. As linhas vermelhas mostram os pulsos onde update é chamado (aqui temos apenas 4 updates por segundo, para simplificar).</p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/03/fig1.png"><img class="aligncenter size-full wp-image-4131" title="fig1" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/fig1.png" alt="" width="480" height="108" /></a></p>
<p>Já a chamada de render é feita sem nenhum controle, ou seja, é chamada em todos pulsos. E veja que ela recebe um valor como parâmetro. Vejamos o que ele significa.</p>
<p>Esse valor é calculado da seguinte forma: primeiro a quantidade de pulsos ocorridos no último segundo é dividida pela quantidade de updates no mesmo período. Na figura acima, que representa 1 segundo, ocorreram 20 pulsos e 4 updates. Então temos 20/4 = 5.</p>
<p>Esse número (5) é a quantidade de pulsos que ocorre entre dois updates &#8211; e vem a ser a quantidade de vezes que render() é chamada entre dois updates.</p>
<p>Para completar o valor do parâmetro de render, dividimos o valor de _frameCount pela quantidade de pulsos entre dois updates, de forma a obter um valor normalizado entre 0 e 1. Por exemplo, quando _frameCount é 1, teremos 1/5 = 0.2; quando _frameCount é 2, teremos 2/5 = 0.4; quando _frameCount for 5, teremos 5/5 = 1. Veja na figura abaixo.</p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/03/fig2.png"><img class="aligncenter size-full wp-image-4132" title="fig2" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/fig2.png" alt="" width="480" height="108" /></a></p>
<h2>Interpolação</h2>
<p>A interpolação consiste em obter valores intermediários entre dois valores conhecidos. Por exemplo, dados os valores 10 e 20, se fizermos a interpolação entre eles com três passos, teremos os valores (12.5, 15.0, 17.5). Se fizermos com 7 passos teremos (11.25, 12.5, 13.75, 15.0, 16.25, 17.5, 18.75).</p>
<p>Nosso objetivo aqui é interpolar as posições dos nossos sprites de forma a gerar posições intermediárias que não são calculadas pelo update. Por exemplo, digamos que no último update ocorrido nosso sprite tenha ficado na posição x=150 e no próximo update, ele vá para a posição x=180. Se nada for mudado em render, veremos nosso sprite saltar diretamente da posição 150 para a 180.</p>
<p>Lembre-se que entre estes dois updates tivemos (conforme a figura acima) 5 chamadas a render. Se não tivermos interpolação implementada, o que ocorre é que as cinco chamadas vão mostrar o sprite na posição 150, até que ocorre o próximo update e a posição muda para 180 &#8211; e os próximos cinco render mostrarão ele na posição 180, e assim por diante.</p>
<p>Com a interpolação, no entanto, calcularemos dentro de render posições intermediárias. Sabemos que são 5 render entre os updates. Assim, o primeiro render deverá mostrar o sprite a 1/5 (0.2) do caminho entre 150 e 180; o segundo update mostrará a 2/5 (0.4) do caminho; e o quinto mostrará a 5/5 (1.0) do caminho, ou seja, bem no 180.</p>
<p>Os valores 0.2, 0.4, etc, como vimos, são aqueles passados para render no parâmetro, que chamaremos de delta. Como usamos esse delta para afetar o x do sprite? Basta multiplicar o delta pela distância entre as duas posições (180 &#8211; 150 = 30) e somar na primeira posição (150).</p>
<p>Ou seja, a fórmula é essa: x = x1 + (x2 &#8211; x1) * delta, onde, no exemplo, x1=150, x2=180 e delta = 0.2, 0.4, 0.6, etc.</p>
<p>Os valores de x serão assim:</p>
<ol>
<li>Primeiro update<br />
x = 150 + (180-150) * 0.2;<br />
x = 150 + 30 * 0.2;<br />
x = 150 + 6;<br />
x = 156;</li>
<li>Segundo update<br />
x = 150 + 30 * 0.4;<br />
x = 150 + 12;<br />
x = 162;</li>
<li>Terceiro update<br />
x = 150 + 30 * 0,6;<br />
x = 150 + 18;<br />
x = 168;</li>
<li>Quarto update<br />
x = 150 + 30 * 0,8;<br />
x = 150 + 24;<br />
x = 174;</li>
<li>Quinto update<br />
x = 150 + 30 * 1,0;<br />
x = 150 + 30;<br />
x = 180;</li>
</ol>
<p>Veja como este recurso é poderoso: ele nos permitiu mostrar o sprite em 6 posições diferentes (150, 156, 162, 168, 174 e 180), embora a lógica do jogo tenha calculado apenas duas (150 e 180). Isso nos permite rodar o jogo a uma baixa taxa de updates, mas mostrar uma animação suave, tanto mais suave quantos forem os frames entre os updates.</p>
<p>Quanto melhor o desempenho do computador do jogador, mais vezes render vai ser chamada entre os updates e assim mais passos teremos em nossa interpolação, melhorando a animação.</p>
<p>Vejamos, então, como ficou o código da rotina render:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>delta<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>
     <span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> carro.<span style="color: #660066;">lastX</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">x</span> <span style="color: #339933;">-</span> carro.<span style="color: #660066;">lastX</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> delta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// x = x1 + (x2-x1) * delta</span>
     <span style="color: #003366; font-weight: bold;">var</span> y <span style="color: #339933;">=</span> carro.<span style="color: #660066;">lastY</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>carro.<span style="color: #660066;">y</span> <span style="color: #339933;">-</span> carro.<span style="color: #660066;">lastY</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> delta<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> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     aojFillRect<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">57</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>_updatesInLastSecond <span style="color: #339933;">+</span> <span style="color: #3366CC;">' tps'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">65</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></pre></div></div>

<p>Mas que atributos são esses: &#8220;lastX&#8221; e &#8220;lastY&#8221;? Bem, estes são atributos adicionados ao sprite para armazenar a posição anterior dele &#8211; afinal, agora precisamos de duas posições para fazer a interpolação. Sempre que update muda o valor de x, armazena o anterior em lastX. Veja abaixo o código completo de update:</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>
      _updatesCount <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> _lastUpdateMilisecond <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
           _lastUpdateMilisecond <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>
           _updatesInLastSecond <span style="color: #339933;">=</span> _updatesCount<span style="color: #339933;">;</span>
           _updatesCount <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      carro.<span style="color: #660066;">lastX</span> <span style="color: #339933;">=</span> carro.<span style="color: #660066;">x</span><span style="color: #339933;">;</span>
      carro.<span style="color: #660066;">lastY</span> <span style="color: #339933;">=</span> carro.<span style="color: #660066;">y</span><span style="color: #339933;">;</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;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> carro.<span style="color: #660066;">x</span> <span style="color: #339933;">&amp;</span>gt<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: #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;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> carro.<span style="color: #660066;">y</span> <span style="color: #339933;">&amp;</span>gt<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: #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></pre></div></div>

<p>Está implementada assim a interpolação da posição do sprite entre updates, criando um movimento mais suave e contínuo do que tínhamos no exemplo anterior.</p>
<h2>Conclusão</h2>
<p>Como dito no início deste post, a interpolação é uma técnica genérica, que pode ser utiliza em qualquer motor para melhorar a aparência do movimento dos sprites. Mas é especialmente bem vinda em jogos para navegadores, já que o desempenho do javascript ainda não é tão alto. Assim, é bom podermos rodar o jogo a uma taxa de atualização mais baixa, dando mais tempo para a lógica dentro de update ser executada, sem, no entanto, ter a animação prejudicada.</p>
<p>Uma coisa interessante de notar nessa técnica é que o que vemos na tela está sempre um passo atrás da lógica do jogo. Veja vem: quando o update coloca o sprite na posição 180, recém inicia a apresentação dele entre 150 e 180. Quando ele chegar no 180, já teremos outro update que colocará o sprite mais para frente, digamos x=210. Agora o render vai interpolar entre 180 e 210.</p>
<p>Isso não causa nenhum problema visível na maioria dos jogos, mas naqueles cuja ação é muito rápida (geralmente shooters), poderão ser percebidas discrepâncias com relação aos controles &#8211; afinal, o input está sendo processado pelo update, levando em conta a posição atual, enquanto o render vem atrás, interpolando a partir da posição anterior.</p>
<p>Nesses casos extremos não podemos usar a posição atual com relação à anterior. É preciso, de alguma forma, usar a posição atual com relação à próxima, que ainda não foi calculada! Para isso usamos a extrapolação ao invés da interpolação &#8211; basicamente é seguir o calculo da interpolação passando do valor de destino. Mas essa já é outra história. Fica como lição de casa&#8230;</p>
<ul>
<li><a href="http://www.abrindoojogo.com.br/files/tutorial-html5/03/index.html" target="_blank">Visualizar o exemplo do game loop</a></li>
<li><a href="http://www.abrindoojogo.com.br/files/tutorial-html5/03/index2.html" target="_blank">Visualizar o exemplo de input</a></li>
<li><a href="http://abrindoojogo.com.br/files/tutorial-html5/03/AoJ-tutorial-HTML5-03.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-33/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</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;">&amp;</span>gt<span style="color: #339933;">;</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><span style="color: #808080; font-style: italic;">&lt;!--mce:0--&gt;</span><span style="color: #009900;"><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><span style="color: #808080; font-style: italic;">&lt;!--mce:1--&gt;</span><span style="color: #009900;"><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;">&nbsp;</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 type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;!--</span>mce<span style="color: #339933;">:</span><span style="color: #CC0000;">2</span><span style="color: #339933;">--&gt;&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><span style="color: #808080; font-style: italic;">&lt;!--mce:3--&gt;</span><span style="color: #009900;"><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;">&amp;</span>gt<span style="color: #339933;">;</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;">&amp;</span>lt<span style="color: #339933;">;</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;">&amp;</span>lt<span style="color: #339933;">;</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;">&amp;</span>lt<span style="color: #339933;">;</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;">&amp;</span>gt<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: #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">Visualizar 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>1</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;html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head<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/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;/head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body<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>
        <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>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<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>5</slash:comments>
		</item>
		<item>
		<title>Tutorial Básico de Blender 3D &#8211; parte 1</title>
		<link>http://abrindoojogo.com.br/tutorial-basico-de-blender-3d-parte-1</link>
		<comments>http://abrindoojogo.com.br/tutorial-basico-de-blender-3d-parte-1#comments</comments>
		<pubDate>Fri, 10 Dec 2010 14:26:14 +0000</pubDate>
		<dc:creator>Roger Machado</dc:creator>
				<category><![CDATA[Game Arte]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=2078</guid>
		<description><![CDATA[E ai pessoal blz? Depois de dedicar os últimos meses totalmente para minha faculdade, estou de volta. Conforme prometido, inicio hoje o meu tutorial sobre o Blender. A ideia será postar vários vídeos tutoriais sobre como utilizar o software 3D em maior evidência no mercado atualmente. Neste primeiro vídeo, veremos como modelar um personagem básico [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2010/12/logo.png"><img class="alignleft size-full wp-image-2085" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2010/12/logo.png" alt="" width="154" height="154" /></a>E ai pessoal blz?</p>
<p>Depois de dedicar os últimos meses totalmente para minha faculdade, estou de volta.</p>
<p>Conforme prometido, inicio hoje o meu tutorial sobre o Blender. A ideia será postar vários vídeos tutoriais sobre como utilizar o software 3D em maior evidência no mercado atualmente.</p>
<p><span id="more-2078"></span></p>
<p style="text-align: left;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2010/11/separador.jpg"><img class="aligncenter size-full wp-image-1994" title="separador" src="http://abrindoojogo.com.br/wp-content/uploads/2010/11/separador.jpg" alt="" width="695" height="10" /></a>Neste primeiro vídeo, veremos como modelar um personagem básico em<em> low poly</em> (poucos polígonos). Agora já de férias <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> , em breve vou estar postando os outros capítulos.</p>
<p style="text-align: center;"><iframe style="background:#000000;" src="http://player.vimeo.com/video/17662089?title=1&amp;byline=1&amp;portrait=1&amp;color=00adef&amp;autoplay=0&amp;loop=0" width="500" height="390" frameborder="0"></iframe></p>
<p>Gostaram? Comentem as sugestões ou dúvidas <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  .</p>
<address>Publicado por: Roger Machado<br />
</address>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/tutorial-basico-de-blender-3d-parte-1/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Tutorial Pixel Art – Parte 1</title>
		<link>http://abrindoojogo.com.br/tutorial-pixel-art-parte-1</link>
		<comments>http://abrindoojogo.com.br/tutorial-pixel-art-parte-1#comments</comments>
		<pubDate>Sun, 07 Feb 2010 19:20:53 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Game Arte]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=1327</guid>
		<description><![CDATA[Olá pessoal, hoje o nosso artista de plantão estréia seu primeiro tutorial aqui no Abrindo o Jogo. Samuel descreve quais seriam os primeiros passos para quem deseja começar a produzir Pixel Art.  No módulo 1, você conhecerá as ferramentas e suas funções, além de uma das maneiras mais utilizadas de criar linhas para a Pixel [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2010/02/pixellogo.jpg"><img class="alignleft size-full wp-image-1333" title="pixelLogo" src="http://abrindoojogo.com.br/wp-content/uploads/2010/02/pixellogo.jpg" alt="" width="158" height="169" /></a>Olá pessoal, hoje o nosso artista de plantão estréia seu primeiro tutorial aqui no Abrindo o Jogo. Samuel descreve quais seriam os primeiros passos para quem deseja começar a produzir Pixel Art.  No módulo 1, você conhecerá as ferramentas e suas funções, além de uma das maneiras mais utilizadas de criar linhas para a Pixel Art.</p>
<p>Não deixem de conferir esta primeira parte, está muito legal.</p>
<p><a href="http://abrindoojogo.com.br/tutorial-pixel-arte-parte-1">Tutorial Pixel Art &#8211; Parte 1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/tutorial-pixel-art-parte-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial Game Maker: Olá Mundo &quot;Interativo&quot;</title>
		<link>http://abrindoojogo.com.br/tutorial-game-maker-ola-mundo-interativo</link>
		<comments>http://abrindoojogo.com.br/tutorial-game-maker-ola-mundo-interativo#comments</comments>
		<pubDate>Mon, 12 Oct 2009 19:19:15 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=886</guid>
		<description><![CDATA[Olá pessoal, é com grande prazer que contamos com a primeira participação de um leitor aqui no Abrindo o Jogo. O Luis Otávio nos enviou um tutorial base sobre o Game Maker. Muito interessante para quem quer iniciar no desenvolvimento de jogos de uma maneira fácil e intuitiva. Vamos conferir. Olá pessoal, meu nome é [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/gamemakerlogo.gif"><img class="alignleft size-full wp-image-910" title="GameMakerLogo" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/gamemakerlogo.gif" alt="GameMakerLogo" width="200" height="161" /></a>Olá pessoal, é com grande prazer que contamos com a primeira participação de um leitor aqui no Abrindo o Jogo. O Luis Otávio nos enviou um tutorial base sobre o Game Maker. Muito interessante para quem quer iniciar no desenvolvimento de jogos de uma maneira fácil e intuitiva. Vamos conferir.</p>
<p><span id="more-886"></span></p>
<p>Olá pessoal, meu nome é Luis Otávio e trago este artigo onde mostrarei como começar na programação de jogos usando o Game Maker. O Game Maker é um motor (Engine) desenvolvido para facilitar a criação de jogos de qualquer tipo. Com ele podemos fazer um Pac-Man ou até um Mega Man. Este motor também permite a criação de  jogos 3D simples, porém para criar jogos mais complexos, como Age of Empires, você precisará dominar a linguagem do motor,  denominada <strong>GML </strong>(Game Maker Language), não abordada neste meu primeiro tutorial por motivos didáticos.</p>
<p>Inicialmente vocês criarão jogos usando o sistema Drag and Drop (Arraste e Solte) que o Game Maker oferece.</p>
<p>Bom, para começar você precisa fazer o download do programa, ele pode ser baixado no endereço <a href="http://www.yoyogames.com">yoyogames.com</a>. A instalação é bem simples, utilize a versão gratuita, apesar de possuir algumas limitações, nos possibilitará fazer jogos bem interessantes. A tela inicial do programa é mostrada abaixo:</p>
<div id="attachment_888" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/a.png"><img class="size-full wp-image-888" title="Tela Inicial" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/a.png" alt="Tela Inicial do Game Maker" width="468" height="318" /></a><p class="wp-caption-text">Tela Inicial do Game Maker</p></div>
<p>Eu farei uma rápida introdução sobre a interface do programa, falando apenas sobre o necessário para  o entendimento básico do Game Maker.</p>
<ul>
<li><strong>Sprites</strong>
<ul>
<li>Nesta pasta você colocaráa as imagens dos personagens, itens e qualquer outra imagem que representara algo interativo no jogo.</li>
</ul>
</li>
<li><strong>Sounds</strong>
<ul>
<li>Aqui irá os sons e musicas do jogo.</li>
</ul>
</li>
<li><strong>Backgrounds</strong>
<ul>
<li>Nesta pasta você carregará os fundos de cenários e imagens que não são interativas no jogo, tais como logos, fundos de menus etc.</li>
</ul>
</li>
<li><strong>Fonts</strong>
<ul>
<li>Nesta pasta você poderá colocar as fontes (tipos de letras) que serão usadas em seu jogo.</li>
</ul>
</li>
<li><strong>Objects</strong>
<ul>
<li>Esta é sem duvidas uma das pastas mais importantes, é nela que fica tudo que for interativo no jogo é aqui que fica o funcionamento do jogo.</li>
</ul>
</li>
<li><strong>Rooms</strong>
<ul>
<li>Aqui é onde ficam as salas do jogo, isso pode ser entendido como o local onde ficam a fase, a tela de game over ou a tela de título.</li>
</ul>
</li>
</ul>
<p>Para adicionar algum dos itens listados acima,  você deve clicar com o botão direito sobre a pasta e selecionar <em>Create</em>. Vamos começar por <em>Create Sprite</em>.</p>
<div id="attachment_889" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/b.png"><img class="size-full wp-image-889" title="createSprite" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/b.png" alt="Create Sprite" width="468" height="319" /></a><p class="wp-caption-text">Create Sprite</p></div>
<p>Logo surgirá a tela <em>Sprite Properties</em> (Propriedades do Sprite) como mostra a figura abaixo.</p>
<div id="attachment_890" class="wp-caption aligncenter" style="width: 477px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/c.png"><img class="size-full wp-image-890" title="loadsprite" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/c.png" alt="Load Sprite" width="467" height="281" /></a><p class="wp-caption-text">Load Sprite</p></div>
<p>Por enquanto não entrarei em detalhes sobre as propriedades do sprite, isto será abordado em um outro artigo. Vamos apenas clicar em <em>Load Sprite</em>, abrirá então uma janela de seleção de arquivos, selecione uma imagem qualquer para representar um personagem do jogo. Após selecionada a imagem, clique em ok. Repita o processo para selecionar um sprite que represente um obstáculo em nosso jogo, pode ser um cubo ou qualquer imagem que você preferir. Se você fez tudo certinho, veremos uma tela como a demonstrada abaixo.</p>
<div id="attachment_891" class="wp-caption aligncenter" style="width: 477px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/d.png"><img class="size-full wp-image-891" title="createObject" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/d.png" alt="Create Object" width="467" height="282" /></a><p class="wp-caption-text">Create Object</p></div>
<p>Por enquanto estes sprites não são nada além de imagens, ou seja, eles ainda não representam nada dentro do jogo, são apenas imagens que serão enviadas para a memória assim que o jogo iniciar. Para dar vida a nosso personagem, devemos criar um novo <em>Object</em>, utilizando o mesmo procedimento anterior, um clique com o botão direito sobre a pasta Objects. Ao selecionar <em>Create Object</em>, a janela abaixo será apresentada.</p>
<div id="attachment_892" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/e.png"><img class="size-full wp-image-892" title="objectProperties" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/e.png" alt="Propriedades do Objeto" width="468" height="276" /></a><p class="wp-caption-text">Propriedades do Objeto</p></div>
<p>Na janela de propriedades do objeto, você pode perceber que existem vários botões e abas, mas não se assuste, não será necessários ver todos eles neste momento. Bom, seguindo com a criação do personagem, na janela de propriedades do objeto, clique no botão na parte superior esquerda, referente a <em>Sprite </em>(marcado com um círculo verde), em seguida, selecione o que corresponde ao personagem. Agora temos um objeto com aparência, porém sem ação alguma. Para inserir movimento em nosso personagem, devemos clicar no botão <em>Add Event</em>, destacado na imagem acima com um círculo vermelho. As opções de ações serão apresentadas em uma nova janela, demonstrada abaixo.</p>
<div id="attachment_893" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/f.png"><img class="size-full wp-image-893" title="seletorEventos" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/f.png" alt="Seletor de Eventos" width="468" height="293" /></a><p class="wp-caption-text">Seletor de Eventos</p></div>
<p>Novamente não se assuste com a quantidade de ações, vamos nos deter apenas na opção <em>Keyboard</em>. Com isto, estaremos adicionando um evento que verificará se uma respectiva tecla está sendo pressionada. Quando você clicar no botão keyboard surgirá uma lista de teclas que podem ser verificadas, como na imagem abaixo.</p>
<div id="attachment_894" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/g.png"><img class="size-full wp-image-894" title="listaTeclas" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/g.png" alt="Lista de Teclas" width="468" height="293" /></a><p class="wp-caption-text">Lista de Teclas</p></div>
<p>Selecione a opção <em>&lt;Left&gt;</em> (seta para a esquerda), desta forma, você adiciona um evento que ouvirá quando tecla for pressionada. Agora devemos vincular uma ação a este evento. Para isto, observe no canto superior direito da janela propriedades do objeto, na área que corresponde a movimento (<em>Move</em>), o primeiro botão (destacado em vermelho). Arraste-o para a parte em branco, correspondente a actions, marcada com um retângulo vermelho na figura abaixo.</p>
<div id="attachment_895" class="wp-caption aligncenter" style="width: 477px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/h.png"><img class="size-full wp-image-895" title="propriedadeObjeto" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/h.png" alt="Propriedades do Objeto" width="467" height="293" /></a><p class="wp-caption-text">Propriedades do Objeto</p></div>
<p>Assim que você soltar a ação selecionada, surgirá uma janela como a mostrada na imagem abaixo.</p>
<p style="text-align:center;">
<div id="attachment_897" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/i.png"><img class="size-full wp-image-897" title="movedFixed" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/i.png" alt="Moved Fixed" width="468" height="294" /></a><p class="wp-caption-text">Move Fixed</p></div>
<p>Esta janela correspondente a ação Move Fixed. Esta ação faz com que o objeto se mova na direção e velocidade definidas nos campos correspondentes.</p>
<p>A próxima etapa será criar uma sala para testar o nosso objeto. Clique na pasta <em>Rooms </em>com o botão direito e selecione <em>Create Room</em> para criar uma nova sala, acionando a janela <em>Room Properties</em>, como demonstrado na imagem abaixo.</p>
<div id="attachment_898" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/j1.png"><img class="size-full wp-image-898" title="createRoom" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/j1.png" alt="Create Room" width="468" height="393" /></a><p class="wp-caption-text">Create Room</p></div>
<p>Na janela propriedades da Room, você pode visualizar várias abas na parte superior esquerda, mas não entrarei em detalhes sobre todas,  apenas a Objects. Clique no botão destacado para selecionar o objeto atual que será adicionado a sala. O próximo passo será adicionar seu personagem no mapa, para isto clique com o mouse sobre o local desejado na grade. Pronto, agora é só testar!</p>
<p>Para publicar/compilar seu jogos, basta clicar no botão de play verde na parte superior da interface.</p>
<div id="attachment_899" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/l.png"><img class="size-full wp-image-899" title="publicar" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/l.png" alt="Publicar/Compilar seu jogo" width="468" height="52" /></a><p class="wp-caption-text">Publicar/Compilar seu jogo</p></div>
<p>Assim que seu pseudo jogo começar, você poderá teclar seta para a esquerda e perceber o personagem movendo-se. Caso ocorra algum problema, revise o artigo até esta etapa. Se tudo funcionar direitinho, é horas de exercitar um pouco, faça seu personagem se movimentar também para as direções Direita &lt;<em>Right</em>&gt;, Cima &lt;<em>Up</em>&gt; e Baixo &lt;<em>Down</em>&gt;.</p>
<p>Conseguiu? Então vamos adicionar agora algum obstáculo para o personagem, clique com o botão direito sobre a pasta <em>Objects </em>e crie um novo objeto, marque-o para usar o Sprite correspondente ao obstáculo. Desta vez , marque a opção Solid , isso fará com que o objeto seja sólido.</p>
<div id="attachment_901" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/m.png"><img class="size-full wp-image-901" title="propriedadeObjeto2" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/m.png" alt="Propriedades do Objeto Obstáculo" width="468" height="286" /></a><p class="wp-caption-text">Propriedades do Objeto Obstáculo</p></div>
<p>Apesar de estar marcado como sólido, o objeto ainda não representa um obstáculo para o personagem, isto ocorre porque não há ninguém detectando (ouvindo) a colisão. Sendo assim, precisamos adicionar um evento que verifica se objetos colidiram. Para isto, abra novamente seu personagem, adicione um novo evento clicando em <em>Add Event</em> e selecione <em>Collision</em>. Como demonstrado na imagem abaixo, surgirá uma lista com os objetos, marque o <em>object1</em>, referente ao obstáculo.</p>
<div id="attachment_902" class="wp-caption aligncenter" style="width: 477px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/n.png"><img class="size-full wp-image-902" title="collision" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/n.png" alt="Adicionando Colisão" width="467" height="289" /></a><p class="wp-caption-text">Adicionando Colisão</p></div>
<p>Após o evento de colisão ser adicionado, temos que vincular uma ação a ele. O processo será bem similar aos anteriores, porém ao invés de selecionar uma direção, você deve clicar no centro do direcional, além de configurar a velocidade para zero, observe na imagem abaixo.</p>
<div id="attachment_903" class="wp-caption aligncenter" style="width: 478px"><a href="http://abrindoojogo.com.br/wp-content/uploads/2009/10/o.png"><img class="size-full wp-image-903" title="collision2" src="http://abrindoojogo.com.br/wp-content/uploads/2009/10/o.png" alt="Colisão com o obstáculo" width="468" height="322" /></a><p class="wp-caption-text">Colisão com o obstáculo</p></div>
<p>Com isso você já tem um ambiente bem simples,  monte um pequeno cenário, com o personagem no centro e vários obstáculos para experimentar. Após a sala criada, é só clicar no play para ver o resultado.</p>
<p>Bom, por enquanto é só, tente fazer outras modificações em seu pseudo jogo e vá tentando entendê-lo aos poucos, não tente fazer coisas muito complicadas sem primeiro entender o simples. Se você pretende ser um desenvolvedor de jogos, precisará aprender que só se pode passar para coisas mais complexas quando as simples estiverem completamente dominadas, falando em linguagem de games, jogue primeiro no Easy para depois experimentar o Hard <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Um grande abraço a todos do Abrindo o Jogo.</p>
<p>Luis Otávio</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/tutorial-game-maker-ola-mundo-interativo/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

