<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Abrindo o Jogo</title>
	<atom:link href="http://abrindoojogo.com.br/feed" rel="self" type="application/rss+xml" />
	<link>http://abrindoojogo.com.br</link>
	<description></description>
	<lastBuildDate>Thu, 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>Incentivo do governo para desenvolver jogos &#8211; Lei Rouanet</title>
		<link>http://abrindoojogo.com.br/incentivo-do-governo-para-desenvolver-jogos-lei-rouanet</link>
		<comments>http://abrindoojogo.com.br/incentivo-do-governo-para-desenvolver-jogos-lei-rouanet#comments</comments>
		<pubDate>Thu, 17 May 2012 17:40:33 +0000</pubDate>
		<dc:creator>rafael.rodrigues</dc:creator>
				<category><![CDATA[Negócios]]></category>
		<category><![CDATA[governo]]></category>
		<category><![CDATA[incentivo]]></category>
		<category><![CDATA[jogos]]></category>
		<category><![CDATA[lei rouanet]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4440</guid>
		<description><![CDATA[Oi pessoal, a leitura da semana não é exatamente técnica sob o ponto de vista de programação, mas analisando a área administrativa e financeira do nosso nicho de mercado &#8211; desenvolvimento de jogos &#8211; podemos dizer que vamos falar tecnicamente sobre um ponto bem importante: Lei Rouanet. Atualmente, muito se corre atrás de investimento e [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-4446" title="leiRouanet" src="http://abrindoojogo.com.br/wp-content/uploads/2012/05/leiRouanet1.jpg" alt="" width="177" height="160" />Oi pessoal,</p>
<p>a leitura da semana não é exatamente técnica sob o ponto de vista de programação, mas analisando a área administrativa e financeira do nosso nicho de mercado &#8211; desenvolvimento de jogos &#8211; podemos dizer que vamos falar tecnicamente sobre um ponto bem importante:<strong> Lei Rouanet</strong>.</p>
<p><span id="more-4440"></span></p>
<p>Atualmente, muito se corre atrás de investimento e incentivo fiscal para o desenvolvimento de games. Já tivemos vários casos de empresas fechando as portas em função da alta carga tributária brasileira, um caso bem conhecido é o da Ubisoft. Também, em evento da Square Enix em SP no mês passado o Sr. Fukushima foi muito claro ao tocar nessa nossa &#8220;ferida&#8221;, os impostos, tanto que além do Brasil, outros países da América Latina estão na alça de mira desta <em>publisher </em>para fazer negócios em função dos custos.</p>
<p>O Brasil vem se adaptando a essa realidade do crescimento da área de games a passos lentos. O governo vem fazendo o papel dele, mas claro, nunca perdendo e sempre jogando para ganhar.</p>
<p>Vamos analisar o que diz a nova lei de incentivo ao desenvolvimento de jogos que foi homologada no final do ano passado.</p>
<div id="_mcePaste"><em>&#8221; De acordo com a Portaria nº 116, de 29 de novembro de 2011, os jogos eletrônicos passaram a ser reconhecidos como segmento cultural para o recebimento de doações e patrocínios, conforme o estabelecido na Lei 8.313, de 23 de dezembro de 1991.</em></div>
<div><em><br />
</em></div>
<div id="_mcePaste"><em>Na referida lei, quem produz jogos ou outro bem cultural reconhecido pelo Ministério da Cultura está apto a captar recursos que podem ser totalmente deduzidos do imposto de renda. Agora, empresas e pessoas físicas podem usar valores que seriam direcionados ao imposto para investir no desenvolvimento de jogos eletrônicos.</em></div>
<div><em><br />
</em></div>
<div id="_mcePaste"><em>Os projetos inseridos neste novo segmento deverão ser inscritos no SalicWeb e devem selecionar como área cultural o audiovisual e seguir os padrões estabelecidos dentro da Instrução Normativa nº 1, de 5 de outubro de 2010. &#8220;</em></div>
<p>O texto é muito bonito! Pensem bem&#8230; não dá vontade de sair correndo, acessar o SalicWeb, cadastrar um projeto de um game que vocês sempre sonharam em fazer e sair buscando um patrocínio. Fácil né?</p>
<p>Pois é&#8230; nem tanto!</p>
<p>Os 3 problemas mais graves são os seguintes:</p>
<ul>
<li>um processo extremamente burocrático e desanimador;</li>
<li>se você pedir um patrocínio de R$100 mil para uma empresa, esta não poderá deduzir integralmente do imposto de renda (IRPJ) dela. Apenas parte do valor pode ser deduzido do imposto;</li>
<li>não pode haver viés comercial;</li>
</ul>
<p>O terceiro item é gravíssimo, imaginem uma empresa patrocinando um game e não ser possível veicular a marca dela dentro do game porque irá gerar uma exposição da marca com viés comercial que a lei não permite. No máximo um botão de créditos ou ao final do game irá &#8220;rolar&#8221; na tela um logo e uns textos com os créditos do game. Bom, assim é difícil, ouso a dizer que seria uma &#8220;Missão Impossível&#8221; conseguir um patrocinador. Para uma produção cinematográfica, até é possível pois o mercado já está acostumado com isso, mas para nossa área que não tem essa cultura ainda&#8230; Uauu complica e muito!</p>
<p>Se na nossa área uma das grandes sacadas é trabalhamos com modelos &#8220;in game ads&#8221; ou &#8220;integrated mark&#8221; o simples fato de não ter cunho comercial ou apenas veicular a marca do cliente, esse incentivo parece andar na contra-mão.</p>
<p>Enfim, mas também não podemos dizer que o governo não fez nada para ajudar. O governo está jogando, se armou até os dentes e está nos desafiando. A probabilidade de um game over para as desenvolvedoras brasileiras é muito alta. Alguém se habilita?</p>
<p>Até o próximo post pessoal!</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/incentivo-do-governo-para-desenvolver-jogos-lei-rouanet/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PodAbrir 18 &#8211; Serious Games</title>
		<link>http://abrindoojogo.com.br/podabrir-18-serious-games</link>
		<comments>http://abrindoojogo.com.br/podabrir-18-serious-games#comments</comments>
		<pubDate>Thu, 03 May 2012 13:22:39 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Mercado de Jogos]]></category>
		<category><![CDATA[Pod-Abrir]]></category>
		<category><![CDATA[Projeto de Jogo]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4423</guid>
		<description><![CDATA[Olá gurizada, Arrumando um tempinho entre as tarefas do dia a dia, trazemos mais um episódio do nosso podcast sobre desnvolvimento de jogos, o PodAbrir. Atendendo a pedidos feitos após o episódio sobre Advergames, o tema de hoje é sobre Serious Games. Abordaremos este conceito que já é bastante conhecido aqui no Brasil, descrevendo as [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-4428" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2012/05/logo.jpg" alt="" width="164" height="206" />Olá gurizada,</p>
<p>Arrumando um tempinho entre as tarefas do dia a dia, trazemos mais um episódio do nosso podcast sobre desnvolvimento de jogos, o PodAbrir. Atendendo a pedidos feitos após o episódio sobre Advergames, o tema de hoje é sobre Serious Games. Abordaremos este conceito que já é bastante conhecido aqui no Brasil, descrevendo as suas ramificações e dando vários exemplos de suas aplicações.</p>
<p><span id="more-4423"></span></p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/02/transparente-e1330037646604.png"><img title="transparente" src="http://abrindoojogo.com.br/wp-content/uploads/2012/02/transparente-e1330037646604.png" alt="" width="100" height="100" /></a></p>
<p><strong>Participantes</strong></p>
<div>
<ul>
<li>Everton Vieira</li>
<li>Alessandro Nornberg</li>
</ul>
</div>
<div><strong>Categoria</strong></div>
<div>
<ul>
<li>Conceitual</li>
</ul>
</div>
<p><strong>Links comentados neste episódio</strong></p>
<div>
<ul>
<li><a href="http://forum.abrindoojogo.com.br/" target="_blank">Fórum Abrindo o Jogo</a>.  <strong>Cadastre-se</strong></li>
<li><strong><a href="http://en.wikipedia.org/wiki/Battlezone_(1980_video_game)">Battlezone</a></strong></li>
<li><a href="http://abrindoojogo.com.br/desafios-e-aventuras-para-estudar-quimica-organica" target="_blank"><strong></strong>Post sobre Desafios e Aventuras para Estudar Química Organica</a></li>
<li><a href="http://en.wikipedia.org/wiki/Serious_game" target="_blank">Serious game na Wikipedia</a></li>
<li><a href="http://www.americasarmy.com/" target="_blank">Americas Army</a></li>
<li><a href="http://super.abril.com.br/blogs/newsgames/filosofighters-conheca-os-bastidores-do-newsgames-360%C2%BA-lancado-pela-super-em-junho/" target="_blank">Matéria sobre um dos newsgame da Abril</a></li>
<li><a href="http://www.gwap.com" target="_blank">Site do GWAP (Games With  Purpose)</a></li>
<li><a href="http://portal.estacio.br/unidades/universidade-estacio-de-sa/cursos/graduacao/tecnologica/jogos-digitais.aspx">Curso presencial de Jogos Digitais da Estácio de Sá. Lembrando que alunos do AoJ tem desconto <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </a></li>
</ul>
<p><strong>Trilha Sonora</strong></p>
</div>
<div>
<ul>
<li>Deadmaker &#8211; <a href="http://www.edguy.net/" target="_blank">EdGuy</a><a href="http://www.ronniejamesdio.com/" target="_blank"></a></li>
</ul>
<p><strong>PodCast</strong></p>
<ul>
<li>Siga o nosso podcast em <a href="http://abrindoojogo.com.br/feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>.</li>
<li>Para o Itunes, acesse a <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en" target="_blank">store aqui</a>.</li>
</ul>
</div>
<p style="text-align: center;"><a href="http://www.facebook.com/abrindoojogo" target="_blank">Visitem nossa página no Facebook</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-18-serious-games/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/4423/0/PodAbrir18.mp3" length="48514704" type="audio/mpeg" />
		<itunes:duration>0:50:26</itunes:duration>
		<itunes:subtitle>Olá gurizada,
Arrumando um tempinho entre as tarefas do dia a dia, trazemos mais um episódio do nosso podcast sobre desnvolvimento de jogos, o PodAbrir. Atendendo a pedidos feitos após o episódio sobre Advergames, o tema de hoje é sobre Serious Game[...]</itunes:subtitle>
		<itunes:summary>Olá gurizada,
Arrumando um tempinho entre as tarefas do dia a dia, trazemos mais um episódio do nosso podcast sobre desnvolvimento de jogos, o PodAbrir. Atendendo a pedidos feitos após o episódio sobre Advergames, o tema de hoje é sobre Serious Games. Abordaremos este conceito que já é bastante conhecido aqui no Brasil, descrevendo as suas ramificações e dando vários exemplos de suas aplicações.


Participantes


Everton Vieira
Alessandro Nornberg


Categoria


Conceitual


Links comentados neste episódio


Fórum Abrindo o Jogo.  Cadastre-se
Battlezone
Post sobre Desafios e Aventuras para Estudar Química Organica
Serious game na Wikipedia
Americas Army
Matéria sobre um dos newsgame da Abril
Site do GWAP (Games With  Purpose)
Curso presencial de Jogos Digitais da Estácio de Sá. Lembrando que alunos do AoJ tem desconto  

Trilha Sonora



Deadmaker &#8211; EdGuy

PodCast

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


Visitem nossa página no Facebook</itunes:summary>
		<itunes:keywords>Pod-Abrir</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
		<item>
		<title>PodAbrir 17 – Inteligência Artificial</title>
		<link>http://abrindoojogo.com.br/podabrir-17-%e2%80%93-inteligencia-artificial</link>
		<comments>http://abrindoojogo.com.br/podabrir-17-%e2%80%93-inteligencia-artificial#comments</comments>
		<pubDate>Sat, 21 Apr 2012 21:40:48 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Inteligência Artificial]]></category>
		<category><![CDATA[Pod-Abrir]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4410</guid>
		<description><![CDATA[Olá gurizada, Mesmo com um pouco de atraso, trazemos mais um episódio do nosso podcast sobre desenvolvimento de games, o PodAbrir. Neste episódio eu, sem poder contar com o meu companheiro de trabalho, falo sobre um tema bastante acesso aqui no blog &#8211; a Inteligência Artificial em games. O objetivo aqui é introduzir as principais [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-4415" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/logo1.jpg" alt="" width="136" height="171" />Olá gurizada,</p>
<p>Mesmo com um pouco de atraso, trazemos mais um episódio do nosso podcast sobre desenvolvimento de games, o PodAbrir. Neste episódio eu, sem poder contar com o meu companheiro de trabalho, falo sobre um tema bastante acesso aqui no blog &#8211; a Inteligência Artificial em games. O objetivo aqui é introduzir as principais técnicas utilizadas pela indústria de games.</p>
<p><span id="more-4410"></span></p>
<p style="text-align: center;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/02/transparente-e1330037646604.png"><img class="aligncenter size-full wp-image-4008" title="transparente" src="http://abrindoojogo.com.br/wp-content/uploads/2012/02/transparente-e1330037646604.png" alt="" width="100" height="100" /></a></p>
<p><strong>Participantes</strong></p>
<div>
<ul>
<li>Everton Vieira (episódio solo <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  )</li>
</ul>
</div>
<div><strong>Categoria</strong></div>
<div>
<ul>
<li>Técnico:  I.A.</li>
</ul>
</div>
<p><strong>Links comentados neste episódio</strong></p>
<div>
<ul>
<li><a href="http://forum.abrindoojogo.com.br/" target="_blank">Fórum Abrindo o Jogo</a>.  <strong>Cadastre-se</strong></li>
<li><a href="http://www.anscamobile.com/corona/" target="_blank">Corona SDK</a></li>
<li><a href="http://abrindoojogo.com.br/category/inteligencia-artificial" target="_blank">Posts sobre Inteligência Artificial aqui no AoJ</a></li>
</ul>
<div><strong>O Save foi para: </strong></div>
<div>
<ul>
<li>Gilvan Sampaio</li>
</ul>
</div>
<p><strong>Trilha Sonora</strong></p>
</div>
<div>
<ul>
<li>Dream Evil &#8211; <a href="http://www.ronniejamesdio.com/" target="_blank">Holly DIO</a></li>
</ul>
<p><strong>PodCast</strong></p>
<ul>
<li>Siga o nosso podcast em <a href="../feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>.</li>
<li>Para o Itunes, acesse a <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en" target="_blank">store aqui</a>.</li>
</ul>
</div>
<p><a href="http://www.facebook.com/abrindoojogo" target="_blank">Visitem nossa página no Facebook</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-17-%e2%80%93-inteligencia-artificial/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/4410/0/PodAbrir17.mp3" length="26459436" type="audio/mpeg" />
		<itunes:duration>0:27:28</itunes:duration>
		<itunes:subtitle>Olá gurizada,
Mesmo com um pouco de atraso, trazemos mais um episódio do nosso podcast sobre desenvolvimento de games, o PodAbrir. Neste episódio eu, sem poder contar com o meu companheiro de trabalho, falo sobre um tema bastante acesso aqui no blog[...]</itunes:subtitle>
		<itunes:summary>Olá gurizada,
Mesmo com um pouco de atraso, trazemos mais um episódio do nosso podcast sobre desenvolvimento de games, o PodAbrir. Neste episódio eu, sem poder contar com o meu companheiro de trabalho, falo sobre um tema bastante acesso aqui no blog &#8211; a Inteligência Artificial em games. O objetivo aqui é introduzir as principais técnicas utilizadas pela indústria de games.


Participantes


Everton Vieira (episódio solo   )


Categoria


Técnico:  I.A.


Links comentados neste episódio


Fórum Abrindo o Jogo.  Cadastre-se
Corona SDK
Posts sobre Inteligência Artificial aqui no AoJ

O Save foi para: 


Gilvan Sampaio


Trilha Sonora



Dream Evil &#8211; Holly DIO

PodCast

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


Visitem nossa página no Facebook</itunes:summary>
		<itunes:keywords>Pod-Abrir, Técnico</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
		<item>
		<title>Inteligência Artificial nos Games – Pathfinding</title>
		<link>http://abrindoojogo.com.br/inteligencia-artificial-nos-games-%e2%80%93-pathfinding</link>
		<comments>http://abrindoojogo.com.br/inteligencia-artificial-nos-games-%e2%80%93-pathfinding#comments</comments>
		<pubDate>Fri, 13 Apr 2012 23:51:21 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Inteligência Artificial]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4276</guid>
		<description><![CDATA[Olá gurizada, Mesmo que no finalzinho da semana, trago o 3º post do arco sobre Inteligência Artificial para vocês. Como já mencionado no episódio anterior, o assunto hoje será o &#8220;famigerado&#8221; Pathfinding (busca de caminho). O algoritmo responsável por mover um agente de um ponto a outro, desviando de obstáculos, é famoso por tirar o [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-4394" title="logo4" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/logo4.jpg" alt="" width="191" height="156" />Olá gurizada,</p>
<p>Mesmo que no finalzinho da semana, trago o 3º post do arco sobre Inteligência Artificial para vocês. Como já mencionado no <a href="http://abrindoojogo.com.br/inteligencia-artificial-nos-games-%E2%80%93-mais-aplicacoes">episódio anterior</a>, o assunto hoje será o &#8220;famigerado&#8221;<strong> Pathfinding </strong>(busca de caminho). O algoritmo responsável por mover um agente de um ponto a outro, desviando de obstáculos, é famoso por tirar o sono de muitos programadores de games. Para desmestificá-lo, primeiro precisamos entender um pouco sobre a movimentação básica de agentes em games. Vamos lá!</p>
<p><span id="more-4276"></span>A movimentação de agentes em games é um dos segmento da I.A. mais comuns na produção de games. Os chamados <em>Steering Behaviors</em> (Comportamentos de Direção) consistem em usar regras simples que juntas fornecem uma forma mais realista de movimentação aos agentes. É uma técnica que não preserva estado, economiza memória e reage em tempo real.</p>
<p>Os principais comportamentos desta técnica são destacados abaixo:</p>
<ul>
<li>Comportamentos autônomos
<ul>
<li>Perseguição</li>
<li>Fuga</li>
<li>Perseguição com Linha de visão</li>
<li>Interceptação</li>
</ul>
</li>
<li>Comportamentos em Grupo
<ul>
<li>Separação</li>
<li>Coesão</li>
<li>Alinhamento</li>
</ul>
</li>
</ul>
<p>Vamos conhecer com mais detalhes alguns deles.</p>
<h3>Perseguição e Evasão</h3>
<p>Um algoritmo de busca simples que envolve o decremento das distâncias entre as coordenadas do caçador e da presa.</p>
<p>Pra transformar o algoritmo de perseguição em um algoritmo de evasão, basta fazer exatamente o oposto, invertendo as  coordenadas da presa de modo que sua distância aumente em relação à caça.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900; font-style: italic;">//Perseguição</span>
se <span style="color: #000000;">&#40;</span>caçadorX maior caçaX<span style="color: #000000;">&#41;</span>
caçadorX<span style="color: #000066; font-weight: bold;">--;</span>
senão se <span style="color: #000000;">&#40;</span>caçadorX menor caçaX<span style="color: #000000;">&#41;</span>
caçadorX<span style="color: #000066; font-weight: bold;">++;</span>
se <span style="color: #000000;">&#40;</span>caçadorY maior presaY<span style="color: #000000;">&#41;</span>
caçadorY<span style="color: #000066; font-weight: bold;">--;</span>
senão se <span style="color: #000000;">&#40;</span>caçadorY menor presaY<span style="color: #000000;">&#41;</span>
caçadorY<span style="color: #000066; font-weight: bold;">++;</span>
&nbsp;
<span style="color: #009900; font-style: italic;">//Evasão</span>
&nbsp;
se <span style="color: #000000;">&#40;</span>caçadorX menor caçaX<span style="color: #000000;">&#41;</span>
caçadorX<span style="color: #000066; font-weight: bold;">++;</span>
senão se <span style="color: #000000;">&#40;</span>caçadorX maior caçaX<span style="color: #000000;">&#41;</span>
caçadorX<span style="color: #000066; font-weight: bold;">--;</span>
se <span style="color: #000000;">&#40;</span>caçadorY menor presaY<span style="color: #000000;">&#41;</span>
caçadorY<span style="color: #000066; font-weight: bold;">--;</span>
senão se <span style="color: #000000;">&#40;</span>caçadorY maior presaY<span style="color: #000000;">&#41;</span>
caçadorY<span style="color: #000066; font-weight: bold;">++;</span></pre></div></div>

<p>Observe na imagem abaixo, que representa uma matriz de pixels, a trilha percorrida.</p>
<p><img class="aligncenter size-full wp-image-4302" title="aproximacao" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/aproximacao.png" alt="" width="226" height="222" /></p>
<h3>Perseguição com Linha de Visão</h3>
<p>Na perseguição com linha de visão, o predador move-se em direção à presa através de uma linha reta traçada entre os dois pontos. Se a presa estiver parada, o caminho será uma reta simples. Porém, se a presa estiver em movimento, o caminho será formado por curvas – já que, a cada iteração do laço do jogo, o predador traçará uma reta entre a sua posição e a posição da presa.</p>
<p>Um algoritmo interessante na implementação da perseguição com linha de visão é o algoritmo de <strong>Bresenham</strong>, que é muito utilizado na computação gráfica para o desenho de retas.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900; font-style: italic;">// Bresenham</span>
Determina qual eixo é mais longo<span style="color: #000066; font-weight: bold;">;</span> <span style="color: #004993;">x</span> ou <span style="color: #004993;">y</span>
Divide um eixo menor pelo outro<span style="color: #000066; font-weight: bold;">,</span> encontrando a relação
Itera pelo maior a cada unidade acrescenta o quociente</pre></div></div>

<p><img class="aligncenter size-full wp-image-4304" title="algoritmoReta" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/algoritmoReta.png" alt="" width="227" height="220" /><br />
Apesar de serem bastante úteis, os algoritmos de <em>Steering Behaviors </em>normalmente não consideram os elementos do cenário, ou seja, não levam em conta os obstáculos que possam estar no caminho do movimento.  Essa é uma limitação preocupante. Além disso, é possível perceber que estamos trabalhando diretamente com pixels. Em grandes distâncias, ou em cenário complexos, precisamos utilizar um sistema mais flexível e simples de coordendas. Para solucionar este problema, precisamos recorrer a técnica de mapear o cenário através de um grid. Essa abordagem &#8220;milenar&#8221; é utilizada até hoje em games AAA, sejam eles 2D ou 3D . Observe um exemplo abaixo:</p>
<p><img class="size-full wp-image-4336 alignnone" title="GoofTroop" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/GoofTroop.png" alt="" width="239" height="205" /> <img class="size-full wp-image-4337 alignnone" title="GoofTroopGrid" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/GoofTroopGrid.png" alt="" width="235" height="206" /></p>
<p>Com a criação do grid, reduzimos significativamente os pontos que iremos trabalhar, e consequentemente, o nosso problema. Neste exemplo ao invés que trabalhar com uma matriz de pontos de 512 x 448 (resolução do Super Nintendo), reduzimos a área para uma algo em torno de 14 x 14.  Desta forma, o caminho a ser percorrido assemelha-se bastante ao demonstrado em pixel nas primeiras imagens deste post.  O próximo passo seria rotular quais espaços estão livres ou bloqueados. Podemos visualizar na segunda imagem do game que alguns quadrados estão ocupados por troncos ou pedras. Essa informação deve ficar armazenada no mapa para o algotirmo de Pathfinding poder utilizar.</p>
<h2>PathFinding</h2>
<p>Pathfinding, ou busca de caminhos, é um dos “problemas” mais comuns acerca do desenvolvimento de jogos, e está presente na maioria dos gêneros.</p>
<p>Boa parte dos agentes em IA, sejam elas controladas pelo computador ou um NPC, precisam de <em>pathfinding</em>: tanques, pessoas, veículo ou unidade de combate.</p>
<p>O <em>pathfinding </em>não é utilizado apenas para movimentação simples &#8211; podemos utilizá-lo também para resolver problemas como:</p>
<ul>
<li><strong>Patrulhamento</strong>: consiste na movimentação de uma unidade através de pontos pré-estabelecidos do cenário e em ordem. Isto faz com que as unidades pareçam mais ativas, aumentando as suas chances de encontrar inimigos;</li>
<li><strong>Desvio de obstáculos</strong>: requer que a unidade tenha conhecimento do que está ao seu redor, de modo que evite colisões com este;</li>
<li><strong>Perseguição</strong>: fazer com que a unidade vá em direção ao seu alvo;</li>
<li><strong>Mirar e atirar:</strong> um problema que ocorre quando uma unidade tenta atingir a outra é que obstáculos podem interromper a trajetória. Uma unidade inteligente deverá prever a existência de um obstáculo na rota de colisão do tiro antes de efetuá-lo.</li>
</ul>
<h3>A* (A Star)</h3>
<p>Oriundo de outras técnicas mais custosas como o algoritmo de Dijkstra’s, o A* atualmente é a mais popular escolha para <em>pathfinding</em>. Ele é considerado um algoritmo admissível, ou seja, para qualquer grafo ele encontrará um caminho ótimo entre os estados inicial e final.</p>
<p>Para entender mais claramente o funcionamento do algoritmo, vamos fazer um exemplo. Assumindo que temos um NPC que deseja ir do ponto A (verde) ao ponto B(vermelho). Porém, há uma parede separando os dois pontos .</p>
<table style="height: 379px;" width="753">
<tbody>
<tr>
<td><img class="alignleft size-full wp-image-4305" title="AStarPasso1" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/AStarPasso1.png" alt="" width="201" height="151" /></td>
<td>
<ul>
<li>Definir que o nodo atual é o ponto inicial A (verde);</li>
<li>Definir que o nodo final é o ponto B (vermelho);</li>
<li> Criar uma lista chamada de Nodos Abertos;
<ul>
<li>Ela é o conjunto com os nodos disponíveis para escolha de caminho;</li>
</ul>
</li>
<li> Criar uma lista chamada de Nodos fechados;
<ul>
<li>Ela será o conjunto dos nodos já desconsiderados.</li>
</ul>
</li>
</ul>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td><img class="alignleft size-full wp-image-4310" title="AStarPasso2" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/AStarPasso2.png" alt="" width="202" height="152" /></td>
<td>
<ul>
<li>Adicionar o nodo atual A na lista de abertos;</li>
<li> Identifique todos os nodos “vizinhos” ao nodo atual;</li>
<li> Calcular o custo de locomoção para cada um destes nodos;
<ul>
<li>Aqui podemos utilizar várias forma de calcular a distância. Vou optar pela fórmula clássica (F = G + H)</li>
<li> G : É o custo de deslocamento do ponto atual para o vizinho. Podemos aqui contar com a diagonal ou apenas o movimento ortogonal;</li>
<li> H : É um valor heurístico que representa a distância do ponto em questão até o destino. O valor é heuristico pois não contempla os obstáculos (Manhattan, Euclidiana, etc)</li>
</ul>
</li>
<li> Adicionar o nodo atual (A) como pai de cada um de seus &#8220;vizinhos&#8221;;</li>
<li> Acrescente os “vizinhos” a lista de abertos;</li>
</ul>
</td>
</tr>
<tr>
<td><img class="alignleft size-full wp-image-4311" title="AStarPasso3" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/AStarPasso3.png" alt="" width="200" height="153" /></td>
<td>
<ul>
<li>Escolher da lista de abertos o nodo de menor custo;</li>
<li> Remover o nodo atual da lista de abertos ;</li>
<li> Adicionar o nodo atual na lista de fechados;</li>
<li> Tornar o melhor nodo escolhido como nodo atual;</li>
</ul>
<ul>
<li>O valor do canto esquerdo inferior representa o descolamento, 10 para  vizinhos diretamente ligados ao nodo A e 14 para as diagonais.</li>
<li>O valor no canto direito inferior representa a distância deste nodo em relação ao destino (10 para cada casa);</li>
</ul>
</td>
</tr>
<tr>
<td><img class="alignleft size-full wp-image-4312" title="AStarPasso4" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/AStarPasso4.png" alt="" width="204" height="155" /></td>
<td>
<ul>
<li>Repetir o processo do passo 2;
<ul>
<li> Em casos de nodos de mesmo custo, escolher aleatoriamente ;</li>
<li> Em casos de nodos que já estejam na lista de abertos, analisar se o custo de G atual não seria menor que o anterior. (G é acumulativo);</li>
</ul>
</li>
<li> Repetir passo 3; *</li>
</ul>
</td>
</tr>
<tr>
<td><img class="alignleft size-full wp-image-4313" title="AStarPasso5" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/AStarPasso5.png" alt="" width="206" height="163" /></td>
<td>
<ul>
<li>O processo se repete até que o nodo alvo seja incluído na listagem; *</li>
<li> Como fazemos para encontrar o caminho?
<ul>
<li> Basta, através do nodo atual, pegar o seu antecessor e assim recursivamente;</li>
<li> Ao final precisamos apenas inverter o vetor para obter o melhor caminho.</li>
</ul>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>A lógica do Algoritmo não é tão simples de ser entendida a primeira vista, já que utiliza recursividade. Para facilitar o entendimento dos leitores, eu elaborei um exemplo de implementação utilizando a linguagem Action Script 3. Vejam abaixo o código simplificado deste algoritmo.</p>
<p><strong>Obs</strong>: Alguns métodos foram abstraídos para facilitar o entendimento.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900; font-style: italic;">// Retorna o caminho(trilha) a ser percorrido</span>
<span style="color: #339966; font-weight: bold;">function</span> getPath<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">:</span>Vector
<span style="color: #000000;">&#123;</span>
	<span style="color: #009900; font-style: italic;">//Lista para armazenar os nodos vizinhos</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> nodesAround<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Array</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #009900; font-style: italic;">//Lista para armazenar o caminho a ser percorrido</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> path<span style="color: #000066; font-weight: bold;">:</span>Vector = <span style="color: #0033ff; font-weight: bold;">new</span> Vector<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #009900; font-style: italic;">//Adiciona na lista de abertos a posição inicial</span>
	openList<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>startPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
	<span style="color: #009900; font-style: italic;">//Laço enquanto o passo atual não for igual ao final</span>
	<span style="color: #0033ff; font-weight: bold;">while</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">!</span>stepPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">equals</span><span style="color: #000000;">&#40;</span>endPoint<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #009900; font-style: italic;">//Armazena em uma lista os vizinhos do nodo atual. O método getNodesAround retorna os vizinhos do ponto</span>
		nodesAround = getNodesAround<span style="color: #000000;">&#40;</span>stepPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
		<span style="color: #009900; font-style: italic;">//Para todos os vizinhos encontrados</span>
		<span style="color: #0033ff; font-weight: bold;">for</span><span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> i<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">uint</span>=<span style="color: #000000; font-weight:bold;">0</span><span style="color: #000066; font-weight: bold;">;</span>i <span style="color: #000066; font-weight: bold;">&amp;</span>lt<span style="color: #000066; font-weight: bold;">;</span> nodesAround<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">length</span><span style="color: #000066; font-weight: bold;">;</span>i<span style="color: #000066; font-weight: bold;">++</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #009900; font-style: italic;">//Verifica se o vizinho é sólido</span>
			<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">!</span>isSolidNode<span style="color: #000000;">&#40;</span>nodesAround<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #009900; font-style: italic;">//Verifica se o vizinho não está na lista de fechados, ou seja, se já não foi visitado antes.</span>
                                <span style="color: #009900; font-style: italic;">//Se não, o adiciona a esta lista.</span>
				<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">!</span>isCloseList<span style="color: #000000;">&#40;</span>nodesAround<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
				<span style="color: #000000;">&#123;</span>
					<span style="color: #009900; font-style: italic;">//Verifica se foi possível adicionar o vizinho na lista de abertos</span>
					<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>addOpenList<span style="color: #000000;">&#40;</span>nodesAround<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
						<span style="color: #009900; font-style: italic;">//Registra o custo G do nodo e também já registra o seu pai (nodo atual)</span>
                                                <span style="color: #009900; font-style: italic;">// O método registreNodeCost calcula o custo de deslocamente e armazena no objeto</span>
						registerNodeCost<span style="color: #000000;">&#40;</span>nodesAround<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000066; font-weight: bold;">,</span>stepPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
					<span style="color: #0033ff; font-weight: bold;">else</span>
						<span style="color: #009900; font-style: italic;">//Recalcula o custo G do nodo</span>
						testGCost<span style="color: #000000;">&#40;</span>nodesAround<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000066; font-weight: bold;">,</span>stepPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
				<span style="color: #000000;">&#125;</span>
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span>
		<span style="color: #009900; font-style: italic;">//Seta que o nodo atual, é o vizinho de melhor custo (dá um passo)</span>
		stepPoint = getBetterNode<span style="color: #000000;">&#40;</span>openList<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
		<span style="color: #009900; font-style: italic;">//Remove o melhor vizinho da lista de abertos</span>
		removeOpenList<span style="color: #000000;">&#40;</span>stepPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
		<span style="color: #009900; font-style: italic;">//Adiciona o melhor vizinho na lista de fechados</span>
		addCloseList<span style="color: #000000;">&#40;</span>stepPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #009900; font-style: italic;">// Através do nodo final, percorre toda a listagem de trás para frente.</span>
	<span style="color: #0033ff; font-weight: bold;">while</span><span style="color: #000000;">&#40;</span>getTileByPosition<span style="color: #000000;">&#40;</span>stepPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">.</span>nodeParent<span style="color: #000066; font-weight: bold;">!</span>= <span style="color: #0033ff; font-weight: bold;">null</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		path<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>stepPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
		<span style="color: #009900; font-style: italic;">//Armazena na variável refernte ao nodo atual o nodo pai deste.</span>
		stepPoint = getTileByPosition<span style="color: #000000;">&#40;</span>stepPoint<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">.</span>nodeParent<span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #009900; font-style: italic;">//Retorna o array de nodos invertendo a ordem</span>
	<span style="color: #0033ff; font-weight: bold;">return</span> path<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">reverse</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Para auxiliar ainda mais no entendimento deste importante algoritmo, elaborei um “<a title="PathFinding Simulador" href="http://abrindoojogo.com.br/files/pathfinding/PathFinding.html" target="_blank">simulador</a>”, onde é possível definir um ponto de origem, outro de destino e visualizar o caminho ideal a ser percorrido. É possível também, visulizar o funcionamento do algoritmo passo a passo.</p>
<p>O assunto deste post é de nível avançado, sendo sugerido para programadores mais experientes. O que você achou? Não entendeu e gostaria de mais explicações? Podemos seguir com as dicas sobre o algoritimo no fórum. Lá temos um <a href="http://forum.abrindoojogo.com.br">tópico exclusivo</a> para ele. Não deixe de conferir e participar. <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/inteligencia-artificial-nos-games-%e2%80%93-pathfinding/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Leitor no Controle &#8211; Postmortem do Jogo Double Jumper</title>
		<link>http://abrindoojogo.com.br/leitor-no-controle-postmortem-do-jogo-double-jump</link>
		<comments>http://abrindoojogo.com.br/leitor-no-controle-postmortem-do-jogo-double-jump#comments</comments>
		<pubDate>Tue, 10 Apr 2012 21:27:49 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[Leitor no Controle]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4343</guid>
		<description><![CDATA[Hoje, na coluna Leitor no Controle, o Gabriel Araujo dos Santos nos conta como desenvolveu seu jogo Double Jumper, para Windows Phone, desde sua inspiração até a distribuição no Marketplace. Esta plataforma é muito nova no Brasil, e o Gabriel está entre os pioneiros no desenvolvimento para ela. Mas além da peculiaridade da plataforma, o post [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/11/colaboradores_internautas.png"><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="167" height="196" /></a>Hoje, na coluna Leitor no Controle, o <strong>Gabriel Araujo dos Santos</strong> nos conta como desenvolveu seu jogo <strong>Double Jumper</strong>, para Windows Phone, desde sua inspiração até a distribuição no Marketplace. Esta plataforma é muito nova no Brasil, e o Gabriel está entre os pioneiros no desenvolvimento para ela.</p>
<p>Mas além da peculiaridade da plataforma, o post do Gabriel é um exemplo. Mostra como é insistir no sonho apesar das dificuldades, e focar em um projeto pequeno e com ele conhecer todas fases do processo (e suas dificuldades). É o tipo de relato que tanto instrui como inspira. Leitura obrigatória para o iniciante.</p>
<p style="text-align: center;"><span id="more-4343"></span><em>O material abaixo é um resumo do post feito pelo Gabriel no nosso fórum. O post original é bem longo e tem ainda mais informações. <a href="http://forum.abrindoojogo.com.br/viewtopic.php?f=2&amp;t=20" target="_blank">Você pode ler ele aqui</a>.</em></p>
<p>Olá, meu nome é Gabriel Araujo, tenho 26 anos, natural de Parnaíba &#8211; Piaui, atualmente morando em Cuiaba &#8211; MT. Infelizmente longe dos grandes polos de tecnologia&#8230;<br />
Trabalho com programação em C# já ha 7 anos, atualmente trabalho no Tribunal de Justiça de Mato Grosso como Analista de Sistemas.</p>
<p>Este é um post póstumo sobre como foi o desenvolvimento do Jogo Double Jumper, na tentativa de incentivar outros desenvolvedores a compartilhar suas experiencias.</p>
<h2>Era uma vez &#8230;</h2>
<p>Esse é meu primeiro game publicado. Como todo desenvolvedor sempre tive vontade de fazer meu próprio game. Como programador em C# o caminho mais fácil é utilizar o XNA Framework, não é uma engine, porem nunca levava a sério com a desculpa que não tinha por que perder tempo com isso se ninguém jogaria. Com a ascensão do modelo de negocio das lojas de aplicativos (Steam, App Store, etc) vi uma motivação, porém C++ com DirectX é muito hardcore pra ser um hobby e aprender Objective C é muito sofrimento, trabalhar com java no android, por algum motivo, sequer passou pela minha cabeça&#8230;</p>
<p>Quando surgiu o primeiro SDK para desenvolvimento para Windows Phone, minha motivação aumentou. Desenvolver um Jogo, pra min seria por diversão de final de semana, não queria dor de cabeça&#8230; então nos tempos livres comecei a brincar com o código, coisas simples&#8230;</p>
<p>O primeiro desafio foi fazer um retângulo se mover e colidir com outro retângulo e se mover na direção contraria ao impacto&#8230; ótimo, a parte mais difícil foi desenhar o retângulo na tela uma vez que o XNA é um framework te ajuda a printar coisas na tela e atualizar estados e só&#8230; não é uma engine completa com milhares de funções pre-defindas&#8230; felizmente o site da MSDN (Microsoft Developer Network) é muito completo e útil em todo tipo de tutorial e exemplos, a Microsoft é uma empresa maléfica porém ela trata muito bem seus desenvolvedores.</p>
<p>Era uma vez&#8230; jogando um mmorpg chamado lineage2, um colega passa o link do &#8220;Robot Unicorn Attack&#8221;, na hora foi humilhado pelo visual multicolorido do jogo, mas 10 minutos depois tudo mundo parou de jogar o tal mmo pra ficar disputando Score no jogo do unicornio robo. Isso já tem uns três anos&#8230;</p>
<p>Eu gostei particulamente porque era tudo que que queria fazer em Sonic 2, isto é, Correr e pular como se não houve amanhã. No sonic, apesar de ser um jogo rápido, o game design segue muito o estilo &#8220;labirinto&#8221;. Isso na minha opinião limitava muito o jogo&#8230;</p>
<p>Quando comecei a brincar com jogos, mais ou menos depois de ouvir o Podcast &#8220;Double Jumper &#8211; Eversion&#8221;, comecei a fazer uma engine de jogo de plataforma apenas pelo prazer de programar algo diferente de telas que se limitam a trazer e enviar dados do banco pra tela e virse-versa. Logo as coisas foram tomando forma. Mostrei para uns colegas de trabalho e eles me disseram que eu poderia ganhar alguma grana fazer algo para celular&#8230; ainda não tenho muita certeza sobre isso&#8230;</p>
<p>Então determinei um escopo para o Jogo: O gameplay será mais baseado no Robot Unicorn Attack, isto é, a tela se move automaticamente e destrói os inimigos com um &#8220;Dash&#8221;. Adicionei dois novos elementos, um botão para retardar o tempo, assim você não fica cego e pode calcular melhor o tempo do seu pulo, esse botão somente fica habilitado depois de uma certa velocidade (que também tem peso no highscore).<br />
Outro elemento é o um shield, estilo chupado do jogo sonic &#8230;</p>
<p style="text-align: center;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/04/prototipodoublejumper.png"><img class="size-full wp-image-4357 aligncenter" title="prototipodoublejumper" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/prototipodoublejumper.png" alt="" width="459" height="221" /></a></p>
<h2>Fiz do Jeito que Deu</h2>
<p>De fato o visual é o maior problema, com a ideia de produzir algo para celular, tenho no Twitter procurado ilustradores afim de participar do projeto, primeiramente queria fazer uma &#8220;parceria&#8221;, depois já estava disposto a pagar pelo serviço&#8230; tem uma galera boa BR no deviantart, queria fazer um personagem mais engraçadinho, tipo o pateta (hehe). Mas a galera que tá iniciando sempre quer ter seu próprio projeto artístico, então oferecei um papel em branco, o cara poderia sugerir o visual e ate o game play&#8230; eu só queria programar de fato.. mesmo assim nada&#8230;</p>
<p>Com a Engine 80% pronta para um jogo de plataforma e ainda usando quadrados para simular os personagens decidi me aventurar pelo mundo fantástico do pixel art, vi alguns videos no youtube&#8230; e me lembrei de uma engine chamada MUGEN, procurei alguns sprites, comecei a desenhar por cima.</p>
<p>Fiz do meu jeito, mas ao menos produzi algo em vez de ficar estagnado. Afinal é meu primeiro jogo não espero revolucionar o mundo no primeiro jogo. Segue abaixo um exemplo tosco da forma que estou desenhando as plataformas no Paint. Se alguns se sensibilizar com a minha causa será bem vindo a participar do projeto.</p>
<p style="text-align: center;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/04/plataforma1edit.png"><img class="aligncenter size-full wp-image-4361" title="plataforma1edit" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/plataforma1edit.png" alt="" width="480" height="288" /></a></p>
<h2>Desenvolvimento</h2>
<p>A fase de desenvolvimento foi baseada no descomprometimento e amadorismo&#8230; isto é, só sentava pra desenvolver no final de semana e mesmo assim era um final de semana sim, oito não&#8230; no inicio estava desenvolvendo somente no emulador do windows phone sdk. Quando o jogo começou a tomar forma, num ato de loucura e desespero de me livrar do vicio de jogar um MMORPG chamado Lineage 2, já citado anteriormente, vendi meu personagem no jogo com todos os itens. Consegui mais de 2mil reais nisso, com parte da grana, então, comprei um celular com o Windows Phone no Mercado livre. Na época existia um hack que você poderia fazer o deploy do jogo mesmo sem ser um desenvolvedor registrado. Isso melhorou muito a visualização do gamedesign e de como fazer o jogo se tornar mais interessante, utilizava alguns colegas de trabalho como beta teste&#8230;</p>
<p>Cada dia eu tinha uma ideia para incrementar o jogo, cada amigo que via o jogo viajava mais ainda na maionese. A maior dificuldade do desenvolvimento são as imagens, durante centenas de milhares de anos procurei um ilustrador para me ajudar com o projeto. Por fim fui obrigado a simplificar o jogo e fazer as imagens no MS Paint com minhas próprias mãos, digo clicks&#8230;</p>
<p style="text-align: center;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/04/001lm.png"><img class="aligncenter size-full wp-image-4362" title="001lm" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/001lm.png" alt="" width="481" height="289" /></a></p>
<h2>Publicação</h2>
<p>No meio do ano de 2011 o jogo estava &#8220;pronto&#8221;, quero dizer, jogável&#8230; e sem um ilustrador para me ajudar não tinha como evoluir mais o gameplay. Então literalmente liguei o f**a-se e paguei a licença de publicação na Marketplace do Windows Phone, 99 Doletas no cartão de credito internacional de um colega&#8230;</p>
<p>A publicação na Loja da Microsoft foi muito simples, e foi relativamente rápida, num ato de noobisse (<em>&#8220;amadorismo&#8221; &#8211; nota do editor</em>) eu marquei a publicação automática após a aprovação e o jogo foi ao ar no dia 16 de agosto (uma terça feira). Não faça isso. Minha ideia era ter publicado no sábado. Após a publicação o site de report tem um delay de 1 semana para poder começar a gerar estatística&#8230; uma semana depois para minha surpresa o jogo foi bem recebido.</p>
<p>Publiquei o Jogo &#8220;Double Jumper&#8221; na Marketplace do Windows Phone dia 16 de agosto totalmente Free.</p>
<p>Em 3 dias de lançamento (16, 17 e 18) o jogo teve:</p>
<ul>
<li>5.672 downloads;</li>
<li>57+ Reviews</li>
<li>6 Crashs</li>
<li>Ficou na media de 3.5 Estrelas, sendo o máximo de 5 Estrelas;</li>
</ul>
<p>Uma dica: a primeira semana é a mais importante, é tudo que você tem, seu jogo estará no Topo do News e será a sua maior visualização, eu errei ao publicar o jogo sem um bom acabamento, na publicação o jogo sequer tinha musica de fundo&#8230; posteriormente eu inclui High-Score com Rank online essas features com certeza aumentariam a recepção do Jogo.</p>
<p>Por mais incrível que pareça o meu jogo estava publicado em tudo quanto é pais, mas o Brasil estava de fora. Até porque a maioria dos usuários estão voltados para a Marketplace americana, até mesmo os brasileiros acessam as lojas de App americana.</p>
<p>Todo conteúdo Audiovisual publicado aqui é necessário ter uma Classificação Indicativa. Do site da Marketplace fui redirecionado para o Site do Ministério da Justiça onde, em resumo, dizia o seguinte: você tem que enviar um documento via correio de um formulário sobre seu jogo e escrever um pouco do como é o jogo e PLUS você deve enviar uma mídia jogável ou vídeo gameplay para analise. Esperar 20 dias de burrocracia, se aprovado você tem que esperar seu jogo sair no Diário Oficial (não sei se isso tem custo $) &#8230; ai, publicado, você usa o PDF da pagina do Diário Oficial para provar sua classificação Indicativa (Pelo menos foi isso que eu entendi)&#8230;</p>
<p>Também publiquei na União Europeia, fui redirecionado ao site de lá, preenchi via web um formulário sobre o jogo, fiz upload de algumas imagens, solicitei classificação livre &#8230; e depois de alguns minutos, misteriosamente, estava na minha caixa de email a resposta com um PDF em anexo &#8230; enviei o PDF para o site da Marketplace e 3 minutos e pronto, publicado.</p>
<p>Entrei em contato via Twitter com um cara da MS Brasil o @RodoCarmo pedindo ajuda de como publicar aqui no brasil&#8230; logo em seguida outra pessoa entrou em contato comigo dizendo que não era tão complicado assim, mandei o link do site do Ministério da Justiça &#8230; ele só respondeu uma carinha triste &#8230;</p>
<p>Mais tarde um contato do Ministério da Justiça (@classind) se prontificou em cuidar do meu caso, me mandou um endereço de email para conversar diretamente comigo, disse que não preciso enviar nada por correio. Eu posso imprimir o formulário, responder, assinar, digitalizar e enviar por email&#8230; o jogo tb não precisa enviar, pq a MS disponibiliza acesso a Marketplace a eles para testarem todos os jogos (pelo que eu entendi).</p>
<p>O jogo foi publicado na Marketplace Brasileira. Tive, dada as devidas proporções, relativamente muitos downloads, porém os reviews (estou falando dos reviews dentro da própria Markeplace) dos brasileiros são desmotivadores, alguns deles são até ofensivos. Mesmo sendo um jogo 100% free, os comentários são muitos maldosos, num ato de tristeza fui pesquisar os reviews de outros jogos de grandes publicadores e apps de grande nome, os comentários são igualmente negativos, acho que isso é mais ou menos da nossa natureza.</p>
<h2>Relatórios e reviews</h2>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/04/chartimgp.png"><img class="aligncenter size-full wp-image-4363" title="chartimgp" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/chartimgp.png" alt="" width="532" height="221" /></a><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/04/excelb.png"><img class="alignleft size-full wp-image-4364" title="excelb" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/excelb.png" alt="" width="189" height="449" /></a></p>
<p>Total: 128.128 Downloads</p>
<p><a href="http://www.youtube.com/watch?v=_EhMd_lr6yg" target="_blank">Vídeo da versão Beta pra vcs terem uma ideia</a></p>
<p><a href="http://youtu.be/Ph12uyP-EiU" target="_blank">Review em um Site Americano</a></p>
<p><a href="http://www.youtube.com/watch?v=I102rZmnNNU" target="_blank">Review em um Site Russo</a></p>
<p><a href="http://channel9.msdn.com/Shows/Hot-Apps/Hot-Apps-Farm-Frenzy-2-Pocket-Party-Game-Archie-Race--Battle-Double-Jumper" target="_blank">Review no Hot Apps do Site da Microsoft</a></p>
<p><a href="http://www.windowsphonemetro.com/2011/08/18/robot-unicorn-clone-double-jumper-leaps-to-windows-phone/" target="_blank">Pequeno review em um site gringo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/leitor-no-controle-postmortem-do-jogo-double-jump/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>PodAbrir 16 &#8211; O Empreendedor</title>
		<link>http://abrindoojogo.com.br/podabrir-16-o-empreendedor</link>
		<comments>http://abrindoojogo.com.br/podabrir-16-o-empreendedor#comments</comments>
		<pubDate>Thu, 05 Apr 2012 07:43:23 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Negócios]]></category>
		<category><![CDATA[Pod-Abrir]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4289</guid>
		<description><![CDATA[Olá gurizada, No ar mais um episódio do PodAbrir, o seu podcast sobre desenvolvimento de games. Fechando o arco sobre profissões nos games, trazendo a &#8220;profissão&#8221; do empreendedor, o dono da empresa. Abordaremos neste episódio os desafios que alguém que deseja abrir uma empresa poderá encontrar. Para isso, tanto eu como Alessandro descreveremos nossa trajetória [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-4290" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2012/04/logo.jpg" alt="" width="150" height="187" />Olá gurizada,</p>
<p>No ar mais um episódio do PodAbrir, o seu podcast sobre  desenvolvimento de games. Fechando o arco sobre profissões nos games,  trazendo a &#8220;profissão&#8221; do empreendedor, o dono da empresa. Abordaremos neste episódio os desafios que alguém que deseja abrir uma empresa poderá encontrar. Para isso, tanto eu como Alessandro descreveremos nossa trajetória até ingressar na indústria de games.<strong></strong></p>
<p><span id="more-4289"></span></p>
<p><strong>Participantes</strong></p>
<div>
<ul>
<li>Everton Vieira</li>
<li>Alessandro Nörnberg</li>
</ul>
</div>
<div><strong>Categoria</strong></div>
<div>
<ul>
<li>Teórico: Negócio</li>
</ul>
</div>
<p><strong>Links comentados neste episódio</strong></p>
<div>
<ul>
<li><a href="http://forum.abrindoojogo.com.br/" target="_blank">Fórum Abrindo o Jogo</a>.  <strong>Cadastre-se</strong></li>
<li><a href="http://www.scirra.com/" target="_blank">Construct 2</a> &#8211; artigos sobre o desempenho <a href="http://www.scirra.com/blog/58/html5-2d-gaming-performance-analysis" target="_blank">aqui</a> e <a href="http://www.scirra.com/blog/59/construct-2-vs-gamemaker-vs-gamesalad-vs-stencyl" target="_blank">aqui</a>.</li>
</ul>
<div><strong>O Save foi para: </strong></div>
<div>
<ul>
<li>Bárbara Bueno, a primeira a receber 2 Saves do AoJ <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
</div>
<ul></ul>
<p><strong>Trilha Sonora</strong></p>
</div>
<div>
<ul>
<li>Detroid Rock City &#8211; <a href="http://www.kissonline.com/" target="_blank">Kiss</a></li>
</ul>
<p><strong>PodCast</strong></p>
<ul>
<li>Siga o nosso podcast em <a href="../feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>.</li>
<li>Para o Itunes, acesse a <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en" target="_blank">store aqui</a>.</li>
</ul>
</div>
<p><a href="http://www.facebook.com/abrindoojogo" target="_blank">Visitem nossa página no Facebook</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-16-o-empreendedor/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/4289/0/PodAbrir16.mp3" length="62268071" type="audio/mpeg" />
		<itunes:duration>1:04:46</itunes:duration>
		<itunes:subtitle>Olá gurizada,
No ar mais um episódio do PodAbrir, o seu podcast sobre  desenvolvimento de games. Fechando o arco sobre profissões nos games,  trazendo a &#8220;profissão&#8221; do empreendedor, o dono da empresa. Abordaremos neste episódio os desafi[...]</itunes:subtitle>
		<itunes:summary>Olá gurizada,
No ar mais um episódio do PodAbrir, o seu podcast sobre  desenvolvimento de games. Fechando o arco sobre profissões nos games,  trazendo a &#8220;profissão&#8221; do empreendedor, o dono da empresa. Abordaremos neste episódio os desafios que alguém que deseja abrir uma empresa poderá encontrar. Para isso, tanto eu como Alessandro descreveremos nossa trajetória até ingressar na indústria de games.

Participantes


Everton Vieira
Alessandro Nörnberg


Categoria


Teórico: Negócio


Links comentados neste episódio


Fórum Abrindo o Jogo.  Cadastre-se
Construct 2 &#8211; artigos sobre o desempenho aqui e aqui.

O Save foi para: 


Bárbara Bueno, a primeira a receber 2 Saves do AoJ  



Trilha Sonora



Detroid Rock City &#8211; Kiss

PodCast

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


Visitem nossa página no Facebook</itunes:summary>
		<itunes:keywords>Negócios, Pod-Abrir</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
		<item>
		<title>Conselhos para o desenvolvedor iniciante</title>
		<link>http://abrindoojogo.com.br/conselhos-para-o-desenvolvedor-iniciante</link>
		<comments>http://abrindoojogo.com.br/conselhos-para-o-desenvolvedor-iniciante#comments</comments>
		<pubDate>Fri, 30 Mar 2012 05:54:53 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[Teórico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4248</guid>
		<description><![CDATA[Que conselho você daria para o aspirante a desenvolvedor de jogos? Essa pergunta foi feita pelo site Design 3 a vários profissionais da indústria em suas entrevistas, ao longo de um ano, e a resposta de todos foi compilada em um único vídeo. Neste post comentamos estes conselhos, acrescentando nossa opinião pessoal, porque são dicas [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-4264" style="margin-left: 5px; margin-right: 5px;" title="Conselhos" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/Conselhos-150x150.png" alt="" width="150" height="150" /></p>
<p>Que conselho você daria para o aspirante a desenvolvedor de jogos? Essa pergunta foi feita pelo site Design 3 a vários profissionais da indústria em suas entrevistas, ao longo de um ano, e a resposta de todos foi compilada em um único vídeo.</p>
<p>Neste post comentamos estes conselhos, acrescentando nossa opinião pessoal, porque são dicas tão importantes que nunca é demais lembrá-las.</p>
<p><span id="more-4248"></span></p>
<p>Aqui no Abrindo o Jogo já demos vários conselhos para os desenvolvedores iniciantes, seja em posts específicos, seja em comentários no PodAbrir. Nosso objetivo é sempre o de passar nossa experiência e as boas práticas que coletamos ao longo do tempo para facilitar o trabalho daqueles que estão iniciando agora. Porque sabemos que não é um caminho fácil&#8230;</p>
<p>Alguns dias atrás me deparei com um vídeo onde o site <a href="http://www.design3.com/" target="_blank">Design 3</a> juntou os conselhos de vários profissionais da área, coletados ao longo de um ano em entrevistas para o site. Não foi surpresa ver que os conselhos são muito parecidos com os que damos aqui. Um material realmente interessante e, acredito, motivador.</p>
<p>Sendo assim, achei interessante compartilhas, e comentar, os principais conselhos neste post. E recomendo, claro, que assistam o vídeo na íntegra (o link está no final do post).</p>
<p>Os dois principais conselhos, que aliás nunca cansaremos de martelar aqui no AoJ, são: comece logo e comece pequeno. Pela quantidade de profissionais que dão estes mesmos conselhos, você pode ter certeza que são os conselhos mais válidos que alguém pode lhe dar nessa área.</p>
<h2>Comece logo!</h2>
<p><em>Will Wright (Stupid Fan Club), Ricky Hagget e Richard Hogg (Hohokum), Jesse Schell (Schell Games), Robin Hunicke (thatgamecompany), Ian Dicarlo e David Payne (UAT), Alex Schwartz (Owlchemy Labs), David Helgason (Unity), John Petters e Peter Hunter (Team Krinoid), Matt Rix (Magicule), Alex Neuse (Gaijin Games), Rod Humble (Linden Lab), Kyle Reden (Warden of Raal), Brian Provinciano (Retro City Rampage)</em></p>
<p>Começe já a fazer um jogo. Faça um nas próximas 48 horas. Sério, se você nunca fez um jogo completo, precisa urgentemente fazer um &#8211; nada de ficar uma semana ajustando o game engine, projetando o level design ideal, embelezando o código ou pensando qual o melhor padrão de projeto aplicar. Seu primeiro projeto não tem que ser grande ou legal &#8211; ele tem que ser&#8230; feito. Inteiro. Jogável. Termine de ler este post e faça um jogo.</p>
<p>Não há desculpas para adiar. Baixe o <a href="http://www.scirra.com/" target="_blank">Construct2</a>, <a href="http://www.yoyogames.com/gamemaker/" target="_blank">Game Maker</a>, <a href="http://www.anscamobile.com" target="_blank">Corona</a> ou mesmo <a href="http://unity3d.com/unity/" target="_blank">Unity</a>. Outra opção para iniciar é juntar-se a uma comunidade de modders e trabalhar em um mod para um jogo existente. Não fique pensando &#8220;e se&#8230;&#8221;. Não pense muito &#8211; apenas faça. Isso é importante: termine algo. Pode ser o pior jogo da sua vida, pode ser apenas um protótipo jogável &#8211; mas será inteiramente feito por você e isso é um primeiro passo importante.</p>
<p>E não faça apenas um, faça vários. Experimente mecânicas diferentes, técnicas diferentes. E passe para outras pessoas jogarem. Você aprenderá muito sobre o que funciona ou não, com estas experiências.</p>
<p>O mesmo vale para quando montar uma equipe: façam um jogo simples, qualquer, mas que lhes dê a visão completa do processo, do fluxo de trabalho, das ferramentas necessárias. É incrível como isso pode ser mais importante do que o puro conhecimento técnico.</p>
<h2>Comece pequeno!</h2>
<p><em>Michael Allar e Zach Lehman (Emotional Robots Inc), Notch (Mojang), Andrew Maul e Kyle Brannon (UAT), Joe Robins (Unity), Dave Traeger e Scott Reismanis (Desura), Alex Quicke (Depth), Edmund McMillen (Team Meat)</em></p>
<p>Comece pequeno. Seu primeiro jogo não vai ser o próximo grande jogo da indústria &#8211; ele vai ser um dentre muitos projetos pequenos que você vai realizar em uma etapa de aprendizado. Não estou dizendo para desistir do seu sonho de um jogo grandioso. Pelo contrário, quero apenas dizer qual a melhor forma de você torná-lo realidade: não é começando por ele! Fazendo muito projetos pequenos (pequenos mesmo, coisa de uma semana, um mês no máximo), você vai entender as dificuldades do processo e se preparar melhor para &#8220;aquele&#8221; seu projeto dos sonhos.</p>
<p>Esteja preparado para errar, porque você vai errar. Muito. Projetos pequenos permitem aprender facilmente com os erros, podem ser refeitos do zero se preciso. Em um projeto grande, se um erro te leva de volta à prancheta, é muito provável que você desista se ainda não estiver devidamente preparado.</p>
<h2>Invista naquilo em que você é melhor!</h2>
<p><em>Niv Fisher (SpirySnail Games), Chris Hazard (Hazardous Software), Nateon Ajello (Mixamo), Ryan Arndt (IGDA), Charlie Cleveland (Unknown Worlds Entretainment)</em></p>
<p>Faça aquilo no qual você é melhor, aquilo que gosta, aquilo que sabe mais. Procure ser o melhor possível nisso.</p>
<p>Esse conselho tem dois lados: primeiro, diz respeito à começar pela tecnologia que você conhece. Seu objetivo pode ser fazer jogos para iOS e Android, mas se o que você domina é programação em C para Windows, comece por aí. Se você é novo na área de jogos e também no Android, por exemplo, estará aprendendo duas coisas novas ao mesmo tempo e isso pode dificultar tudo. A experiência adquirida em fazer um jogo vai muito além da linguagem ou plataforma utilizada. Entendendo o processo como um todo, em uma tecnologia conhecida, será mais fácil aprender depois uma tecnologia nova.</p>
<p>Por outro lado, faça algo baseado naquilo que talvez você conheça e outros não &#8211; isso permitirá a você fazer algo diferente, único, que chame atenção. Depois de alguns protótipos você certamente vai achar uma área na qual vai se destacar: IA, efeito gráficos, mecânicas inovadoras, game design, roteiro, etc. Ache a aquela área pelo qual você é mais apaixonado e invista nela, em projetos que mostrem o quanto domina ela. Esta é uma indústria bastante concorrida e se você não almejar sempre ser o melhor, pelo menos em uma área específica, ficará para trás.</p>
<h2>Conheça o processo completo!</h2>
<p><em>Caitlyn Meeks (Unity)</em></p>
<p>Aprenda de tudo um pouco. Certamente você vai dominar muito uma coisa ou duas, mas deve conhecer todas as outras. Por isso é tão importante você fazer projetos pequenos mas completos no início da sua carreira. Conheça ferramentas, entenda um pouco de arte (se você é programador) ou um pouco de lógica (se você é artista).</p>
<h2>Estude, capacite-se!</h2>
<p><em>Dan Adams (Unity), Mathieu Mazerolle (Autodesk)</em></p>
<p>Estude. Vá para faculdade&#8230; ou não, mas estude o quanto puder. A capacitação é, e sempre será, a escada para alcançar os patamares mais altos.</p>
<h2>Torne-se conhecido!</h2>
<p><em>Mathieu Mazerolle (Autodesk), Marc Mencher (Game Recruiter)</em></p>
<p>Conheça pessoas e faça-se conhecer. Desenvolver suas habilidades e não mostrar isso para ninguém não leva a lugar nenhum. Não são as suas habilidades que te fazem progredir. São as outras pessoas. Lembre-se disso. São as outras pessoas que vão lhe dar emprego, financiar seu projeto e, em última instância, comprar seu jogo. Então, vá a eventos, participe de comunidades on-line, contribua para outros projetos e exercite muito sua capacidade de se comunica &#8211; principalmente de forma escrita.</p>
<h2>Poupe!</h2>
<p><em>Thomas Grip (Frictional Games), Mark Essen (Nidhogg), Mircea Marghidanu e Chris Migleo (Unity)</em></p>
<p>Poupe, não gaste dinheiro se não for realmente necessário. Temos muitas opções de ferramentas gratuitas hoje em dia: use-as. Se montar uma equipe, mantenha ela pequena e não contrate ninguém. Procure juntar apenas pessoas comprometidas com o projeto, que trabalhem voluntariamente. Seus primeiros projetos podem não dar retorno financeiro, então não invista diretamente neles. Invista em capacitação.</p>
<h2>Conclusão</h2>
<p>Se eu tivesse recebido estes conselhos na minha época de iniciante (bons anos atrás) e tivesse acesso à informação e ferramentas que temos hoje, teria passado muito, muito menos trabalho&#8230; Por isso meu último conselho é: aproveitem estes conselhos!</p>
<p>Quanto mais você puder aprender com quem já está na área, melhor. Se por um lado hoje a disponibilidade de informação e tecnologias facilita a entrada na indústria de jogos, por outro lado facilita para todos, ou seja, a concorrência é grande. Então a dedicação, a capacitação e a experiência adquirida na prática é que ditarão a diferença entre os novos profissionais.</p>
<p>Abaixo o link para o vídeo (em inglês):</p>
<ul>
<li><a href="http://www.design3.com/industry-insight/item/2406-advice-for-aspiring-game-developers" target="_blank">Assista o vídeo na Design 3</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/conselhos-para-o-desenvolvedor-iniciante/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<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>PodAbrir 15 &#8211; Game Designer</title>
		<link>http://abrindoojogo.com.br/podabrir-15-game-designer</link>
		<comments>http://abrindoojogo.com.br/podabrir-15-game-designer#comments</comments>
		<pubDate>Thu, 22 Mar 2012 02:51:02 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[Pod-Abrir]]></category>
		<category><![CDATA[Projeto de Jogo]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4165</guid>
		<description><![CDATA[Olá pessoal, No ar mais um episódio do PodAbrir, o seu podcast sobre desenvolvimento de games. Continuando o arco sobre profissões nos games, finalmente o tão esperado Game Designer, profissão abordada em uma entrevista com Cassiano Canheti, Lead Game Designer da Hoplon Infotainment. Como todos devem saber, essa é a empresa criadora do jogo Taikodom, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-4200" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/logo4.jpg" alt="" width="156" height="195" />Olá pessoal,</p>
<p>No ar mais um episódio do PodAbrir, o seu podcast sobre desenvolvimento de games. Continuando o arco sobre profissões nos games, finalmente o tão esperado Game Designer, profissão abordada em uma entrevista com Cassiano Canheti, Lead Game Designer da Hoplon Infotainment. Como todos devem saber, essa é a empresa criadora do jogo Taikodom, hoje o maior projeto brasileiro da área.</p>
<p>Uma entrevista imperdível para quem quer ficar por dentro desta, que é uma das profissões mais importantes da área.</p>
<p><span id="more-4165"></span></p>
<p><img title="More..." src="http://abrindoojogo.com.br/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<div><strong>Participantes</strong></div>
<div>
<ul>
<li>Everton Vieira</li>
<li>Alessandro Nörnberg</li>
<li>Cassiano Canheti</li>
</ul>
</div>
<div><strong>Categoria</strong></div>
<div>
<ul>
<li>Teórico: Game Design</li>
</ul>
</div>
<p><strong>Links comentados neste episódio</strong></p>
<div>
<ul>
<li><a href="http://forum.abrindoojogo.com.br/" target="_blank">Fórum Abrindo o Jogo</a>.  <strong>Cadastre-se</strong></li>
<li><a href="http://www.hoplon.com/" target="_blank">Site da Hoplon</a></li>
<li><a href="http://www.taikodom.com.br/" target="_blank">Site do Taikodom</a></li>
<li>Livros
<ul>
<li><a href="http://compare.buscape.com.br/proc_unico?id=3482&amp;kw=arte+game+design" target="_blank">A Arte de Game Design: O Livro Original</a></li>
<li><a href="http://www.theoryoffun.com/" target="_blank">A Theory of Fun</a></li>
<li><a href="http://www.amazon.com/Game-Design-Workshop-Second-Playcentric/dp/0240809742" target="_blank">Game Design Workshop</a></li>
<li><a href="http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&amp;field-keywords=Game+Development+Essentials&amp;x=0&amp;y=0" target="_blank">Game Development Essentials</a></li>
<li><a href="http://www.gamasutra.com/" target="_blank">Site Gamesutra</a></li>
<li><a href="http://www.gdmag.com/" target="_blank">Game Developer Magazine</a></li>
</ul>
</li>
</ul>
<p><strong>Trilha Sonora</strong></p>
</div>
<div>
<ul>
<li>It&#8217;s My Life &#8211; <a href="www.bonjovi.com" target="_blank">Bon Jovi</a></li>
</ul>
<p><strong>PodCast</strong></p>
<ul>
<li>Siga o nosso podcast em <a href="../feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>.</li>
<li>Para o Itunes, acesse a <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en" target="_blank">store aqui</a>.</li>
</ul>
</div>
<p><a href="http://www.facebook.com/abrindoojogo" target="_blank">Visitem nossa página no Facebook</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-15-game-designer/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/4165/0/PodAbrir15.mp3" length="53591722" type="audio/mpeg" />
		<itunes:duration>0:55:44</itunes:duration>
		<itunes:subtitle>Olá pessoal,
No ar mais um episódio do PodAbrir, o seu podcast sobre desenvolvimento de games. Continuando o arco sobre profissões nos games, finalmente o tão esperado Game Designer, profissão abordada em uma entrevista com Cassiano Canheti, Lead Ga[...]</itunes:subtitle>
		<itunes:summary>Olá pessoal,
No ar mais um episódio do PodAbrir, o seu podcast sobre desenvolvimento de games. Continuando o arco sobre profissões nos games, finalmente o tão esperado Game Designer, profissão abordada em uma entrevista com Cassiano Canheti, Lead Game Designer da Hoplon Infotainment. Como todos devem saber, essa é a empresa criadora do jogo Taikodom, hoje o maior projeto brasileiro da área.
Uma entrevista imperdível para quem quer ficar por dentro desta, que é uma das profissões mais importantes da área.


Participantes


Everton Vieira
Alessandro Nörnberg
Cassiano Canheti


Categoria


Teórico: Game Design


Links comentados neste episódio


Fórum Abrindo o Jogo.  Cadastre-se
Site da Hoplon
Site do Taikodom
Livros

A Arte de Game Design: O Livro Original
A Theory of Fun
Game Design Workshop
Game Development Essentials
Site Gamesutra
Game Developer Magazine



Trilha Sonora



It&#8217;s My Life &#8211; Bon Jovi

PodCast

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


Visitem nossa página no Facebook</itunes:summary>
		<itunes:keywords>Pod-Abrir</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
		<item>
		<title>Inteligência Artificial nos Games – Mais Aplicações</title>
		<link>http://abrindoojogo.com.br/inteligencia-artificial-nos-games-%e2%80%93-mais-aplicacoes</link>
		<comments>http://abrindoojogo.com.br/inteligencia-artificial-nos-games-%e2%80%93-mais-aplicacoes#comments</comments>
		<pubDate>Tue, 20 Mar 2012 13:34:59 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Inteligência Artificial]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4161</guid>
		<description><![CDATA[Olá gurizada, Apesar da semana ter iniciado bastante corrida aqui na empresa, promessa é promessa, e eu não podia deixar os queridos, e interessados, leitores na mão. Sendo assim, trago para vocês o terceiro post do arco sobre Inteligência Artificial nos Jogos.  O conteúdo de hoje dá continuidade as aplicações das técnicas de I.A. nos [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-4180" title="logo3" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/logo3.jpg" alt="" width="191" height="156" />Olá gurizada,</p>
<p>Apesar da semana ter iniciado bastante corrida aqui na empresa, promessa é promessa, e eu não podia deixar os queridos, e interessados, leitores na mão. Sendo assim, trago para vocês o terceiro post do arco sobre Inteligência Artificial nos Jogos.  O conteúdo de hoje dá continuidade as aplicações das técnicas de I.A. nos mais diversos gêneros de games. O post deu um pouco de trabalho, mas acho que o esforço é merecido. O pessoal está partipando e mostrado-se bastante curioso sobre o tema.</p>
<p>Vamos lá!</p>
<p><span id="more-4161"></span></p>
<h3><img class="alignleft size-full wp-image-4178" title="17807-monkey-island-madness-dos-screenshot-note-the-updated-interface" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/17807-monkey-island-madness-dos-screenshot-note-the-updated-interface.gif" alt="" width="200" height="123" />Gênero: Adventure</h3>
<p>O Adventure coloca o jogador no papel do herói, ou heróis, da história. Este estilo normalmente exige habilidades para a resolução de quebra-cabeças e enigmas. Ele foi consagrado nos anos 90 pelos excelentes títulos da Lucas Arts. Afinal, quem não lembra de The Secreat of Monkey Island ou o engraçado Full Throttle?</p>
<p><strong>Sistemas de Script</strong></p>
<p>Esta técnica é uma das minhas preferidas para este gênero. Os adventures, principalmente os clássicos baseados em  point and click, possuem a jogabilidade bastante amarrada ao enredo. Desta forma, o fluxo da ação assemelha-se muito a um script de filme, com personagens agindo em uma ordem cronológica previamente definida.</p>
<p>Recentemente, participei de um projeto onde recebi a missão de projetar um editor para &#8220;roteiros&#8221; de personagens em um jogo. O conhecimento de I.A., e principalmente da técnica de Sistemas de Script, foi fundamental para realizar esta tarefa. Com o editor em mãos, o  Game Designer, ou Level Designer, foi capaz de definir as falas e ações de cada personagem diretamente em um arquivo XML. Em seguida, o motor do jogo analisava estas informações, criando as regras e tarefas para cada NPC.</p>
<p>Foi um projeto muito interessante que proporciou um gande ganho em produtividade para a equipe. Além disso, esta técnica somada a outras como FSM e Sistema de Mensagens, proporciona uma excelente experiência para o jogador.</p>
<h3><img class="alignleft size-full wp-image-4179" title="Super-Mario-Land" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/Super-Mario-Land.jpg" alt="" width="201" height="129" />Gênero: Plataforma</h3>
<p>Sucesso desde a década de 80, os games de plataforma bidimensionais são característicos por apresentarem uma perspectiva lateral do ambiente. Com a evolução dos consoles, vieram os gráficos em 3 dimensões, criando uma nova variação para o gênero. Mesmo com franquias de sucesso como Mário Galaxy, a jogabilidade em duas dimensões ainda é popular e divertida.</p>
<p><strong>Máquinas de Estados Finitos</strong><br />
Por questões de simplicidade, a maioria dos inimigos segue comportamentos padrões básicos,  movimentam-se em uma direção até encontrar um obstáculo &#8211; nesta caso, invertem a posição e reiniciam o procedimento. Para jogos de plataforma, a implementação da técnica de FSM também é simplificada.<br />
<strong> </strong></p>
<p><strong> Sistema de Mensagens</strong><br />
O estilo puzzle de grande parte dos jogos de plataforma, é um prato cheio para a utilização de mensagens e eventos. Elas são utilizadas normalmente para notificar inimigos ou elementos do ambiente sobre mudanças no estado do jogo ou a presença do player.</p>
<p><strong>Data Driven System (Sistema baseado em dados)</strong><br />
A movimentação da câmera para jogos de plataforma tridimensionais normalmente torna-se bastante complexa  (quem jogou <a href="http://pt.wikipedia.org/wiki/The_Simpsons_Game">The Simpsons Game</a>, sabe do que estou falando). Consequentemente, caminhos pré-definidos podem ser construídos através de um editor de níveis, caso nenhuma solução algorítmica seja adequada.<br />
<strong> </strong></p>
<p><strong> </strong></p>
<h3><img class="alignleft size-full wp-image-4181" title="zidane-international-super-star-soccer" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/zidane-international-super-star-soccer.jpg" alt="" width="198" height="147" />Gênero: Esporte</h3>
<p>Este gênero é característico por emular a prática de esportes como futebol, vôlei, basquete, hockey, entre vários outros.  A grande maioria enfatiza a prática do esporte do ponto de vista do atleta, enquanto outros apresentam uma visão mais estretégica do ponto de vista do técnico ou treinador.</p>
<p><strong>Máquinas de Estados Fuzzy (FFSM)<br />
</strong></p>
<p>Todos os jogos desse gênero seguem um conjunto de regras, e a estrutura da IA dentro dessas regras é normalmente baseada em estados. Por exemplo, o time pode ter uma estratégia se o estado é &#8220;Vencendo&#8221;, outra se for &#8220;Empatando&#8221;, ou até uma estratégia complexa, se for &#8220;Perdendo a Final do Campeonato, Restando 10 min&#8221;. Porém, a transição para estes estados não pode ser precisa. Ai que entra a lógica fuzzy, tornando as decisões a serem tomadas propositalmente não tão claras e evidentes, apresentando um certo grau de incerteza e realismo ao jogador.</p>
<p><strong> Data-Driven System</strong><br />
Com uma grande quantidade de jogadores, dados estatísticos e animações,  jogos de esporte contam com várias ações baseadas em dados pré definidos. Entre as mais populares, estão as animações de movimento e estatísticas de cada jogador.</p>
<p><strong>Sistema de Mensagens</strong><br />
Partindo da realidade que jogadores reais de futebol comunicando-se durante o jogo, faz total sentido utilizar um sistema de mensagens para montar a estratégia do time. Entre os exemplos de aplicação, posso citar o zagueiro que informa aos companheiros  que está partindo para uma jogada de contra-ataque. Em resposta a esta informação, outro jogador pode &#8220;cobrir&#8221; a defesa.</p>
<h3><img class="alignleft size-full wp-image-4182" title="iPhone-games-Gran-Turismo-5" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/iPhone-games-Gran-Turismo-5.jpg" alt="" width="200" height="112" />Gênero: Racing</h3>
<p>Esse gênero, nascido nos anos 80, coloca o jogador no controle de um veículo para disputar uma corrida contra outros competidores, ou às vezes, contra o tempo. Este gênero revolucionou a indústria de jogos em termos gráficos e de performance.</p>
<p><strong>Máquinas de Estados Finitos</strong><br />
Jogos de Corrida seguem geralmente uma mesma fórmula. São definidos pelas leis da física e possuem objetivos simples. Dessa forma, os estados de um jogo deste gênero seguem um fluxo comum (Largada, Corrida, Fora da Pista, Chegada).<br />
<strong> </strong></p>
<p><strong>Algoritmos Genéticos</strong></p>
<p>Alguns jogos de corrida possuem uma enorme quantidade de carros (Gran Turismo, por exemplo,  possui  500 modelos) e cada um exige uma forma peculiar de adaptação e manuseio do volante. Com essa realidade,  algumas empresas têm utilizado técnicas para automatizar a atividade de balanceamento através de uma simples aplicação de <a href="http://pt.wikipedia.org/wiki/Algoritmo_gen%C3%A9tico">algoritmo genético</a>, modificando os parâmetros de performance dos carros. Carros com diferentes atributos de dirigibilidades são combinados, gerando um terceiro. Isso é feito até que obtenha-se um bom resultado. Ao final, esses resultados são então armazenados e alimentam a lista de modelos do jogo.</p>
<h3><img class="alignleft size-full wp-image-4176" title="Street-Fighter-2" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/Street-Fighter-2.jpg" alt="" width="200" height="125" />Gênero: Luta</h3>
<p>Este gênero contempla um combate fechado entre dois lutadores que utlizam movimentos especiais para atingir e vencer o adversário. Bom, é difícil definir este gênero, conhece Street Fighter? Pois então, é isso ai <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Máquinas de Estados Finitos</strong><br />
Cada lutador em um jogo de luta possui seus movimentos mapeados em estados. Dependendo do estado do oponente (atacando, defendendo, recuando) o NPC irá efetuar uma estatégia de luta ou combinação de movimentos. Uma FSM pode atender à demanda da maioria dos jogos desse gênero. O mapeamento de estados é utilizado inclusive para os comandos do jogador. Se você já deu um &#8220;<em>hadouken</em>&#8221; saiba que ele também está dentro de uma FSM. Observe o autômato finito abaixo.</p>
<p><img class="aligncenter size-full wp-image-4195" title="AutomatoFinito" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/AutomatoFinito2.png" alt="" width="259" height="221" /></p>
<p>No diagrama acima, temos 4 círculos azuis, representando os estados &#8220;Baixo&#8221;, &#8220;Diagonal Inferior Direita&#8221;, &#8220;Frente&#8221; e &#8220;<em>Hadouken</em>&#8220;. Partindo de um estado inicial &#8211; representado pelo círculo preto &#8211; podemos interpretar a sequencia de comandos necessária para disparar o golpe. O processo inicia se o jogador pressionar a tecla para &#8220;Baixo&#8221;, fazendo a máquina se mover para o estado correspondente. Estando nesse estado, qualquer outro comando, que não seja o esperado, leva a máquina para o estado inicial novamente &#8211; indicado pelas setas vermelhas. Desta forma, se o jogador seguir corretamente a sequencia de teclas&#8230;</p>
<p><img class="aligncenter size-full wp-image-4177" title="street_fighterII1" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/street_fighterII1.jpg" alt="" width="302" height="197" /></p>
<address style="text-align: center;"><strong>Hadoukennnn</strong>!<br />
</address>
<p>Ufa, espero que tenham gostado do post de hoje. O assunto é um pouco complexo, mas fiz o possível para condensá-lo e facilitar o entendimento. E ai o que acharam? Já é possível ter uma visão geral da I.A nos games, conhecendo o conceitos das principais técnicas utilizadas pela indústria? Espero o comentário de vocês.</p>
<p>Não deixe de conferir as partes <a href="http://abrindoojogo.com.br/inteligencia-artificial-nos-games-conceito-e-historico">1</a> e <a href="http://abrindoojogo.com.br/inteligencia-artificial-nos-games-%E2%80%93-categorias-e-aplicacao">2</a>, pois nos próximos posts, partiremos para a prática. É isso mesmo, vamos implementar as principais técnicas descritas até o momento. Esteja preparado para desenvolver o seu primeiro algoritmo de <em>Path Finding</em>, o <strong>A Star</strong> (A*).</p>
<p>Até lá! <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/inteligencia-artificial-nos-games-%e2%80%93-mais-aplicacoes/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>PodAbrir na semana que vem</title>
		<link>http://abrindoojogo.com.br/podabrir-na-semana-que-vem</link>
		<comments>http://abrindoojogo.com.br/podabrir-na-semana-que-vem#comments</comments>
		<pubDate>Thu, 15 Mar 2012 12:51:51 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[Pod-Abrir]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=4150</guid>
		<description><![CDATA[Olá gurizada, Esta semana, especialmente, não teremos o nosso podcast. Mas não se preocupe, semana que vem voltamos com a periodicidade normal. Sendo assim, fique atento e não perca o próximo episódio com o tema Game Design. Nele entrevistamos Cassiano Canheti &#8211; Game Director da Hoplon, empresa responsável pelo audacioso projeto Taikodon. Para o pessoal [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-4151" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2012/03/logo1.jpg" alt="" width="145" height="229" />Olá gurizada,</p>
<p>Esta semana, <strong>especialmente</strong>, não teremos o nosso podcast. Mas não se preocupe, semana que vem voltamos com a periodicidade normal. Sendo assim, fique atento e não perca o próximo episódio com o tema Game Design. Nele entrevistamos <strong>Cassiano Canheti</strong> &#8211; Game Director da Hoplon, empresa responsável pelo audacioso projeto <a href="http://www.taikodom.com.br/">Taikodon</a>.</p>
<p>Para o pessoal que está voltando de &#8220;férias&#8221;, ou de um carnaval estendido, recomendamos os episódios de fevereiro sobre criação de persoangens 3D &#8211; uma entrevista muito bacana com Alessandro Lima &#8211; escritor e Lead Character Designer na empresa Aquiris Game Experience.</p>
<ul>
<li><a href="../podabrir-12-3d-character-design-parte-1">Episódio 12 &#8211; 3D Character Design parte 1</a></li>
<li><a href="../podabrir-13-3d-character-design-parte-2">Episódio 13 &#8211; 3D Character Design parte 2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-na-semana-que-vem/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>
	</channel>
</rss>

