<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title></title>
	<atom:link href="http://blog.abrindoojogo.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.abrindoojogo.com.br</link>
	<description>Desvendando os segredos de desenvolver jogos</description>
	<lastBuildDate>Wed, 04 Nov 2009 15:34:56 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='blog.abrindoojogo.com.br' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/66d0451c042068c1100202040ddc7beb?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title></title>
		<link>http://blog.abrindoojogo.com.br</link>
	</image>
			<item>
		<title>SBGames 2009, como foi?</title>
		<link>http://blog.abrindoojogo.com.br/2009/10/30/sbgames-2009-como-foi/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/10/30/sbgames-2009-como-foi/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 12:58:51 +0000</pubDate>
		<dc:creator>Everton Baumgarten</dc:creator>
				<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=952</guid>
		<description><![CDATA[Olá pessoal, como é de conhecimento de todos, há três semanas atrás aconteceu na cidade do Rio de Janeiro, o maior evento sobre desenvolvimento de games do País, o SBGames 2009. Infelizmente, o Abrindo o Jogo não pode participar presencialmente desta edição, fato este que não nos impediu de conferir o que ocorreu por lá. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=952&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/sbgames2009_01.jpg"><img class="alignleft size-full wp-image-956" title="sbgames2009_01" src="http://evertonbaumgarten.files.wordpress.com/2009/10/sbgames2009_01.jpg?w=200&#038;h=233" alt="sbgames2009_01" width="200" height="233" /></a>Olá pessoal, como é de conhecimento de todos, há três semanas atrás aconteceu na cidade do Rio de Janeiro, o maior evento sobre desenvolvimento de games do País, o SBGames 2009. Infelizmente, o Abrindo o Jogo não pode participar presencialmente desta edição, fato este que não nos impediu de conferir o que ocorreu por lá. Nesta série de posts, traremos as percepções de profissionais, oriundos de áreas distintas, sobre o evento. Começamos pelo prisma de uma educadora, Maria Isabel Timm, além de uma grande amiga, também a responsável pelo projeto <a href="http://blog.abrindoojogo.com.br/2009/10/03/desafios-e-aventuras-para-estudar-quimica-organica/">QuimGame</a> e esteve presente na edição deste ano. Vamos conferir &#8230;</p>
<p><span id="more-952"></span>O SBGames 2009, ocorrido no início de outubro, na PUC do Rio de Janeiro, consolidou a maturidade da produção de jogos educacionais no Brasil, não apenas pela qualidade das apresentações de projetos realizados por desenvolvedores das universidades e do setor privado, na trilha de cultura, mas pela presença oficial da Finep (Financiadora de Projetos), uma agência de fomento à pesquisa e inovação, do Ministério de Ciência e Tecnologia, que nos últimos dois anos financiou 13 projetos de produção de jogos educacionais. Desse conjunto, seis jogos, já finalizados, foram disponibilizados ao público, em um estande da Finep, o que permitiu integração direta com o público e com outros desenvolvedores. Além do estande, a Finep organizou uma mesa redonda, com a participação de representantes desses seis projetos, para que fossem discutidos itens relativos aos desafios de produção, às soluções encontradas, às necessidades futuras e as potencialidades de uso dos jogos educacionais.</p>
<p>Na mesa-redonda, entre outros temas, levantou-se a importância do aprendizado realizado por todas as equipes, que deborda o tema dos jogos, em direção a todas as questões teóricas, técnicas, pedaógicas, práticas e de gestão da tecnologia educacional contemporânea, que inevitavelmente caminha para a qualidade profissional, para a multiplicidade dos enfoques e usos integrados de jogos, vídeos, multimídia e ferramentas de comunicação, em projetos que aliam preocupações de ensino e de motivação dos alunos. Todos os grupos foram unânimes em dizer que a experiência prática do desenvolvimento de um jogo educacional obrigou-os a repensar certezas, exercitar a flexibilidade e, principalmente, buscar soluções inovadoras para dar conta das necessidades de produção, que são múltiplas, incluindo equipes, tecnologias, escolhas, dificuldades, etc.</p>
<p>Com o Edital que financiou o desenvolvimento dos jogos, a Finep conseguiu estabelecer uma massa crítica, dentro das universidades, que hoje consegue planejar e projetar jogos educacionais e seus usos, alguns dos quais estabeleceram uma relação madura e profícua com parceiros empresariais, para garantir a qualidade dos produtos finais, em termos gráficos, de funcionalidade dos sistemas, de jogabilidade e, principalmente, no caso desse tipo de produto, de conteúdo e seus tratamentos, de forma adequada às necessidades pedagógicas e cognitivas dos públicos aos quais se destinam. Este foi o caso do QUIMGAME, jogo desenvolvido por pesquisadores das Universidades Federal do Rio Grande do Sul (UFRGS), Federal de Ciências da Saúde de Porto Alegre (UFCSPA) e Instituto Federal de Educação Tecnológica Sul Rio Grandense (IF-Sul, de Pelotas/RS), com o valiosíssimo apoio da Gestum, empresa desenvolvedora de jogos educacionais, também de Pelotas. Uma das soluções tecnológicas adotadas pelo Quimgame, sugeridas pela Gestum, foi exatamente apostar na portabilidade do jogo, desenvolvido em Flash, para rodar, via internet, através de um LMS (plataforma de gestão de conteúdos, como o Moodle, onde está disponibilizado), sem exigência de placa de vídeo ou de um sistema mais robusto. Além disso, o Quimgame também foi muito bem recebido, porque seu conceito final (definido também com a ajuda da Gestum) foi o de uma plataforma de gestão de conteúdos multimídia, flexível, na qual os professores podem incluir seus materiais (textos, vídeos, animações, questões, etc.) e, futuramente, poderão inclusive criar novos desafios.</p>
<p>Enfim, além da chuva torrencial, que caracterizou esta edição do SBGames e deixou a Cidade Maravilhosa quase irreconhecível, durante os três dias do evento, os jogos educacionais certamente deverão ficar como uma marca do encontro, que já é uma tradição entre os desenvolvedores e amantes de jogos em geral, no Brasil. Infelizmente, a Finep ainda não tem nenhuma indicação concreta de continuidade do fomento, apesar de ter recebido várias sugestões a esse respeito, durante o evento e a mesa-redonta. Foi sugerido, inclusive, um edital de fomento à parceria empresa-universidade, como estratégia de consolidação do mercado de jogos educacionais, que, no Brasil, ainda é incipiente. Mas, por enquanto, não há nenhum indicativo nesse sentido.</p>
<pre>Maria Isabel Timm
</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/952/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/952/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/952/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/952/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/952/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/952/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/952/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/952/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/952/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/952/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=952&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/10/30/sbgames-2009-como-foi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9a1cec9473510986b8eb2eb64b7b2a2b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Everton Baumgarten</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/sbgames2009_01.jpg" medium="image">
			<media:title type="html">sbgames2009_01</media:title>
		</media:content>
	</item>
		<item>
		<title>Web Games &#8211; Um Mercado em Expansão</title>
		<link>http://blog.abrindoojogo.com.br/2009/10/23/webgames-um-mercado-em-expansao/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/10/23/webgames-um-mercado-em-expansao/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 23:18:25 +0000</pubDate>
		<dc:creator>Everton Baumgarten</dc:creator>
				<category><![CDATA[Mercado de Jogos]]></category>
		<category><![CDATA[Teórico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=927</guid>
		<description><![CDATA[Olá pessoal, hoje trago a vocês um tema que está recebendo um grande foco, sendo aclamado como a nova onda da indústria de jogos, estou falando dos WebGames ou Browser Games.
O termo define jogos que são disponibilizados através de um navegador, tendo como principal vantagem a facilidade de distribuição e o fato de não exigir [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=927&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/logo2.jpg"><img class="alignleft size-full wp-image-938" title="logo" src="http://evertonbaumgarten.files.wordpress.com/2009/10/logo2.jpg?w=200&#038;h=133" alt="logo" width="200" height="133" /></a>Olá pessoal, hoje trago a vocês um tema que está recebendo um grande foco, sendo aclamado como a nova onda da indústria de jogos, estou falando dos WebGames ou Browser Games.</p>
<p>O termo define jogos que são disponibilizados através de um navegador, tendo como principal vantagem a facilidade de distribuição e o fato de não exigir uma instalação do software em seu computador.</p>
<p>O que estaria por trás desta nova plataforma? Seria uma tecnologia promissora?</p>
<p><span id="more-927"></span></p>
<p>Em 1997 eles surgiram despretenciosos, eram jogos de forca, jogos da velha e da memória. Eram elaborados com a novidade em tecnologia na época, o Javascript. O tempo passou, as linguagens e navegadores evoluiram, com isto, uma nova linha de jogos emergiu,  representando uma nova geração no mercado. Contanto com projetos complexos e muito bem elaborados, os webgames atualmente são superiores a jogos de consoles da 5º geração (Playstation, Nintendo 64).</p>
<p>Uma pesquisa efetuada pela Abragames em 2008, mostra a consolidação deste nicho no Páis.</p>
<p style="text-align:center;">
<div id="attachment_933" class="wp-caption aligncenter" style="width: 478px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/pesquisa.png"><img class="size-full wp-image-933" title="pesquisa" src="http://evertonbaumgarten.files.wordpress.com/2009/10/pesquisa.png?w=468&#038;h=226" alt="Pesquisa Abragames 2008" width="468" height="226" /></a><p class="wp-caption-text">Pesquisa Abragames 2008</p></div>
<p>Mesmo reduzindo um pouco seu marketshare em 2008, devido a ascenção da nova geração no páis, o desenvolvimento de WebGames ainda representa o principal foco das empresas nacionais. Posso assegurar que isto não tem nada a ver com uma visão atrasada de nosso País em relação ao resto do mundo, pelo contrário, considero uma visão muito madura e adequada ao mercado.</p>
<p>Os WebGames podem ser organizados em duas categorias básicas, são elas:</p>
<ol>
<li><img title="Mais..." src="http://evertonbaumgarten.wordpress.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /><strong>Browser-based Game </strong>- Conhecidos também como Server-side Games, possuem o foco do processamento no servidor, utilizando tecnologias como PHP, ASP, Pearl, Python, Ruby e Java</li>
<li><strong>Plugin-based Game</strong>- Conhecidos também como Client-side Games, eles utilizam o processamento da máquina cliente através de plugins. Dentre as tecnologias mais importantes estão Java, Unity, Silver Light e Flash Player.</li>
</ol>
<p>A primeira categoria é representada hoje pelos famosos MMORPG da web. A fórmula de utilizar o navegador apenas como uma view, deixando para os servidores todo o gerenciamento do jogo, tem ganho novos seguidores a cada dia. Alguns exemplos deste metodologia seriam:</p>
<ul>
<li>Bite Fight &#8211; <a href="http://www.bitefight.com.pt/">http://www.bitefight.com.pt</a></li>
<li>Ikariam &#8211; <a href="http://ikariam.com.pt/">http://ikariam.com.pt</a></li>
<li>Kings Age &#8211; <a href="http://www.kingsage.com.br/">http://www.kingsage.com.br</a></li>
</ul>
<p>Mesmo com a ascenção e popularidade dos Browser Based Game, considero os jogos baseados em plugins mais promissores e evoluídos. Inclusive, na minha opinião, esta categoria representará logo uma nova era na indústria de games.</p>
<p>Podemos perceber facilmente o poder de processamento dos plugins evoluindo a cada ano. Dentre os disponíveis no mercado, chamo a atenção para o <a href="http://unity3d.com/"><strong>Unity 3D</strong></a>.</p>
<div id="attachment_936" class="wp-caption aligncenter" style="width: 478px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/gugatennisgillette.jpg"><img class="size-full wp-image-936" title="gugaTennisgillette" src="http://evertonbaumgarten.files.wordpress.com/2009/10/gugatennisgillette.jpg?w=468&#038;h=162" alt="gugaTennisgillette" width="468" height="162" /></a><p class="wp-caption-text">Guga Tennis e Gillette Yong Guns - Ambos desenvolvidos pela talentosa empresa gaúcha Aquiris</p></div>
<p>Porém, toda esta geração de games para a web responde por um nome, FlashPlayer. O plugin da Adobe está presente em 99% dos navegadores do mundo. Sua popularidade é sinônimo de visibilidade e facilidade de distribuição.</p>
<p>É notório que o player ganhou maturidade  com a compra da Macromedia pela Adobe. O mesmo ocorreu com sua linguagem nativa, o Action Script, atualmente na versão 3. Totalmente orietando a objetos, muito similar a Java, a linguagem demonstra estar bem robusta e profissional.</p>
<p>Temos ótimas perspectivas para esta tecnologia, destaco as mais importantes:</p>
<ul>
<li>A Adobe durante o MAX 2009, anunciou o Flash CS5, versão que possui como principal novidade a publicação de conteúdos para o IPhone. Com isto, a empresa aumenta ainda mais a portabilidade dos aplicativos desenvolvidos em Flash. O objetivo seria abranger sua tecnologia para os 30 milhões de usuários do Smart Phone da Apple. Além disto, através da Apple Store (agora contando com sua versão brasileira), os desenvolvedores Flash podem oferecer seus games de forma simples e eficiente.</li>
</ul>
<ul>
<li>Vocês já ouviram falar do <strong>Open Screen Project</strong>? Pois é, ele é um projeto da Adobe com várias outras empresas, entre elas NVidia e Google. Um dos objetivos seria proporcionar aceleração de hardware para o player -  é isto mesmo que vocês estão pensando&#8230; 3D de qualidade para a web.</li>
</ul>
<p>Estamos as vésperas de uma nova era para os web games. O Abrindo o Jogo estará acompanhando e compartilhando tudo sobre a tecnologia Flash aqui com vocês. Da mesma forma que o Alessandro representa a plataforma Java, eu estarei agora representando o Action Script aqui no site. Em breve, os primeiros tutoriais e posts sobre esta promissora tecnologia.</p>
<p>Um grande abraço, e até lá!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/927/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/927/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/927/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/927/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/927/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/927/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/927/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/927/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/927/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/927/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=927&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/10/23/webgames-um-mercado-em-expansao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9a1cec9473510986b8eb2eb64b7b2a2b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Everton Baumgarten</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/logo2.jpg" medium="image">
			<media:title type="html">logo</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/pesquisa.png" medium="image">
			<media:title type="html">pesquisa</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.wordpress.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" medium="image">
			<media:title type="html">Mais...</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/gugatennisgillette.jpg" medium="image">
			<media:title type="html">gugaTennisgillette</media:title>
		</media:content>
	</item>
		<item>
		<title>Comprando de Olhos Vendados</title>
		<link>http://blog.abrindoojogo.com.br/2009/10/14/comprando-de-olhos-vendados/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/10/14/comprando-de-olhos-vendados/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 02:25:57 +0000</pubDate>
		<dc:creator>Everton Baumgarten</dc:creator>
				<category><![CDATA[Game Arte]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=913</guid>
		<description><![CDATA[Olá pessoal, posso considerar esta, uma semana de várias novidades aqui no Abrindo o Jogo. Ontem tivemos a primeira participação de um leitor, o Luis Otávio, trazendo nosso primeiro tutorial, e hoje, com muita satisfação, dou as boas vindas ao mais novo membro da equipe Abrindo o Jogo &#8211; Samuel Salomão &#8211; grande amigo que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=913&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/logo1.jpg"><img class="alignleft size-full wp-image-920" title="logo" src="http://evertonbaumgarten.files.wordpress.com/2009/10/logo1.jpg?w=200&#038;h=175" alt="logo" width="200" height="175" /></a>Olá pessoal, posso considerar esta, uma semana de várias novidades aqui no Abrindo o Jogo. Ontem tivemos a primeira participação de um leitor, o Luis Otávio, trazendo nosso primeiro tutorial, e hoje, com muita satisfação, dou as boas vindas ao mais novo membro da equipe Abrindo o Jogo &#8211; Samuel Salomão &#8211; grande amigo que estará representando muito bem o lado artístico da indústria de games.</p>
<p>Vamos juntos acompanhar seu primeiro post.</p>
<p><span id="more-913"></span></p>
<p>Olá a todos, em primeiro lugar eu gostaria de agradecer a oportunidade de colaborar com o blog, o foco dos textos que apresentarei serão relacionados a questões visuais dos games e espero que essa experiência de troca de conhecimento contribua para o crescimento de todos nós!</p>
<p>Começarei esse texto com a seguinte provocação: O que nos faz optar por determinado jogo? Os gamers de hoje em dia podem ser considerados consumidores sortudos, pois é muito fácil informar-se sobre determinado título antes de adquiri-lo. É possível analisar reviews, screenshots, trocar idéia sobre games com jogadores de todas as nacionalidades e até mesmo experimentar demos jogáveis, tudo isso graças a internet, mas nem sempre foi assim. Há mais de vinte anos atrás, quando os cartuchos começaram a popularizar-se, quando esse tipo de informação não era tão acessível, como os gamers escolhiam seus títulos?</p>
<p>Nem sempre era possível testar os jogos antes de comprá-los, e é nesse ponto que as labels entram em ação. Para quem nunca ouviu o termo, labels são as etiquetas com ilustrações que são colados nos cartuchos ou estampadas em CD´s e DVD´s, juntamente com as “caixinhas dos games”. Era este o elemento responsável pelo apelo visual aplicado na mídia de distribuição dos jogos para atrair o público. A maior parte dos consumidores, na época, era formado por crianças, afinal, os títulos “adultos” como Burning Desire de 1982 e X-Men de 1983, realmente estavam em menor número. Com esse fator, o uso de belas ilustrações (ou não, como veremos mais adiante) eram importantes para escolha do game a ser comprado. Crianças geralmente são atraídas por elementos coloridos e divertidos ou que de alguma forma se identifiquem, como por exemplo, personagens conhecidos. Em virtude destes pontos, às vezes o consumidor acabava pagando pela ilustração e não pelo jogo.</p>
<p>Para exemplificar esta visão posso citar a versão do cartucho que conheci na época, Superman o  jogo. Lançado para consoles da Atari em 1978, o game apresentava o label com uma ilustração do personagem voando no espaço, no melhor estilo HQ, porém a decepção foi imediata ao jogar o game, uma vez que este era extremamente desinteressante e confuso. Em nenhum momento, o personagem atuava no espaço, como sugeria a etiqueta.</p>
<div id="attachment_915" class="wp-caption aligncenter" style="width: 412px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/superman_1.jpg"><img class="size-full wp-image-915" title="Superman_1" src="http://evertonbaumgarten.files.wordpress.com/2009/10/superman_1.jpg?w=402&#038;h=221" alt="Superman o Jogo (ou quase isto)" width="402" height="221" /></a><p class="wp-caption-text">Superman o Jogo (ou quase isto)</p></div>
<p>Por outro lado havia o efeito inverso, labels muito ruins com jogos interessantes, como por exemplo, Pitfall: um dos clássicos criados para o console da Atari, era vendido aqui com uma terrível ilustração, parecendo mais um jogo do Mogli, o menino-lobo.</p>
<div id="attachment_916" class="wp-caption aligncenter" style="width: 403px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/pitfall_1.jpg"><img class="size-full wp-image-916" title="Pitfall_1" src="http://evertonbaumgarten.files.wordpress.com/2009/10/pitfall_1.jpg?w=393&#038;h=225" alt="Pitfall, o menino-lobo" width="393" height="225" /></a><p class="wp-caption-text">Pitfall, o menino-lobo</p></div>
<p>Este tipo de caso era bastante comum naquela época. Para mim, era claro que a preocupação com a estética do jogo como produto não era relevante para as distribuidoras de jogos, que pareciam acreditar que apenas o software e o fator diversão eram auto-suficientes para a venda dos cartuchos. O resultado disso é uma coleção vergonhosa de ilustrações que até hoje servem de referência para “o que não se deve fazer para vender um produto”.</p>
<p>Acredito que a grande lição disso é que devemos ter sempre claro que o produto final precisa apresentar uma boa aparência, mas ao mesmo tempo, também precisa cativar e ser honesto com o consumidor.</p>
<p>Imagens retiradas de : http://www.atariage.com</p>
<address>Autor: Samuel Salomão</address>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/913/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/913/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/913/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/913/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/913/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/913/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/913/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/913/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/913/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/913/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=913&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/10/14/comprando-de-olhos-vendados/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9a1cec9473510986b8eb2eb64b7b2a2b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Everton Baumgarten</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/logo1.jpg" medium="image">
			<media:title type="html">logo</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/superman_1.jpg" medium="image">
			<media:title type="html">Superman_1</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/pitfall_1.jpg" medium="image">
			<media:title type="html">Pitfall_1</media:title>
		</media:content>
	</item>
		<item>
		<title>Tutorial Game Maker: Olá Mundo &#8220;Interativo&#8221;</title>
		<link>http://blog.abrindoojogo.com.br/2009/10/12/tutorial-game-maker-ola-mundo-interativo/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/10/12/tutorial-game-maker-ola-mundo-interativo/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 19:19:15 +0000</pubDate>
		<dc:creator>Everton Baumgarten</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=886</guid>
		<description><![CDATA[Olá pessoal, é com grande prazer que contamos com a primeira participação de um leitor aqui no Abrindo o Jogo. O Luis Otávio nos enviou um tutorial base sobre o Game Maker. Muito interessante para quem quer iniciar no desenvolvimento de jogos de uma maneira fácil e intuitiva. Vamos conferir.

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

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/gamemakerlogo.gif" medium="image">
			<media:title type="html">GameMakerLogo</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/a.png" medium="image">
			<media:title type="html">Tela Inicial</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/b.png" medium="image">
			<media:title type="html">createSprite</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/c.png" medium="image">
			<media:title type="html">loadsprite</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/d.png" medium="image">
			<media:title type="html">createObject</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/e.png" medium="image">
			<media:title type="html">objectProperties</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/f.png" medium="image">
			<media:title type="html">seletorEventos</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/g.png" medium="image">
			<media:title type="html">listaTeclas</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/h.png" medium="image">
			<media:title type="html">propriedadeObjeto</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/i.png" medium="image">
			<media:title type="html">movedFixed</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/j1.png" medium="image">
			<media:title type="html">createRoom</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/l.png" medium="image">
			<media:title type="html">publicar</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/m.png" medium="image">
			<media:title type="html">propriedadeObjeto2</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/n.png" medium="image">
			<media:title type="html">collision</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/o.png" medium="image">
			<media:title type="html">collision2</media:title>
		</media:content>
	</item>
		<item>
		<title>Threads, apenas um exemplo</title>
		<link>http://blog.abrindoojogo.com.br/2009/10/08/threads-apenas-um-exemplo/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/10/08/threads-apenas-um-exemplo/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 01:43:30 +0000</pubDate>
		<dc:creator>Luiz Alessandro Nörnberg</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=862</guid>
		<description><![CDATA[Threads são partes de um programa que executam paralelamente. Com seu uso é possível executar simultâneamente duas ou mais rotinas. Atualmente, com o barateamento dos processadores de vários núcleos (multi core), seu uso fica mais justificado. Embora eu não recomende trabalhar com threads, convém entender o que elas representam na prática.
Antes de tudo vou ressaltar: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=862&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/threads.png"><img class="alignleft size-full wp-image-875" title="Threads" src="http://evertonbaumgarten.files.wordpress.com/2009/10/threads.png?w=200&#038;h=150" alt="Threads" width="200" height="150" /></a><em>Threads</em> são partes de um programa que executam paralelamente. Com seu uso é possível executar simultâneamente duas ou mais rotinas. Atualmente, com o barateamento dos processadores de vários núcleos (<em>multi core</em>), seu uso fica mais justificado. Embora eu não recomende trabalhar com <em>threads</em>, convém entender o que elas representam na prática.</p>
<p><span id="more-862"></span>Antes de tudo vou ressaltar: não recomendo trabalhar com <em>threads</em> a menos que seja o desenvolvimento de um jogo AAA, o qual não é foco deste site (digamos um Batman: Asilo Arkhan). Jogos assim, exigem intenso processamento de I.A., física e gráficos e possuem, em geral, muito dinheiro para serem feito. Isso justifica a utilização de uma forma de programação mais complexa. Ainda mais que estes jogos em geral são criados em C++, uma das piores linguagens para trabalhar com <em>threads</em>. Mesmo no Java, cujo uso é relativamente simples (como veremos abaixo), depurar um programa com <em>thread</em> é um inferno.</p>
<p>Além disso, projetar o código para tirar proveito de <em>threads</em> é tarefa para arquitetos competentes &#8211; caso contrário você vai criar um código complexo, difícil de depurar e manter e, provavelmente, vai cair em <em>dead locks</em> e outros problemas de concorrência . E ainda corre o risco de acabar com um código pouco eficiente, apesar do esforço adicional.</p>
<p>Fica então o aviso: o código abaixo serve para efeito de exemplo e não deve ser base para um jogo do mundo real.</p>
<p>Bom, se depois do que foi dito acima você ainda não desistiu de ler sobre <em>threads</em>, vamos em frente &#8211; o fato é que o conceito por trás delas, e sua correta utilização, são importantes para tirar todo proveito de uma CPU com múltiplos núcleos. Vamos ver como fazer isso com o <em>gameloop</em> desenvolvidos nos meus artigos anteriores. Se você não leu, filtre os posts pela tag <strong>Java </strong>e leia-os antes, ok?</p>
<h2>Modularizando o jogo</h2>
<p>Começo criando duas classes especializadas em atualizar a lógica do jogo (lembra do <em>update</em>?) e em atualizar a tela (lembra do <em>render</em>?). Chamarei elas de Controlador e Renderizador, respectivamente. Seu código está abaixo. Basicamente, eu tirei as rotinas update() e render() da minha classe do jogo e coloquei em classes separadas.</p>
<p><strong>Arquivo Controlador.java</strong></p>
<pre style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">package</span> abrindoojogo.exemplos.thread;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span></span><span style="color:#0000e6;">import</span> javax.swing.JFrame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> Controlador<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>    </span>Contador contador;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>    </span>JFrame frame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>    </span>Nave nave;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span>    </span><span style="color:#0000e6;">public</span> Controlador(JFrame frame, Contador contador, Nave nave)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">012</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">013</span>        </span><span style="color:#0000e6;">this</span>.frame = frame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">014</span>        </span><span style="color:#0000e6;">this</span>.contador = contador;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">015</span>        </span><span style="color:#0000e6;">this</span>.nave = nave;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">016</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">017</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">018</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> update()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">019</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">020</span>        </span>contador.contaPulso();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">021</span>        </span>nave.x += <span style="color:#000000;">1</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">022</span>        </span><span style="color:#0000e6;">if</span> (nave.x &gt; frame.getWidth() + <span style="color:#000000;">30</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">023</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">024</span>            </span>nave.x = <span style="color:#000000;">0</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">025</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">026</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">027</span></span>}</pre>
<p><strong>Arquivo Renderizador.java</strong></p>
<pre style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">package</span> abrindoojogo.exemplos.thread;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span></span><span style="color:#0000e6;">import</span> java.awt.Color;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span></span><span style="color:#0000e6;">import</span> java.awt.Graphics2D;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span></span><span style="color:#0000e6;">import</span> java.awt.image.BufferStrategy;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span></span><span style="color:#0000e6;">import</span> javax.swing.JFrame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> Renderizador<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>    </span>BufferStrategy bs;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span>    </span>Contador contador;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">012</span>    </span>JFrame frame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">013</span>    </span>Nave nave;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">014</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">boolean</span> terminado = <span style="color:#0000e6;">false</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">015</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">016</span>    </span><span style="color:#0000e6;">public</span> Renderizador(JFrame frame, BufferStrategy bs,<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">017</span>                        </span>Contador contador, Nave nave)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">018</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">019</span>        </span><span style="color:#0000e6;">this</span>.frame = frame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">020</span>        </span><span style="color:#0000e6;">this</span>.bs = bs;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">021</span>        </span><span style="color:#0000e6;">this</span>.contador = contador;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">022</span>        </span><span style="color:#0000e6;">this</span>.nave = nave;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">023</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">024</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">025</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> render()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">026</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">027</span>        </span>contador.contaFrame();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">028</span>        </span>Graphics2D g = (Graphics2D) bs.getDrawGraphics();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">029</span>        </span>g.setColor(Color.black);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">030</span>        </span>g.fillRect(<span style="color:#000000;">0</span>, <span style="color:#000000;">0</span>, frame.getWidth(), frame.getHeight());<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">031</span>        </span><span style="color:#0000e6;">int</span> x = nave.x;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">032</span>        </span><span style="color:#0000e6;">int</span> y = nave.y;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">033</span>        </span><span style="color:#0000e6;">for</span> (<span style="color:#0000e6;">int</span> i = <span style="color:#000000;">0</span>; i &lt; nave.qtd; i++)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">034</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">035</span>            </span>g.setColor(Color.yellow);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">036</span>            </span>g.drawLine(x, y, x - <span style="color:#000000;">20</span>, y - <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">037</span>            </span>g.drawLine(x, y, x - <span style="color:#000000;">20</span>, y + <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">038</span>            </span>g.drawLine(x - <span style="color:#000000;">20</span>, y - <span style="color:#000000;">5</span>, x - <span style="color:#000000;">20</span>, y + <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">039</span>            </span>y += <span style="color:#000000;">15</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">040</span>            </span><span style="color:#0000e6;">if</span> (y &gt; <span style="color:#000000;">550</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">041</span>            </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">042</span>                </span>y = nave.y;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">043</span>                </span>x += <span style="color:#000000;">15</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">044</span>            </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">045</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">046</span>        </span>g.setColor(Color.white);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">047</span>        </span>g.drawString(<span style="color:#ce7b00;">"Pulsos: "</span> + contador.getPulsosPorSegundo() +<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">048</span>                     </span><span style="color:#ce7b00;">"  Frames: "</span> + contador.getFramesPorSegundo() +<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">049</span>                     </span><span style="color:#ce7b00;">"          naves: "</span> + nave.qtd, <span style="color:#000000;">10</span>, <span style="color:#000000;">20</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">050</span>        </span>g.dispose();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">051</span>        </span>bs.show();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">052</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">053</span></span>}</pre>
<p>Veja que essas classes recebem &#8220;de fora&#8221;, no momento de sua construção, os objetos necessários para seu funcionamento. Ou seja, elas não possuem dados próprios, encapsulando apenas o algoritmo. Para que elas compartilhem os mesmos dados, criei também uma classe separada para armazenar os dados da nave:</p>
<p><strong>Arquivo Nave.java</strong></p>
<pre style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">package</span> abrindoojogo.exemplos.thread;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> Nave<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span>    </span><span style="color:#0000e6;">int</span> x;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span>    </span><span style="color:#0000e6;">int</span> y;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>    </span><span style="color:#0000e6;">int</span> qtd;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span></span>}</pre>
<p>A classe do jogo em sí é exatamente igual à classe JogoLoopSimples vista em um artigo anterior, só que sem update() e sem render() e com o <em>gameloop</em> modificado conforme abaixo:</p>
<pre style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> gameloop()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span>        </span>initialize();<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">004</span>        </span></span><span style="color:#ff0000;">Controlador c = new Controlador(this, contador, nave);
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">005</span>        Renderizador r = new Renderizador(this, bs, contador, nave);</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span>        </span><span style="color:#0000e6;">while</span> (<span style="color:#0000e6;">true</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>        </span>{<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">008</span>            </span></span><span style="color:#ff0000;">c.update();
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">009</span>            r.render();</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span>    </span>}</pre>
<p>Além disso, mais uma pequena modificação: ao sair do programa (pressionar ESC), envio para o console os dados de pulsos e frames, para registro. Isso é feito com um System.out.println() chamado na rotina keyPressed():</p>
<pre style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> keyPressed(KeyEvent e)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span>        </span><span style="color:#0000e6;">if</span> (e.getKeyCode() == KeyEvent.VK_ESCAPE)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span>        </span>{<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">005</span>            </span></span><span style="color:#ff0000;">System.out.println("Pulsos: " + contador.getPulsosPorSegundo() +
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">006</span>                                "  Frames: " + contador.getFramesPorSegundo() +
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">007</span>                                "          naves: " + nave.qtd);</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>            </span>System.exit(<span style="color:#000000;">0</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>        </span>...</pre>
<p style="text-align:left;">Executando o programa assim, temos o seguinte resultado:</p>
<p style="text-align:center;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/thread01a.png"><img class="size-full wp-image-864 aligncenter" title="Thread01a" src="http://evertonbaumgarten.files.wordpress.com/2009/10/thread01a.png?w=502&#038;h=214" alt="Thread01a" width="502" height="214" /></a></p>
<p style="text-align:center;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/thread01b.png"><img class="size-full wp-image-865 aligncenter" title="Thread01b" src="http://evertonbaumgarten.files.wordpress.com/2009/10/thread01b.png?w=279&#038;h=222" alt="Thread01b" width="279" height="222" /></a></p>
<p style="text-align:left;">Reconhece a tela? É o mesmo protótipo da nave dos outros posts. Mas perai&#8230; Uau! 460 fps! Não eram apenas 40! Como foi que ficou mais rápido?</p>
<p>Simples: troquei de máquina&#8230; Veja: essa é uma máquina bem mais rápida e tem um processador de dois núcleos como podemos ver no painel do gerenciador de tarefas. Note outra coisa também: apesar do jogo estar programado de forma a rodar o mais rápido possível (sem limitação de pulsos), ele utiliza apenas 50% do processamento da máquina. Nos gráficos pode-se ver claramente que o jogo está ocupando praticamente todo núcleo da esquerda, enquanto o da direita está ocioso (quase ocioso, na verdade, está atendendo o S.O. e processos de fundo, como o antivirus).</p>
<p>Abaixo da tela está a saída do console do NetBeans, mostrando o número de pulsos e frames registrados ao fechar o programa.</p>
<h2>A soma das partes</h2>
<p>Modifiquemos agora nosso gameloop <strong>comentando o update()</strong>. Assim vamos ver quantos frames conseguimos se eliminarmos o trabalho de atualizar a lógica do jogo.</p>
<p>A saída é a seguinte:</p>
<p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/thread02a.png"><img class="aligncenter size-full wp-image-866" title="Thread02a" src="http://evertonbaumgarten.files.wordpress.com/2009/10/thread02a.png?w=468&#038;h=199" alt="Thread02a" width="468" height="199" /></a></p>
<p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/thread02b.png"><img class="aligncenter size-full wp-image-867" title="Thread02b" src="http://evertonbaumgarten.files.wordpress.com/2009/10/thread02b.png?w=278&#038;h=222" alt="Thread02b" width="278" height="222" /></a>Veja que temos zero pulsos, já que update() nunca foi executada. Mas a quantidade de frames não mudou. Ou seja, o impacto de processamento da nossa lógica é muito pequeno. Vejamos o contrário. Vamos <strong>comentar o render()</strong>.</p>
<p>Resultado abaixo:</p>
<p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/thread03a.png"><img class="aligncenter size-full wp-image-868" title="Thread03a" src="http://evertonbaumgarten.files.wordpress.com/2009/10/thread03a.png?w=468&#038;h=199" alt="Thread03a" width="468" height="199" /></a><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/thread03b.png"><img class="aligncenter size-full wp-image-872" title="Thread03b" src="http://evertonbaumgarten.files.wordpress.com/2009/10/thread03b.png?w=278&#038;h=222" alt="Thread03b" width="278" height="222" /></a>Pois é, sem o render() não aparece a tela. Mas o programa está lá, rodando, como podemos ver pelo processamento. Ao pressionar ESC basta olhar para a saída para ver a quantidade de pulsos e&#8230; Caraca! Mais de três milhões e meio de pulsos por segundo! Realmente, a parte (bem) mais pesada é a atualização da tela. A atualização da lógica (nesse caso, pelo menos) é tão efêmera que esse computador consegue realizar mais de 3.000.000 em um segundos contra apenas 460 atualizações da tela no mesmo tempo.</p>
<h2>Analisando os resultados, entram as Threads</h2>
<p>A primeira coisa importante é ver como o render() segura o jogo quando usamos esse tipo de <em>gameloop</em>, que é o mais simples. A cada volta do laço temos um update() (muito rápido) e um render(), que demora e faz com que o próximo update() acabe demorando a ser executado.</p>
<p>Mas o que conta para este post é o seguinte: reveja as imagens acima e preste atenção no processamento. Ele nunca passa de 50%. Ou seja, meu jogo não está tirando tudo da minha máquina nova! Praticamente ele só usa o núcleo da esquerda, enquanto o outro fica com pouco processamento, oriundo das tarefas do sistema. Isso é bom, na verdade. Mas e se eu precisasse de mais processamento? Teria uma forma de usar o outro núcleo? Tem sim, com <em>threads</em>.</p>
<p>Você sabe que o S.O. é multitarefa, ou seja, executa vários programas ao mesmo tempo. Você pode ver um vídeo e ouvir música ao mesmo simultâneamente, porque o S.O dá um pouco de processador para o vídeo e um pouco para a música. É a mesma CPU, porém dividida entre dois programas.</p>
<p>Se tem mais de uma CPU (mais de um núcleo, como na máquina acima), o S.O. pode dar um núcleo inteiro para o vídeo e o outro núcleo para a música, ao invés de dividir a mesma CPU. Isso torna as coisas mais ágeis ainda.</p>
<p>As <em>threads</em> permitem ter esta multitarefa dentro do mesmo programa. Por exemplo, você cria uma <em>thread</em> para carregar os dados do jogo e outra para rodar uma animação. Assim, o S.O. dá um pouco de processamento para cada uma,  e o resultado é que você pode mostrar uma animação enquanto os dados são carregados.</p>
<p>A modificação que faço a seguir no código vai permitir colocar o Controlador em uma <em>thread</em> e o Renderizador em outra, de forma a executarem paralelamente e, de quebra, rodar cada um em um núcleo, utilizando todo o poder da máquina. Se o render() sozinho dá 460 frames e update(), também sozinho, dá 3.000.000, agora deverei obter o jogo rodando simultâneamente com 3.000.000 pulsos e 460 frames.</p>
<p>Vamos ver se funciona:</p>
<pre style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> Controlador <span style="color:#ff0000;">implements Runnable</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span>    </span>Contador contador;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span>    </span>JFrame frame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span>    </span>Nave nave;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>    </span><span style="color:#0000e6;">public</span> Controlador(JFrame frame, Contador contador, Nave nave)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>        </span><span style="color:#0000e6;">this</span>.frame = frame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>        </span><span style="color:#0000e6;">this</span>.contador = contador;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span>        </span><span style="color:#0000e6;">this</span>.nave = nave;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">012</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">013</span>
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">014</span>    </span></span><span style="color:#ff0000;">public void run()
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">015</span>    {
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">016</span>        while (true)
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">017</span>        {
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">018</span>            Thread.yield();
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">019</span>            update();
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">020</span>        }
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">021</span>    }</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">022</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">023</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> update()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">024</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">025</span>        </span>...<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">026</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">027</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> Renderizador <span style="color:#ff0000;">implements Runnable</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">028</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">029</span>    </span>BufferStrategy bs;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">030</span>    </span>Contador contador;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">031</span>    </span>JFrame frame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">032</span>    </span>Nave nave;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">033</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">boolean</span> terminado = <span style="color:#0000e6;">false</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">034</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">035</span>    </span><span style="color:#0000e6;">public</span> Renderizador(JFrame frame, BufferStrategy bs, Contador contador, Nave nave)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">036</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">037</span>        </span><span style="color:#0000e6;">this</span>.frame = frame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">038</span>        </span><span style="color:#0000e6;">this</span>.bs = bs;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">039</span>        </span><span style="color:#0000e6;">this</span>.contador = contador;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">040</span>        </span><span style="color:#0000e6;">this</span>.nave = nave;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">041</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">042</span>
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">043</span>    </span></span><span style="color:#ff0000;">public void run()
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">044</span>    {
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">045</span>        while (!terminado)
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">046</span>        {
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">047</span>            Thread.yield();
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">048</span>            render();
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">049</span>        }
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">050</span>    }</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">051</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">052</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> render()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">053</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">054</span>        </span>...</pre>
<p>Modifiquei o código das classes Controlador e Renderizador para que implementem a interface Runnable do Java. Para isso, também declarei o método run() e dentro dele coloquei um laço. O Renderizador tem um laço que fica chamando render(). O Controlador tem um laço que fica chamando o update().</p>
<p>Agora a modificação no <em>gameloop</em>:</p>
<pre style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> gameloop()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span>        </span>initialize();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span>        </span>Controlador c = <span style="color:#0000e6;">new</span> Controlador(<span style="color:#0000e6;">this</span>, contador, nave);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span>        </span>Renderizador r = <span style="color:#0000e6;">new</span> Renderizador(<span style="color:#0000e6;">this</span>, bs, contador, nave);<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">006</span>        </span></span><span style="color:#ff0000;">Thread t;
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">007</span>        t = new Thread(c);
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">008</span>        t.start();
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">009</span>        t = new Thread(r);
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">010</span>        t.start();</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span>    </span>}</pre>
<p>Aqui está o uso das <em>threads</em>, finalmente. Basta criar um objeto do tipo Thread informando para ele um objeto do tipo Runnable (o Renderizador, por exemplo). Depois chamamos o método start() da <em>thread</em> e ela vai chamar o método run() do objeto que lhe foi passado. O método run() será executado em paralelo ao resto do programa. Então, estamos colocando o laço do render() e o laço do update() para rodarem em paralelo.</p>
<p>Curioso para ver o resutado? Está abaixo:</p>
<p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/thread04a.png"><img class="aligncenter size-full wp-image-863" title="Thread04a" src="http://evertonbaumgarten.files.wordpress.com/2009/10/thread04a.png?w=468&#038;h=199" alt="Thread04a" width="468" height="199" /></a></p>
<p>Voilá! Um milhão e oitocentos mil pulsos e 459 frames. E usado 100% da CPU. Veja que agora os dois núcleos estão absolutamente carregados &#8211; a linha do gráfico está &#8220;cravada&#8221; no topo.</p>
<p>Mas porque deu valores menores do que quando rodamos cada um separadamente? Bom, é que a CPU ainda precisa atender os tais processos de fundo, S.O., antivirus, etc. Eles devem estar rodando no mesmo núcleo do update(), o que fez ele executar mais lentamente. Mas foi uma boa escolha do S.O., já que esse é o processo mais leve. Inteligentes estas máquinas modernas, não?</p>
<p>De qualquer forma, é um desempenho muito acima da primeira versão que eu mostrei.</p>
<h2>Conclusão</h2>
<p>Não usem <em>threads</em>.</p>
<p>Pelo menos não até chegar a um ponto onde não tenha mais o quê otimizar no código de vocês e ainda assim o jogo esteja lento. Uma minoria de jogos atuais faz uso intensivo de <em>threads</em> (menos de 20, pelo que sei), e todos especialistas concordam que não é fácil.</p>
<p>O que fiz no código acima, compartilhar um objeto (a nave) entre duas <em>threads</em> rodando paralelamente é perigoso. Nesse caso uma delas atualiza os dados e a outra apenas lê. Mas se duas <em>threads</em> atualizarem os mesmos dados ao mesmo tempo, as consequencias serão imprevisíveis. O Java facilita porque possui formas de sincronizar dados, impedindo sua leitura simultaneamente por duas <em>threads</em>. Mas não adianta sincronizar tudo, senão uma <em>thread</em> vai acabar esperando pela outra para poder acessar os dados e vão acabar rodando em sequencia, ao invés de em paralelo.</p>
<p>Por outro lado, o Java, por sí,  já tira proveito de processadores de múltiplos núcleos. Existem outros processos que a máquina virtual faz, como coleta de lixo e otimização interativa do código. A JVM (Máquina Virtual Java) faz uso de <em>threads</em> para separar e rodar em paralelo estas operações, melhorando o desempenhdo do seu programa sem você ter que fazer nada.</p>
<p>Bom, fica aí um exemplo de uso de <em>threads</em> para quem não conhecia.</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:1850px;width:1px;height:1px;">&lt;pre style=&#8221;font-family:Monospaced,monospace;color:#000000&#8243;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;001&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;package&lt;/span&gt; abrindoojogo.exemplos.thread;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;002&lt;/span&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;003&lt;/span&gt;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;public&lt;/span&gt; &lt;span style=&#8221;color:#0000e6;&#8221;&gt;class&lt;/span&gt; Nave&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;004&lt;/span&gt;&lt;/span&gt;{&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;005&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;int&lt;/span&gt; x;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;006&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;int&lt;/span&gt; y;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;007&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;int&lt;/span&gt; qtd;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;008&lt;/span&gt;&lt;/span&gt;}&lt;/pre&gt;</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/862/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=862&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/10/08/threads-apenas-um-exemplo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835c2a89e65f8dbe1d3786e83de73f42?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Nörnberg</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/threads.png" medium="image">
			<media:title type="html">Threads</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/thread01a.png" medium="image">
			<media:title type="html">Thread01a</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/thread01b.png" medium="image">
			<media:title type="html">Thread01b</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/thread02a.png" medium="image">
			<media:title type="html">Thread02a</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/thread02b.png" medium="image">
			<media:title type="html">Thread02b</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/thread03a.png" medium="image">
			<media:title type="html">Thread03a</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/thread03b.png" medium="image">
			<media:title type="html">Thread03b</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/thread04a.png" medium="image">
			<media:title type="html">Thread04a</media:title>
		</media:content>
	</item>
		<item>
		<title>Desafios e Aventuras para Estudar Química Orgânica</title>
		<link>http://blog.abrindoojogo.com.br/2009/10/03/desafios-e-aventuras-para-estudar-quimica-organica/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/10/03/desafios-e-aventuras-para-estudar-quimica-organica/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 00:14:53 +0000</pubDate>
		<dc:creator>Everton Baumgarten</dc:creator>
				<category><![CDATA[Abrindo o Jogo]]></category>
		<category><![CDATA[Teórico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=842</guid>
		<description><![CDATA[Jogos Educacionais sempre foram sinônimo de aplicativos  simples e voltados para o público infantil. Mesmo fora de nosso País, existem pouquíssimos projetos que ajudam a contrariar este conceito, ou preconceito. Mas quais seriam os fatores que contribuem para que jogos educacionais não sejam maduros, divertidos e desafiantes?
Em 2008 eu tive a oportunidade de participar de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=842&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/ilustracao1.jpg"><img class="alignleft size-full wp-image-851" title="ilustracao" src="http://evertonbaumgarten.files.wordpress.com/2009/10/ilustracao1.jpg?w=178&#038;h=202" alt="ilustracao" width="178" height="202" /></a>Jogos Educacionais sempre foram sinônimo de aplicativos  simples e voltados para o público infantil. Mesmo fora de nosso País, existem pouquíssimos projetos que ajudam a contrariar este conceito, ou preconceito. Mas quais seriam os fatores que contribuem para que jogos educacionais não sejam maduros, divertidos e desafiantes?</p>
<p><span id="more-842"></span>Em 2008 eu tive a oportunidade de participar de uma equipe que ajudou a mudar este conceito. Através de uma excelente parceria entre Gestum &#8211; Tecnologia Educacional, professores/técnicos da Universidade Federal do Rio Grande do Sul (UFRGS), Universidade Federal de Ciências da Saúde de Porto Alegre (UFCSPA) e Instituto Federal Sul Riograndense de Pelotas, em julho deste ano foi apresentado à FINEP o produto final de um dos projetos produzidos para atender a um Edital de fomento a jogos educacionais. Trata-se do <strong>Química Aplicada</strong>, jogo que será utilizado para motivar os alunos do ensino médio a estudar Química Orgânica. Com isso, embora não fosse um objetivo do edital, consolidou-se uma parceria integrando empresa e universidade, a qual deverá ter continuidade em outros projetos.</p>
<p>O Game narra as aventuras e desafios de um repórter, que recebe informações sobre uma grande explosão em uma ilha, ao sul do Brasil. Mostra a pauta a seu editor chefe, o qual identifica as coordenadas como o local onde ocorrem pesquisas com Química Orgânica. Será que houve algum acidente? Será que há risco de contaminação ambiental na região? Será que haverá novas explosões? No percurso do jogo, o personagem deverá enfrentar vários desafios na ilha, entre eles: resolver uma emergência química no laboratório destruído; utilizar vários itens como  um palmtop e um maçarico; passar por labirintos protegidas por sistemas de segurança; e até descobrir a combinação de combustíveis necessários para mover uma lancha e abandonar a ilha.</p>
<div id="attachment_852" class="wp-caption aligncenter" style="width: 296px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/acidente.jpg" target="_blank"><img class="size-full wp-image-852" title="acidente" src="http://evertonbaumgarten.files.wordpress.com/2009/10/acidente.jpg?w=286&#038;h=213" alt="acidente" width="286" height="213" /></a><p class="wp-caption-text">Chegada do repórter na ilha</p></div>
<p>O professor Eric Klopfer, do MIT, conta que os críticos dos games educacionais costumam chamá-los de brócolis cobertos de chocolate. A este respeito, a equipe de coordenação do Química Aplicada considera que um dos principais diferenciais deste jogo é exatamente a busca do equilíbrio entre a jogabilidade (o chocolate) e as exigências do conteúdo educacional (o brócolis). O fator mais trabalhado no Projeto de Jogo foi a forma como o conteúdo seria entregue ao aluno. Normalmente jogos educacionais deixam este evento bastante explícito, quebrando o ritmo do jogo. O segredo foi criarmos um contexto envolvendo o conteúdo, tornando-o parte da narrativa.</p>
<div id="attachment_853" class="wp-caption aligncenter" style="width: 300px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/cavernas.jpg"><img class="size-full wp-image-853" title="cavernas" src="http://evertonbaumgarten.files.wordpress.com/2009/10/cavernas.jpg?w=290&#038;h=218" alt="cavernas" width="290" height="218" /></a><p class="wp-caption-text">O conhecimento de química é exigido em vários pontos do game.</p></div>
<p><em>&#8220;A participação da Gestum foi fundamental, garantindo a qualidade gráfica e a fluência do game, de forma envolvente e motivadora para o aluno, que realmente joga com gosto enquanto pesquisa os conteúdos de química, para resolver os desafios.&#8221;</em> Comenta Maria Isabel Timm, Dra. em Informática na Educação pela UFRGS e principal responsável pelo projeto.</p>
<p>Outro fator que considero um grande diferencial do projeto, foi a autonomia dada ao professor. O docente, através de arquivos XML, pode configurar os puzzles, enredo, conteúdo e até o desfecho da história. Esta funcionalidade visa adequar o aplicativo a forma como cada professor organiza seu conteúdo na sala de aula.</p>
<div id="attachment_855" class="wp-caption aligncenter" style="width: 309px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/10/porto.jpg"><img class="size-full wp-image-855" title="porto" src="http://evertonbaumgarten.files.wordpress.com/2009/10/porto.jpg?w=299&#038;h=221" alt="Todos os puzzles possuem um contexto, o aluno quase não percebe que está aprendendo." width="299" height="221" /></a><p class="wp-caption-text">Todos os puzzles possuem um contexto, o aluno quase não percebe que está aprendendo.</p></div>
<p>Uma versão-piloto do jogo já está sendo aplicada com alunos da rede pública e privada do RS, com acesso via Internet. O jogo foi adequado ao padrão SCORM, para ser acessado através de qualquer LMS (Learning Management System), e tem total flexibilidade para futuros professores modificarem ou acrescentarem material de apoio, questões e outros desafios, adequando desta forma o game a várias possibilidades de aplicação em sala de aula.</p>
<p>Interessados em acessar e conhecer o jogo podem fazer contato com os coordenadores do projeto, através dos e-mails:</p>
<address> beta@cesup.ufrgs.br; </address>
<address>anzevedo@ufcspa.edu.br; </address>
<address>luis.otoni@terra.com.br.</address>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/842/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/842/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/842/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/842/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/842/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/842/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/842/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/842/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/842/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/842/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=842&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/10/03/desafios-e-aventuras-para-estudar-quimica-organica/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9a1cec9473510986b8eb2eb64b7b2a2b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Everton Baumgarten</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/ilustracao1.jpg" medium="image">
			<media:title type="html">ilustracao</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/acidente.jpg" medium="image">
			<media:title type="html">acidente</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/cavernas.jpg" medium="image">
			<media:title type="html">cavernas</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/10/porto.jpg" medium="image">
			<media:title type="html">porto</media:title>
		</media:content>
	</item>
		<item>
		<title>BRGames 2009 &#8211; Conhecendo os Vencedores</title>
		<link>http://blog.abrindoojogo.com.br/2009/09/30/brgames-2009-conhecendo-os-vencedores/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/09/30/brgames-2009-conhecendo-os-vencedores/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 02:27:36 +0000</pubDate>
		<dc:creator>Everton Baumgarten</dc:creator>
				<category><![CDATA[Mercado de Jogos]]></category>
		<category><![CDATA[Teórico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=803</guid>
		<description><![CDATA[
Olá leitores do Abrindo o Jogo, mesmo finalizando recentemente o post sobre as oportunidades do mercado nacional, achei muito apropriado continuar o assunto e comentar um pouco sobre os vencedores do programa BRGames 2009, iniciativa do governo federal para fomentar a indústria nacional. Considero este programa um dos mais importantes em vigor, a cada ano [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=803&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/ilustracao4.jpg"><img class="alignleft size-full wp-image-838" title="ilustracao" src="http://evertonbaumgarten.files.wordpress.com/2009/09/ilustracao4.jpg?w=200&#038;h=246" alt="ilustracao" width="200" height="246" /></a></p>
<p>Olá leitores do Abrindo o Jogo, mesmo finalizando recentemente o post sobre as oportunidades do mercado nacional, achei muito apropriado continuar o assunto e comentar um pouco sobre os vencedores do programa BRGames 2009, iniciativa do governo federal para fomentar a indústria nacional. Considero este programa um dos mais importantes em vigor, a cada ano ele se mostra mais maduro e competitivo. Desta forma, considero importante entender um pouco os critérios da mesa avaliadora para o próximo ano.</p>
<p><span id="more-803"></span>Primeiramente vamos rever os vencedores, a lista foi publicada no site do programa e conta com 3 empresas estruturadas e 7 produtores independentes.</p>
<p><strong>Empresas estruturadas:</strong></p>
<ol>
<li>&#8220;Night Life&#8221; &#8211; Overplay Entretenimento Digital Ltda.</li>
<li>&#8220;Robô Sucata&#8221; &#8211; 44 Bico Largo Comercial Ltda.</li>
<li>&#8220;Esther Art Gallery&#8221; &#8211; Interama Jogos Eletrônicos</li>
</ol>
<p><em> </em><strong>Pessoas físicas:</strong></p>
<ol>
<li>&#8220;Chameleon&#8221; &#8211; Philip Sciangula Berick Mangione</li>
<li>&#8220;Dragon vs Heroes&#8221; &#8211; Tiago Monteiro Fernandes</li>
<li>&#8220;Freestyle&#8221; &#8211; Leonardo Henrique Muniz Arantes</li>
<li>&#8220;Lumaki&#8221; &#8211; Guilherme Bischoff Lopes Fonseca</li>
<li>&#8220;Luna&#8221; &#8211; Saulo Camarotti Rayol Braga</li>
<li>&#8220;O Mutualismo&#8221; &#8211; Paulo Estevão Biagioni</li>
<li>&#8220;Vovó a Solta&#8221; &#8211; Raphael Fernandes Marques</li>
</ol>
<p>Os projetos de pessoas físicas recebem R$ 70 mil cada um, já as empresas, ganharam um contrato de co-produção de R$ 140 mil (sendo que R$ 28 mil serão investidos pela própria companhia). O recebimento da premiação está vinculado à participação obrigatória do autor, ou um representante da empresa, na &#8220;Oficina para Desenvolvimento de Projetos de Jogos Eletrônicos&#8221;.</p>
<p>Vamos conhecer um pouco sobre cada um dos projetos:</p>
<h3>1.Night Life</h3>
<p>Gerenciador de baladas que mistura elementos de &#8220;Theme Hospital&#8221; e &#8220;The Sims&#8221;. Criado pela Overplay, que já produziu títulos para Nintendo DS, permite criar casas noturnas que atraem pessoas de diversos tipos, cada uma com personalidades únicas.</p>
<p style="text-align:center;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/nightlive1.jpg"><img class="alignnone size-full wp-image-816" title="NightLive1" src="http://evertonbaumgarten.files.wordpress.com/2009/09/nightlive1.jpg?w=210&#038;h=169" alt="NightLive1" width="210" height="169" /></a><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/nightlive2.jpg"><img class="alignnone size-full wp-image-817" title="NightLive2" src="http://evertonbaumgarten.files.wordpress.com/2009/09/nightlive2.jpg?w=210&#038;h=169" alt="NightLive2" width="210" height="169" /></a></p>
<h3>2.Robô Sucata</h3>
<p>Aventura 3D em que se deve montar máquinas para combater alienígenas. Produzida pelo estúdio 44 Bico Largo, traz de volta o herói Gustavinho, que estrelou o game &#8220;Enigma da Esfinge&#8221;, de 1996.</p>
<p style="text-align:center;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/robosucata2.jpg"><img class="alignnone size-full wp-image-818" title="roboSucata2" src="http://evertonbaumgarten.files.wordpress.com/2009/09/robosucata2.jpg?w=210&#038;h=156" alt="roboSucata2" width="210" height="156" /></a><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/robosucata.jpg"><img class="alignnone size-full wp-image-819" title="roboSucata" src="http://evertonbaumgarten.files.wordpress.com/2009/09/robosucata.jpg?w=229&#038;h=156" alt="roboSucata" width="229" height="156" /></a></p>
<h3>3.Esther Art Gallery</h3>
<p>Jogo de ação no qual o objetivo é ajudar a garota Esther a reconstruir a galeria de arte do tio-avô e resgatar o prestígio que tinha em outros tempos. Game produzido pela Interama, responsável também pelo recente &#8220;Guitar Idol&#8221;, para Mega Drive.</p>
<p style="text-align:center;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/estherartgallery1.jpg"><img class="alignnone size-full wp-image-823" title="estherArtGAllery" src="http://evertonbaumgarten.files.wordpress.com/2009/09/estherartgallery1.jpg?w=278&#038;h=145" alt="estherArtGAllery" width="278" height="145" /></a></p>
<h3>4.Mutualismo</h3>
<p>Comande a dupla Speero e Geera com teclado, mouse, microfone e outros tipos de controle e ajude-os a se tornarem deuses. Partes da aventura envolvem viagens no tempo, já que será necessário visitar o futuro para entender exatamente o que fazer no presente.</p>
<h3 style="text-align:left;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/mutualismo.jpg"><img class="size-full wp-image-824 aligncenter" title="mutualismo" src="http://evertonbaumgarten.files.wordpress.com/2009/09/mutualismo.jpg?w=305&#038;h=191" alt="mutualismo" width="305" height="191" /></a></h3>
<h3 style="text-align:left;">5.Freestyle Challenge</h3>
<p>Realize o sonho de se tornar o maior jogador de futebol urbano desafiando outros times da vizinhança. Conforme enfrenta equipes, seu atleta melhora atributos e adquire novas habilidades com a bola.</p>
<h3 style="text-align:left;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/freestyle.jpg"><img class="size-full wp-image-825 aligncenter" title="freeStyle" src="http://evertonbaumgarten.files.wordpress.com/2009/09/freestyle.jpg?w=171&#038;h=212" alt="freeStyle" width="171" height="212" /></a></h3>
<h3 style="text-align:left;">6.Vovó a Solta</h3>
<p>O herói é um militar traumatizado dos conflitos de gerra. Assim, ele protege uma doce senhora a qualquer custo de todo tipo de perigo &#8211; como prêmio ele recebe biscoitos no final da tarde.</p>
<h3 style="text-align:left;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/vovoasolta.jpg"><img class="size-full wp-image-826 aligncenter" title="vovoASolta" src="http://evertonbaumgarten.files.wordpress.com/2009/09/vovoasolta.jpg?w=282&#038;h=205" alt="vovoASolta" width="282" height="205" /></a></h3>
<h3 style="text-align:left;">7.Dragon vs. Heroes</h3>
<p>Assuma o papel de um dragão que deve montar armadilhas em uma torre e impedir que os heróis salvem as princesas. Quanto mais donzelas tiver em cárcere, mais heróis a criatura atrai e assim tem mais oportunidades de juntar tesouros.</p>
<h3 style="text-align:left;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/dragonsheroes.jpg"><img class="size-full wp-image-827 aligncenter" title="dragons&amp;Heroes" src="http://evertonbaumgarten.files.wordpress.com/2009/09/dragonsheroes.jpg?w=304&#038;h=226" alt="dragons&amp;Heroes" width="304" height="226" /></a></h3>
<h3 style="text-align:left;">8.Lumaki</h3>
<p>Crie criaturas e treine-as em minigames para depois competir em combates. As habilidades dos Lumakis podem ser melhoradas por meio de minigames de diversos tipos. O projeto do game almeja versões para iPhone, Xbox Live Arcade, PlayStation Network e WiiWare.</p>
<p style="text-align:center;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/lumaki.jpg"><img class="alignnone size-full wp-image-828" title="lumaki" src="http://evertonbaumgarten.files.wordpress.com/2009/09/lumaki.jpg?w=172&#038;h=129" alt="lumaki" width="172" height="129" /></a><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/lumaki21.jpg"><img class="alignnone size-full wp-image-830" title="lumaki2" src="http://evertonbaumgarten.files.wordpress.com/2009/09/lumaki21.jpg?w=247&#038;h=130" alt="lumaki2" width="247" height="130" /></a></p>
<h3>9.Chameleon</h3>
<p>Controle um casal de camaleões por uma pista enquanto coleta cristais e resolve quebra-cabeças. A aventura conta com visual tridimensional e a mecânica exige que se controle as duas criaturas ao mesmo tempo.</p>
<h3 style="text-align:left;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/chameleon.jpg"><img class="size-full wp-image-831 aligncenter" title="chameleon" src="http://evertonbaumgarten.files.wordpress.com/2009/09/chameleon.jpg?w=312&#038;h=175" alt="chameleon" width="312" height="175" /></a></h3>
<h3 style="text-align:left;">10.Luna</h3>
<p>Aventura clássica com visual 3D estrelada por uma menina em um mundo virtual. Após ter o computador hackeado, a garota Luna, de 13 anos, encarna um avatar digital capaz de manipular campos magnéticos e parte em uma jornada para resolver o problema.</p>
<p style="text-align:center;"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/luna.jpg"><img class="size-full wp-image-832 aligncenter" title="luna" src="http://evertonbaumgarten.files.wordpress.com/2009/09/luna.jpg?w=299&#038;h=199" alt="luna" width="299" height="199" /></a></p>
<h2>Conclusão</h2>
<p>Consigo enxergar uma grande evolução das propostas em relação aos anos anteriores (<a href="http://www.abragames.org/JogosBR.html">confira aqui</a>). As empresas nacionais estão começando a enxergar o caminho certo, esquecendo um pouco de tentar criar um novo World of WarCraft, e criando propostas mais adequadas a nossa realidade. Um mercado estável se constrói aos poucos, com bons alicerces. Na minha opinião uma boa empresa não pode pensar em um game AAA antes de experimentar fazer bons jogos para celular, web ou portáteis. Até onde foi possível interpretar, os critérios da mesa avaliadora estariam alinhados com este pensamento.</p>
<p>Confesso que gostei mais dos projetos independentes. Destacaria Mutualismo, Dragon vs Heroes e Luna como os mais inovadores e criativos. Resta saber se o pessoal vai desempenhar um bom papel também no desenvolvimento do projeto. Ficamos todos na torcida e na espera dos Demos. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>E vocês, o que acharam dos projetos?</p>
<address>Referência: Uol Jogos http://jovem.uol.com.br/ultnot/ult182u8247.jhtm</address>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/803/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/803/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/803/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/803/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/803/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/803/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/803/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/803/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/803/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/803/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=803&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/09/30/brgames-2009-conhecendo-os-vencedores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9a1cec9473510986b8eb2eb64b7b2a2b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Everton Baumgarten</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/ilustracao4.jpg" medium="image">
			<media:title type="html">ilustracao</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/nightlive1.jpg" medium="image">
			<media:title type="html">NightLive1</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/nightlive2.jpg" medium="image">
			<media:title type="html">NightLive2</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/robosucata2.jpg" medium="image">
			<media:title type="html">roboSucata2</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/robosucata.jpg" medium="image">
			<media:title type="html">roboSucata</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/estherartgallery1.jpg" medium="image">
			<media:title type="html">estherArtGAllery</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/mutualismo.jpg" medium="image">
			<media:title type="html">mutualismo</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/freestyle.jpg" medium="image">
			<media:title type="html">freeStyle</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/vovoasolta.jpg" medium="image">
			<media:title type="html">vovoASolta</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/dragonsheroes.jpg" medium="image">
			<media:title type="html">dragons&#38;Heroes</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/lumaki.jpg" medium="image">
			<media:title type="html">lumaki</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/lumaki21.jpg" medium="image">
			<media:title type="html">lumaki2</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/chameleon.jpg" medium="image">
			<media:title type="html">chameleon</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/luna.jpg" medium="image">
			<media:title type="html">luna</media:title>
		</media:content>
	</item>
		<item>
		<title>Trabalhar com Jogos é uma Questão de Sorte? parte final</title>
		<link>http://blog.abrindoojogo.com.br/2009/09/26/trabalhar-com-jogos-e-uma-questao-de-sorte-parte-final/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/09/26/trabalhar-com-jogos-e-uma-questao-de-sorte-parte-final/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 17:37:04 +0000</pubDate>
		<dc:creator>Everton Baumgarten</dc:creator>
				<category><![CDATA[Mercado de Jogos]]></category>
		<category><![CDATA[Projeto de Jogo]]></category>
		<category><![CDATA[Teórico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=724</guid>
		<description><![CDATA[Olá pessoal do Abrindo o Jogo,  com tudo que já comentamos sobre o tema nas partes 1 e 2, será que alguém se animaria a responder a pergunta que intitula este extenso artigo? Você já saberia a resposta? Não? Então vamos analisar a última parte, que apresenta as seções finais do documento de projeto, e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=724&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/ilustracao3.jpg"><img class="alignleft size-full wp-image-769" title="ilustração3" src="http://evertonbaumgarten.files.wordpress.com/2009/09/ilustracao3.jpg?w=200&#038;h=167" alt="ilustração3" width="200" height="167" /></a>Olá pessoal do Abrindo o Jogo,  com tudo que já comentamos sobre o tema nas partes <a href="http://wp.me/pkJJ1-9w">1</a> e <a href="http://wp.me/pkJJ1-9V">2</a>, será que alguém se animaria a responder a pergunta que intitula este extenso artigo? Você já saberia a resposta? Não? Então vamos analisar a última parte, que apresenta as seções finais do documento de projeto, e tirar a conclusão juntos.</p>
<h4><span id="more-724"></span></h4>
<h4>8 Diagramas de Progresso</h4>
<p>Criar um fluxograma para mostrar o progresso do jogador no game. Este tipo de diagrama serve como um mapa não linear para uma narrativa. A imagem abaixo apresenta o mapa do game Ultima VII (1992 Origin Systems), é possível perceber as diferentes decisões a serem tomadas pelo jogador durante sua jornada.</p>
<div id="attachment_745" class="wp-caption aligncenter" style="width: 355px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/ultimavii.jpg"><img class="size-full wp-image-745" title="ultimaVII" src="http://evertonbaumgarten.files.wordpress.com/2009/09/ultimavii.jpg?w=345&#038;h=207" alt="ultimaVII" width="345" height="207" /></a><p class="wp-caption-text">Fluxograma - Ultima VII</p></div>
<p>O gráfico de progresso também pode ser aplicado para jogos em turnos, descrevendo detalhadamente as atividades de cada fase.</p>
<h5>Storyboards</h5>
<p>Para jogos com cutscenes e cinematics, identifique estas cenas no diagrama, inserindo material adicional na forma de storybords e scripts. Uma ótima referencia seria o livro<a href="http://www.amazon.com/Don-Bluths-Art-Storyboard-Bluth/dp/1595820078"> Don Bluth&#8217;s The Art of Storyboard </a>[Bluth and Goldman 04].</p>
<h4>9 Direção de Arte</h4>
<p>A seção de direção de arte é a combinação de textos descritivos e imagens que transmitem o estilo gráfico do jogo. Ela normalmente inclui concepções (como da figura abaixo), referência de artes de livros, instruções de uso da luz em jogos 3D, exemplo de fonts e até limitações definidas pela tecnologia atual.</p>
<p style="text-align:center;">
<div id="attachment_746" class="wp-caption aligncenter" style="width: 358px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/gypsies_900.jpg"><img class="size-full wp-image-746" title="gypsies_900" src="http://evertonbaumgarten.files.wordpress.com/2009/09/gypsies_900.jpg?w=348&#038;h=232" alt="Concepões de arte de Fable 2" width="348" height="232" /></a><p class="wp-caption-text">Concepções de arte de Fable 2</p></div>
<h4>10 Storyboards de Interface do Usuário</h4>
<p>Para um jogo de computador, a interface do usuário é o instalador, a tela de título, menus, diálogos, HUD (Head Up Display) e qualquer outro controle ou texto. Cada um destes, deve ser devidamente projetado através de textos e um storyboard gráfico. Storyboards podem ser simples esboços que mostram os elementos da GUI (Graphic User Interface), com rótulos indicando a funcionalidade de cada elemento. Fluxogramas são necessários para descrever cada interação do jogador e a resposta do jogo para esta ação.</p>
<div id="attachment_755" class="wp-caption aligncenter" style="width: 266px"><a href="http://pingmag.jp/images/article/storyboard01.jpg"><img class="size-full wp-image-755" title="storyboard01" src="http://evertonbaumgarten.files.wordpress.com/2009/09/storyboard011.jpg?w=256&#038;h=291" alt="storyboard01" width="256" height="291" /></a><p class="wp-caption-text">Storyboard de um webgame</p></div>
<h4>11 Arquitetura de Software</h4>
<p>Video games necessitam de um projeto de software complexo. Nesta seção, os documentos de arquitetura descrevem as funcionalidades de cada módulo de programação. Isto inclui o uso de APIS e algoritmos que serão usados para implementá-los, além dos padrões de projetos envolvidos na produção. Esta seção contará com vários diagramas, entre eles: diagramas de classes, diagrama de sequência, diagrama de fluxo, e o já conhecido diagrama de módulos de sistema. Observe abaixo alguns exemplos.</p>
<div class="wp-caption aligncenter" style="width: 303px"><a href="http://www.gamedevbr.com/wp-content/arquivos/xna_invasores_diagrama_de_classes.jpg" target="_blank"><img src="http://www.gamedevbr.com/wp-content/arquivos/xna_invasores_diagrama_de_classes.jpg" alt="Diagrama de Classes" width="293" height="239" /></a><p class="wp-caption-text">Diagrama de Classes</p></div>
<div class="wp-caption aligncenter" style="width: 299px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/appa.jpg" target="_blank"><img class="size-full wp-image-759" title="appA" src="http://evertonbaumgarten.files.wordpress.com/2009/09/appa.jpg?w=289&#038;h=273" alt="Diagrama de Sistema" width="289" height="273" /></a>Diagrama de Sistema</dt>
</dl>
</div>
<p>Obviamente este post não destina-se a explicar como funciona cada um dos diagramas, porém outros post virão com esta finalidade.</p>
<h4>12 Controles</h4>
<p>Video games dependem de seus esquemas de controle. Um grande jogo pode ser um fracasso se a mecânica de entrada estiver inadequada ou destinada a um público-alvo que não é o mesmo de seu projeto. A seção Controles detalha ambos, o mapeamento dos botões para as funções do jogo e o mapeamento dos algoritmos de entrada para as ações.</p>
<p style="text-align:center;">
<div class="mceTemp mceIEcenter">
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/redoctanecontrols_r1.jpg"><img class="size-full wp-image-761" title="redoctanecontrols_r" src="http://evertonbaumgarten.files.wordpress.com/2009/09/redoctanecontrols_r1.jpg?w=429&#038;h=244" alt="Mapa de Controle de RoadKill" width="429" height="244" /></a><p class="wp-caption-text">Mapa de Controle de RoadKill (Red Octane/Activision)</p></div>
<h4>13 Projeto de Níveis (Level Design)</h4>
<p>A maioria dos games são divididos em níveis que representam uma evolução, além de uma discreta mudança na dificuldade. Um exemplo bem que isto está presente desde o início da era do videogames, seria as diferente ondas de aliens em Space Invaders. Estes níveis também podem ser representados por novos mapas ou cenários. Em jogos clássicos, como Xadrez, níveis são um tanto vagos (embora podemos considerar a abertura, meio e fim como etapas distintas).</p>
<p>Em jogos com uma forte progressão linear, níveis são normalmente áreas em grandes mundos.  Já para jogos com níveis baseados em locações, você deve criar um mapa para mostrar o layout e conectividade do nível. Indicando encontros, locais com itens e objetivos. Para isto, utilize os gráficos de progresso da seção anterior</p>
<p>Esta seção em resumo deve preocupar-se em deixar o jogo equilibrado e desafiante. Atualmente é bastante comum encontrarmos editores específicos para esta finalidade, permitindo que um profissional focado nesta área, com pouco conhecimento de programação, possa ter total autonomia para definir cada nível do game. Uma prova que esta tarefa, além de complexa, é muito divertida, seriam os jogos que permitem o próprio jogador assumir este papel.</p>
<p style="text-align:center;">
<div id="attachment_763" class="wp-caption aligncenter" style="width: 300px"><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/little_big_planet_1280x1024.jpg" target="_blank"><img class="size-full wp-image-763" title="little_big_planet_1280x1024" src="http://evertonbaumgarten.files.wordpress.com/2009/09/little_big_planet_1280x1024.jpg?w=290&#038;h=233" alt="Little Big Planet - Game que tem sua essência a costrução de níveis." width="290" height="233" /></a><p class="wp-caption-text">Little Big Planet - Game que tem em sua essência a construção de níveis.</p></div>
<h3>14 Análise da Mecânica</h3>
<p>O coração deste documento é a seção de Análise da Mecânica. Ela é igualmente importante para video games, jogos de tabuleiro, títulos AAA, jogos independentes ou projetos escolares.</p>
<p>Mecânicas de jogo são pequenos grupos de regras que definem um conflito estratégico, inspiram uma emoção em particular no jogador, além de definirem o avanço no jogo. Acredito que alguns exemplos ajudaram a entender melhor.</p>
<p><em>Racing </em>(Corrida) é uma mecânica clássica. Alcance a linha de chegada antes de seus oponentes. Esta mecânica coloca uma pressão de tempo no jogador, criando stress e motivação. Isto é equilibrado e justo; a escala de sucesso é definida pela relação entre o corredor mais lento e o mais rápido. Esta mecânica não consiste exatamente em carros e uma pista. Por exemplo, em um jogo de &#8220;capturar a bandeira&#8221;, a mecânica de <em>Racing </em>começa assim que um bandeira for pega, a partir deste ponto, ambos os lados tentarão alcançar o objetivo (ou interceptar quem pegou a bandeira) o mais rápido possível.</p>
<p><em>Shooting </em>(Tiroteio) é uma mecânica ainda mais popular no mundo dos games. Ela envolve ações de reflexo, estratégia para atingir os inimigos e liderança quando sua equipe estiver sob fogo serrado. <em>Shooting </em>não necessariamente envolve armas de fogo. Vários jogos utilizam esta mecânica para atirar um personagem de uma bala de canhão, tirar fotos da vida selvagem ou arremessar e pegar uma bola.</p>
<p>Descreva a mecânica do seu jogo com o maior número de detalhes, mas saiba que provavelmente, ela já exista em algum outro jogo. Por este motivo, registre outros que possuam uma mecânica similar a sua, destacando as diferenças. É importante também descrever a razão de jogo de cada uma delas. Defina linhas guia para tornar a mecânica equilibrada e útil para a jogabilidade. Fundamente estes argumentos em texto, gráficos e diagramas.</p>
<p>Eu costumo utilizar muito a ferramenta Microsoft Excel para validar a base das mecânicas que crio. Mesmo para jogos um pouco mais complexos, a ferramenta se mostra muito útil, e com um pouquinho de &#8220;programação&#8221; é possível montar planilhas bem complexas e úteis. Fica a dica <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>15 Cronograma</h3>
<p>Esta é a seção do documento onde você deve demonstrar maturidade e capacidade de gerenciamento. Aqui, é necessário traçar um cronograma bem planejado e confiável para seu projeto. Mesmo fazendo parte de uma equipe pequena, é importante demonstrar organização e uma boa gestão.</p>
<h4>Agenda Mestre</h4>
<p>A agenda de desenvolvimento mestre descreve o plano para produzir o jogo em dias. Ela é dividida em <em>releases </em>de protótipo e <em>milestones</em>, que por sua vez, são divididas em tarefas individuais para os desenvolvedores. <em>Milestones </em>descrevem quais e quando determinadas funcionalidades, e experiências de jogo, estarão disponíveis. Sua periodicidade pode variar entre semanas, meses ou até anos, dependendo da complexidade do jogo.</p>
<p>As tarefas devem ser interdependentes e expostas através de um gráfico de Gantt, com isto será possível analisar as consequências de um pequeno atraso durante o desenvolvimento. Para isto, a ferramenta mais conhecida seria o Microsoft Project, porém existem várias opções gratuitas no mercado, dentre eles destacaria o <a href="http://www.dotproject.net/">Dot Project</a>.</p>
<h4>Planejamento de pessoas</h4>
<p>Para um game comercial, o planejamento de pessoas descreve como e quantos desenvolvedores serão contratos para atender as demandas do projeto, respeitando o cronograma de entrega. Isto pode ser descrito também com <em>milestones</em> indicando pontos do projeto onde determinado tipo de profissional é necessário. Aqui é sensato contemplar carga horária para contratações, entrevistas e principalmente treinamento. Obviamente este planejamento não se aplica tanto para equipes independentes ou projetos escolares.</p>
<h4>Desenvolvedores Chave</h4>
<p>Descreva as qualificações dos líderes de equipe, produtores e gerentes. Estas serão as pessoas que farão a gestão, tendo a responsabilidade de entregar um produto de qualidade e no prazo estipulado. Registre a formação, experiência, competências e publicações de toda a equipe.</p>
<p>Na indústria esta seção é o foco de toda e qualquer publisher ou investidor, portanto dê a devida atenção.</p>
<h3>16 Orçamento</h3>
<p>A seção Orçamento descreve o custo total de desenvolvimento. Isto contempla custo de tecnologias, salários, recrutamento e assets de arte. O <em>marketing </em>não é normalmente responsabilidade dos desenvolvedores, mas se você está produzindo um título independente, terá que inserir custos desta etapa também.</p>
<h3>Conclusão</h3>
<p>Voltamos então a pergunta título deste post, trabalhar com jogos é uma questão de sorte? Se você entende &#8220;sorte&#8221; por  algo vinculado a destino, posso afirmar que não. Trabalhar com jogos hoje no nosso país é uma questão de empenho, dedicação, estudo e principalmente, maturidade e profissionalismo. Este é um mercado que trabalha com softwares muito complexos, portanto, deve ser tratado com a devida seriedade.</p>
<p>Atualmente existem várias oportunidades para quem deseja ser um desenvolvedor de games no Brasil. Um grande passo para aproveitá-las, como comentado neste artigo, seria montar um Projeto de Jogo detalhado e maduro.</p>
<p>Para finalizar, uma dica de quem está na área há cinco anos e dedica-se da mesma forma. Comece do início, antes de correr, aprenda a equilibrar-se e a andar. Não parta logo de início para um projeto extenso e custoso,  faça jogos pequenos, vários deles, porém finalize todos.</p>
<p>Espero que tenham gostado, um grande abraço e até a próxima!</p>
<h5>Links interessantes</h5>
<address>Pesquisa &#8211; <a href="http://www.mobygames.com">MobyGames </a>; <a href="http://www.planetozkids.com/ozzoom/index.htm">Ozzoom</a></address>
<address>Oportunidades &#8211; <a href="http://www.abragames.org">Abragames</a>; <a href="http://www.brgames2009.com.br/">BRGames</a>; <a href="http://wwwusers.rdc.puc-rio.br/sbgames/09/">SBGames</a><br />
</address>
<h5>Referências</h5>
<address>Artigo Original: <a href="http://www.gamecareerguide.com/features/747/book_extract__creating_games_.php?page=1">Game Carreer Guide -  Creating Games: Mechanics, Content and Tecnhology</a></address>
<address>Ilustrações: <a href="http://josemidesenhos.blogspot.com/">Josemi Bezerra</a><br />
</address>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:0;width:1px;height:1px;">
<h2>8 Diagramas de Progresso</h2>
<p>Criar um fluxograma para mostrar o progresso do jogador no game. Este tipo de diagrama serve como um mapa não linear para uma narrativa. A imagem abaixo apresenta o mapa do game Ultima VII (1992 Origin Systems), é possivel perceber as diferentes decisões a serem tomadas pelo jogador durante sua jornada.<br />
O grafico de progresso também pode ser aplicado para jogos em turnos, descrevendo detalhadamente as atividades de cada fase.</p>
<p><strong>Storyboards</strong></p>
<p>Para jogos com cutscenes e cinematics, identifique estas cenas no diagrama e insira material adicional na forma de storybords e scripts que descrevam a cena. Uma ótima referencia seria o livro <em>Don Bluth&#8217;s The Art of Storyboard </em>[Bluth and Goldman 04].http://www.amazon.com/Don-Bluths-Art-Storyboard-Bluth/dp/1595820078</p>
<h2>9 Direção de Arte</h2>
<p>A seção de direção de arte é a combinação de texto descritivo e imagens que transmitem o estilo gráfico do jogo. Ela normalmente inclui concepções (como da figura abaixo), referencia de artes de livros para inspirar o estilo, instruções de uso da luz em jogos 3D, exemplo de fonts e até limitações definidas pela tecnologia atual.</p>
<p>http://cache.kotaku.com/assets/resources/2007/07/gypsies_900.jpg</p>
<p align="center">
<h2>10 Storyboards de Interface do Usuário</h2>
<p>Para um jogo de computador, a interface do usuário é o instaldor, a tela de título, menus, diálogos, HUD (Head Up Display) e qualquer outro controle ou texto. Cada um destes deve ser devidamente projetado através de uma storyboard gráfico e de conteúdo, apesar do conteúdo ser o foco desta seção. Storyboards podem ser simples esboços que mostram os elementos da GUI (Graphic User Interface), com rótulos indicando a funcionalidade de cada elemento. Fluxogramas são necessários para descrever cada interação do jogador e a resposta do jogo para esta ação.</p>
<h2>11 Arquitetura de Software</h2>
<p>Video games necessitam de um projeto de software complexo. Os documentos de arquitetura descrevem as funcionalidade de cada módulo de programação. Isto inclui o uso de APIS, algoritmos que serão usados para implementá-los, além dos padrões de projetos envolvidos na produção. Esta seção contará com vários diagramas, entre eles:diagramas de classes, diagrama de sequência, de fluxo e o já conhecido diagrama de módulos de sistema. Observe abaixo um exemplo de cada um deles.</p>
<p>Obviamente este post não destina-se a explicar como funciona cada um dos diagramas, porém outros post virão com esta finalidade.</p>
<h2>12 Controles</h2>
<p>Video games dependem de seus esquemas de controle. Um grande jogo pode ser um fracasso se a mecanica de entrada estiver inadequada ou destinada a um público-alvo que não é o mesmo de seu projeto. A seção Controles detalha ambos, o mapeamento dos botões para as funções do jogo e o mapeamento dos algoritmos de entrada para as ações.</p>
<p align="center"><strong>Figure 5.6: Controls for <em>Roadkill</em> on the PlayStation 2 by Red Octane. (Image courtesy of Red Octane/Activision)</strong></p>
<p align="center">
<h2>13 Projeto de Níveis (Level Design)</h2>
<p>A maioria dos games são divididos em níveis que representam uma discreta mudança na dificuldade, como diferente ondas de aliens em Space Invaders. Estes níveis também podem ser representados por novos mapas ou cenários. Em jogos clássicos, como Xadrez, níveis são um tanto vagos (embora podemos considerar a abertura, meio e fim como níveis distintos)</p>
<p>Em jogos com uma forte progreção linear, níveis são normalmente areas em grandes mundos. A progressão nestas áreas deve ser descrita pelo gráfico de progresso da seção anterior. Já para jogos com niveis baseados em locações, você deve criar um mapa para mostrar o layout e conectividade do nível. Indicando encontros, locais com itens e objetivos.</p>
<p>Esta seção em resumo deve preocupar-se em deixar o jogo equilibrado e desafiante. Atualmente é bastante comum encontrarmos editores específicos para esta finalidade, permitindo que um profissional focado nesta área, com pouco conhecimento de programação, possa ter total autonomia para definir cada nível do game. Na verdade podemos pensar ainda um pouco mais longe, existem jogos que deixam o jogador assumir este papel.</p>
<p>Little Big Planet.8 Diagramas de Progresso</p>
<p>Criar um fluxograma para mostrar o progresso do jogador no game. Este tipo de diagrama serve como um mapa não linear para uma narrativa. A imagem abaixo apresenta o mapa do game Ultima VII (1992 Origin Systems), é possivel perceber as diferentes decisões a serem tomadas pelo jogador durante sua jornada.</p>
<p>O grafico de progresso também pode ser aplicado para jogos em turnos, descrevendo detalhadamente as atividades de cada fase.</p>
<p>Storyboards</p>
<p>Para jogos com cutscenes e cinematics, identifique estas cenas no diagrama e insira material adicional na forma de storybords e scripts que descrevam a cena. Uma ótima referencia seria o livro Don Bluth&#8217;s The Art of Storyboard [Bluth and Goldman 04].http://www.amazon.com/Don-Bluths-Art-Storyboard-Bluth/dp/1595820078</p>
<p>9 Direção de Arte</p>
<p>A seção de direção de arte é a combinação de texto descritivo e imagens que transmitem o estilo gráfico do jogo. Ela normalmente inclui concepções (como da figura abaixo), referencia de artes de livros para inspirar o estilo, instruções de uso da luz em jogos 3D, exemplo de fonts e até limitações definidas pela tecnologia atual.</p>
<p>http://cache.kotaku.com/assets/resources/2007/07/gypsies_900.jpg</p>
<p>10 Storyboards de Interface do Usuário</p>
<p>Para um jogo de computador, a interface do usuário é o instaldor, a tela de título, menus, diálogos, HUD (Head Up Display) e qualquer outro controle ou texto. Cada um destes deve ser devidamente projetado através de uma storyboard gráfico e de conteúdo, apesar do conteúdo ser o foco desta seção. Storyboards podem ser simples esboços que mostram os elementos da GUI (Graphic User Interface), com rótulos indicando a funcionalidade de cada elemento. Fluxogramas são necessários para descrever cada interação do jogador e a resposta do jogo para esta ação.</p>
<p>11 Arquitetura de Software</p>
<p>Video games necessitam de um projeto de software complexo. Os documentos de arquitetura descrevem as funcionalidade de cada módulo de programação. Isto inclui o uso de APIS, algoritmos que serão usados para implementá-los, além dos padrões de projetos envolvidos na produção. Esta seção contará com vários diagramas, entre eles:diagramas de classes, diagrama de sequência, de fluxo e o já conhecido diagrama de módulos de sistema. Observe abaixo um exemplo de cada um deles.</p>
<p>Obviamente este post não destina-se a explicar como funciona cada um dos diagramas, porém outros post virão com esta finalidade.</p>
<p>12 Controles</p>
<p>Video games dependem de seus esquemas de controle. Um grande jogo pode ser um fracasso se a mecanica de entrada estiver inadequada ou destinada a um público-alvo que não é o mesmo de seu projeto. A seção Controles detalha ambos, o mapeamento dos botões para as funções do jogo e o mapeamento dos algoritmos de entrada para as ações.</p>
<p>Figure 5.6: Controls for Roadkill on the PlayStation 2 by Red Octane. (Image courtesy of Red Octane/Activision)</p>
<p>13 Projeto de Níveis (Level Design)</p>
<p>A maioria dos games são divididos em níveis que representam uma discreta mudança na dificuldade, como diferente ondas de aliens em Space Invaders. Estes níveis também podem ser representados por novos mapas ou cenários. Em jogos clássicos, como Xadrez, níveis são um tanto vagos (embora podemos considerar a abertura, meio e fim como níveis distintos)</p>
<p>Em jogos com uma forte progreção linear, níveis são normalmente areas em grandes mundos. A progressão nestas áreas deve ser descrita pelo gráfico de progresso da seção anterior. Já para jogos com niveis baseados em locações, você deve criar um mapa para mostrar o layout e conectividade do nível. Indicando encontros, locais com itens e objetivos.</p>
<p>Esta seção em resumo deve preocupar-se em deixar o jogo equilibrado e desafiante. Atualmente é bastante comum encontrarmos editores específicos para esta finalidade, permitindo que um profissional focado nesta área, com pouco conhecimento de programação, possa ter total autonomia para definir cada nível do game. Na verdade podemos pensar ainda um pouco mais longe, existem jogos que deixam o jogador assumir este papel.</p>
<p>Little Big Planet.</p>
</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/724/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/724/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/724/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/724/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/724/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/724/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/724/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/724/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/724/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/724/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=724&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/09/26/trabalhar-com-jogos-e-uma-questao-de-sorte-parte-final/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9a1cec9473510986b8eb2eb64b7b2a2b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Everton Baumgarten</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/ilustracao3.jpg" medium="image">
			<media:title type="html">ilustração3</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/ultimavii.jpg" medium="image">
			<media:title type="html">ultimaVII</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/gypsies_900.jpg" medium="image">
			<media:title type="html">gypsies_900</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/storyboard011.jpg" medium="image">
			<media:title type="html">storyboard01</media:title>
		</media:content>

		<media:content url="http://www.gamedevbr.com/wp-content/arquivos/xna_invasores_diagrama_de_classes.jpg" medium="image">
			<media:title type="html">Diagrama de Classes</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/appa.jpg" medium="image">
			<media:title type="html">appA</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/redoctanecontrols_r1.jpg" medium="image">
			<media:title type="html">redoctanecontrols_r</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/little_big_planet_1280x1024.jpg" medium="image">
			<media:title type="html">little_big_planet_1280x1024</media:title>
		</media:content>
	</item>
		<item>
		<title>GameLoop com taxa constante de pulsos – parte 2 de 2</title>
		<link>http://blog.abrindoojogo.com.br/2009/09/26/gameloop-com-taxa-constante-de-pulsos-%e2%80%93-parte-2-de-2/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/09/26/gameloop-com-taxa-constante-de-pulsos-%e2%80%93-parte-2-de-2/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 02:18:00 +0000</pubDate>
		<dc:creator>Luiz Alessandro Nörnberg</dc:creator>
				<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=743</guid>
		<description><![CDATA[No artigo anterior vimos o game loop em sua forma mais simples, que tem o problema de ter a taxa de pulsos e frames presas uma a outra. Isso faz o jogo correr mais lentamente em CPUs lentas e acelerar em CPU mais poderosas, impedindo uma velocidade estável em todas plataformas. Neste artigo veremos como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=743&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop1.png"><img class="alignleft size-full wp-image-729" title="GameLoop" src="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop1.png?w=200&#038;h=150" alt="GameLoop" width="200" height="150" /></a>No artigo anterior vimos o game loop em sua forma mais simples, que tem o problema de ter a taxa de pulsos e frames presas uma a outra. Isso faz o jogo correr mais lentamente em CPUs lentas e acelerar em CPU mais poderosas, impedindo uma velocidade estável em todas plataformas. Neste artigo veremos como criar um game loop que garanta uma velocidade fixa para o jogo.</p>
<p><span id="more-743"></span>Aprendemos, no post anterior, a diferença entre o pulso e o frame, sendo o primeiro relacionado à lógica do jogo e o segundo à atualização da tela. Tinhamos uma classe Main que criava um objeto do tipo JogoLoopSimples. Vamos modificar essa classe para usar agora um objeto do tipo JogoPulsoFixo.</p>
<p><strong>Arquivo Main.java</strong></p>
<pre><span style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">package</span> abrindoojogo.exemplos.gameloop;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> Main<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">static</span> <span style="color:#0000e6;">void</span> main(String[] args)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>        </span>JogoPulsoFixo jogo = <span style="color:#0000e6;">new</span> JogoPulsoFixo();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>        </span>jogo.gameloop();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span></span>}</span></pre>
<p>O game loop da classe JogoLoopSimples era assim (para relembrar):</p>
<pre><span style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> gameloop()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span>        </span>initialize();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span>        </span><span style="color:#0000e6;">while</span> (<span style="color:#0000e6;">true</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span>            </span>Thread.yield();<span style="color:#000000;">
<strong><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>            </strong></span><strong>update();</strong><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>            </span>render();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>    </span>}</span></pre>
<p>Uma chamada a update() e uma a render(), acopladas. Se render demora, update também demora e o jogo fica lento. Bem, vamos partir do seguinte pressuposto: <strong>é possível &#8220;aturar&#8221; uma taxa de frames baixa, mas uma taxa de pulsos baixa modifica a jogabilidade.</strong></p>
<p>Imagine um jogo onde uma nave se move um pixel por pulso. Se temos 60 pulsos por segundo, ao final de dois segundos a nave terá se movido 120 pixels. Mas se a taxa cair para 10 pulsos por segundo, em dois segundos a nave vai se mover apenas 20 pixels. E mais: se o computador for muito rápido, a taxa pode subir a 100 pulsos por segundo, e a nave vai andar 200 pixels em dois segundos. A jogabilidade é totalmente afetada.</p>
<p>A solução que apresento a seguir tenta manter a taxa de pulsos fixa, em detrimento da taxa de frames. Ou seja, se a máquina é lenta, priorizamos os pulsos e geramos os frames conforme der. Sempre teremos 60 pulsos por segundo, embora a taxa de frames possa cair para 10.</p>
<p>Isso causa o seguinte efeito: a nave vai se mover sempre 120 pixels em dois segundos, independente da velocidade da máquina. Mas se a máquina for lenta, a tela estará sendo atualizada apenas a 10 frames por segundo &#8211; o jogador vai ver a imagem quadro a quadro, mas a jogabilidade não fica tão comprometida, porque não há mudança na velocidade da ação.</p>
<p>E se a máquina for muito rápida, ainda assim ficaremos apenas com 60 pulsos por segundo, embora possamos estar obtendo 100 frames. A atualização da tela será bem rápida, o que é bom, e a nave continua se movendo na velocidade esperada.</p>
<p>Eu mostro abaixo a nova classe, chamada JogoPulsoFixo. Ela é derivada da classe do artigo anterior, de forma que tem tudo igual a ela. A lógica do jogo é exatamente a mesma. Só sobreescrevi o método gameloop, para modificá-lo.</p>
<p><strong>Arquivo JogoPulsoFixo.java</strong></p>
<pre><span style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">package</span> abrindoojogo.exemplos.gameloop;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> JogoPulsoFixo <span style="color:#0000e6;">extends</span> JogoLoopSimples<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span></span>{<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">005</span>    </span></span><span style="color:#ff0000;">long PULSOS_DESEJADOS_POR_SEGUNDO = 60;
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">006</span>    double NANOS_ESPERADOS_POR_PULSO = Contador.NANOS_EM_UM_SEGUNDO / PULSOS_DESEJADOS_POR_SEGUNDO;</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>    </span>@Override<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> gameloop()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span>        </span>initialize();<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">012</span>        </span></span><span style="color:#ff0000;">long nanoTimeDoProximoPulso = System.nanoTime();</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">013</span>        </span><span style="color:#0000e6;">while</span> (<span style="color:#0000e6;">true</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">014</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">015</span>            </span>Thread.yield();<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">016</span>            </span></span><span style="color:#ff0000;">while (System.nanoTime() &gt; nanoTimeDoProximoPulso)
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">017</span>            {
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">018</span>                update();
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">019</span>                nanoTimeDoProximoPulso += NANOS_ESPERADOS_POR_PULSO;
<span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">020</span>            }</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">021</span>            </span>render();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">022</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">023</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">024</span></span>}</span></pre>
<p>A modificação (marcada em vermelho) é simples em termos de código, mas pode ser difícil de entender como funciona. Por isso vou explicar bem detalhadamente.</p>
<p>Nas linhas 005, 006  são declaradas constantes. PULSOS_DESEJADOS_POR_SEGUNDO armazena a quantidade de pulsos que desejamos que o game rode. Nesse caso é 60. Não é necessário mais do que isso para a lógica de qualquer jogo. Alguns rodam a 30 ou 25.</p>
<p>NANOS_ESPERADOS_POR_PULSO armazena a quantidade de nanosegundos que cada pulso deve durar. Calcular isso é fácil: se queremos 60 pulsos por segundo, basta pegar a quantidade total de nanosegundos que cabem em um segundo (1e9 ou  1.000.000.000) e dividir por sessenta pulsos. Cada pulso vai durar, nesse caso, 16.666.666 nanosegundos. Em geral vai durar menos, mas queremos ter um pulso a cada 16.666.666 nanosegundos, de forma a constituir 60 por segundo.</p>
<p>Agora veja o game loop. A grande mudança é que temos um outro laço dentro dele, para chamar repetidamente update(). Funciona assim: inicializamos uma variável chamada nanoTimeDoProximoPulso com o valor no nanosegundo atual. Em seguida entramos no game loop e já caimos no loop do update. É feita a verificação para ver se o nanosegundo atual é maior do que o nanoTimeDoProximoPulso, o que certamente não será, já que acabamos de atribuir o tempo atual a esta variável.</p>
<p>Pois bem. Entramos no loop do update(), chamamos esta rotina e depois adicionamos ao nanoTimeDoProximoPulso a quantidade de nanos esperados em um pulso. Isso nos dá o momento no tempo quando deverá ser executado o próximo pulso. Não executaremos ele antes desse tempo. Por outro lado, passar muito desse tempo, executaremos ele mais de uma vez até recuperar o atraso.</p>
<p>Vamos analisar um exemplo volta a volta do game loop. Respire fundo antes de continuar lendo.</p>
<ol>
<li>Vamos assumir que tudo iniciou com o nanoTime = 0 (zero). Executamos update(), que demora 5.000.000 nanosegundos e somamos 16.666.666 na variável nanoTimeDoProximoPulso. Isso quer dizer que o próximo pulso é esperado para ocorrer nesse tempo.</li>
<li>Como update() demorou apenas 5.000.000 nanosegundos, ainda não chegamos ao 16.666.666 e saimos do loop do update. É executado em seguida o  render(), que demora mais 5.000.000 nanosegundos e voltamos ao início do game loop.</li>
<li>Nova verificação do loop do update. O tempo atual é maior do que 16.666.666? Já que update() levou 5.000.000 e render() mais 5.000.000, estamos em 10.000.000 nanosegundos, que é menor. Não entramos no loop do update, ou seja, desta vez o update() não será executado, porque ainda não está na hora esperada. Executamos o render(), que leva mais 5.000.000 nanosegundos e voltamos ao início do game loop.</li>
<li>Agora já estamos em 15.000.000, mas ainda é menor do que 16.666.666, então pulamos novamente o loop do update e vamos direto para o render. Mais 5.000.000 nanosegundos e voltamos ao início.</li>
<li>Agora sim, estamos em 20.000.000 nanosegundos e isso é maior do que o esperado para o próximo pulso, que deveria ter ocorrido em 16.666.666. Estamos atrasados, mas tudo bem &#8211; agora entramos no loop do update, executamos ele (mais 5.000.000) e somamos mais 16.666.666 na variável nanoTimeDoProximoPulso. Isso quer dizer que agora vamos esperar até o tempo chegar em 33.333.332 para executar update() novamente.</li>
</ol>
<p>Já deu para notar que update está sendo limitado. Praticamente temos três render() para cada update(). Essa é uma máquina rápida. Vamos refazer a análise em uma máquina lenta.</p>
<ol>
<li>Tudo inicia no nanoTime = 0 (zero). Executamos update(), que agora demora 10.000.000 nanosegundos e somamos 16.666.666 na variável nanoTimeDoProximoPulso.</li>
<li>Como update() demorou apenas 9.000.000 nanosegundos, ainda não chegamos ao 16.666.666 e saimos do loop do update. É executado em seguida o  render(), que demora 15.000.000 nanosegundos (placa de vídeo lenta) e voltamos ao início do game loop.</li>
<li>Nova verificação do loop do update e o tempo atual é 25.000.000, ou seja, maior que o 16.666.666 esperado para o próximo pulso. Assim, entramos no loop do update e executamos ele. Mais 10.000.000 se passam e estamos então há 35.000.000 nanosegundos de jogo. Acrescentamos novamente 16.666.666 à variável, ficando com 33.333.332, que seria a hora do próximo pulso.</li>
<li>Mas veja: já estamos em 35.000.000, ou seja, já passou a hora do segundo pulso. Então ficamos dentro do loop do update (porque 35.000.000 é maior que 33.333.332) e vamos executar update mais uma vez. Se passam mais 10.000.000 e estamos em 45.000.000. Somamos novamente 16.666.666 na variável e o próximo pulso fica então esperado para 49.999.998.</li>
<li>Ok, desta vez o tempo atual (45.000.000) é menor do que o esperado para o próximo pulso (49.999.998). Então pulamos o loop do update e vamos para o render(). Executamos ele e, devido aos seus 15.000.000 ficamos em 60.000.000 e voltamos ao início.</li>
</ol>
<p>Já deu para ver que vamos entrar novamente no loop do update porque estamos bem atrasados. Vamos acabar executando o update duas vezes novamente, ou seja, nessa máquina o update executa o dobro de vezes que o render.</p>
<p>Caramba, que explicação cheia de volta&#8230; Entendeu? Espero que sim. Caso contrário, leia novamente o exemplo. Experimente colocar o comando contador.sleep(X), onde X é um número de milisegundos, dentro das rotinas update() e render() no arquivo JogoLoopSimples. Isso vai simular rotinas demoradas. Use valores como 50 ou 100  milisegundos.</p>
<p>Esse game loop mantém a taxa de pulsos fixa (na verdade pode oscilar entre 60 e 62) e pode ser utilizado para a criação de games reais. Mas ele apresenta um problema com máquina muitissimo lentas: pode ser que o update() precise rodar 500 vezes para cada render(). Ou mais! Ou ainda, ficar rodando sem nunca chegar na taxa desejada, e assim nunca executar o update().</p>
<p>Alguma dica de como resolver isso? Se você achar uma solução envie para mim (<strong>nornberg</strong> no gmail). Depois publico um post citando as soluções que aparecerem.</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:786px;width:1px;height:1px;">&lt;pre&gt;&lt;span style=&#8221;font-family:Monospaced,monospace;color:#000000&#8243;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;001&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;package&lt;/span&gt; abrindoojogo.exemplos.gameloop;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;002&lt;/span&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;003&lt;/span&gt;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;public&lt;/span&gt; &lt;span style=&#8221;color:#0000e6;&#8221;&gt;class&lt;/span&gt; JogoPulsoFixo &lt;span style=&#8221;color:#0000e6;&#8221;&gt;extends&lt;/span&gt; JogoLoopSimples&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;004&lt;/span&gt;&lt;/span&gt;{&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;005&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;long&lt;/span&gt; PULSOS_DESEJADOS_POR_SEGUNDO = &lt;span style=&#8221;color:#000000;&#8221;&gt;60&lt;/span&gt;;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;006&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;double&lt;/span&gt; NANOS_ESPERADOS_POR_PULSO = Contador.NANOS_EM_UM_SEGUNDO / PULSOS_DESEJADOS_POR_SEGUNDO;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;007&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;long&lt;/span&gt; MAX_FRAMES_PARA_PULAR = &lt;span style=&#8221;color:#000000;&#8221;&gt;2&lt;/span&gt;;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;008&lt;/span&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;009&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;public&lt;/span&gt; &lt;span style=&#8221;color:#0000e6;&#8221;&gt;void&lt;/span&gt; gameloop()&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;010&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;{&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;011&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;initialize();&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;012&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;long&lt;/span&gt; nanoTimeDoProximoPulso = System.nanoTime();&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;013&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;while&lt;/span&gt; (&lt;span style=&#8221;color:#0000e6;&#8221;&gt;true&lt;/span&gt;)&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;014&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;{&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;015&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Thread.yield();&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;016&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;long&lt;/span&gt; pulsos = &lt;span style=&#8221;color:#000000;&#8221;&gt;0&lt;/span&gt;;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;017&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&#8221;color:#0000e6;&#8221;&gt;while&lt;/span&gt; (System.nanoTime() &amp;gt; nanoTimeDoProximoPulso &amp;amp;&amp;amp; pulsos &amp;lt; MAX_FRAMES_PARA_PULAR)&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;018&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;{&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;019&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;update();&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;020&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;nanoTimeDoProximoPulso += NANOS_ESPERADOS_POR_PULSO;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;021&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;pulsos++;&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;022&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;023&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;render();&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;024&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;025&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;span style=&#8221;color:#000000;&#8221;&gt;&lt;br/&gt;&lt;span style=&#8217;color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px&#8217;&gt;026&lt;/span&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/743/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=743&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/09/26/gameloop-com-taxa-constante-de-pulsos-%e2%80%93-parte-2-de-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835c2a89e65f8dbe1d3786e83de73f42?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Nörnberg</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop1.png" medium="image">
			<media:title type="html">GameLoop</media:title>
		</media:content>
	</item>
		<item>
		<title>GameLoop com taxa constante de pulsos &#8211; parte 1 de 2</title>
		<link>http://blog.abrindoojogo.com.br/2009/09/25/gameloop-com-taxa-constante-de-pulsos-parte-1-de-2/</link>
		<comments>http://blog.abrindoojogo.com.br/2009/09/25/gameloop-com-taxa-constante-de-pulsos-parte-1-de-2/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 03:31:02 +0000</pubDate>
		<dc:creator>Luiz Alessandro Nörnberg</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://blog.abrindoojogo.com.br/?p=727</guid>
		<description><![CDATA[
O coração de qualquer jogo é o game loop, um laço que fica sendo repetido durante toda execução do jogo. A cada volta desse laço temos um novo frame de jogo. Mas você sabe que a taxa de frames pode variar muito de um hardware para outro. Como manter a lógica do jogo rodando a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=727&subd=evertonbaumgarten&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop1.png"><img class="alignleft size-full wp-image-729" title="GameLoop" src="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop1.png?w=200&#038;h=150" alt="GameLoop" width="200" height="150" /></a></p>
<p>O coração de qualquer jogo é o <em>game loop</em>, um laço que fica sendo repetido durante toda execução do jogo. A cada volta desse laço temos um novo frame de jogo. Mas você sabe que a taxa de frames pode variar muito de um hardware para outro. Como manter a lógica do jogo rodando a uma velocidade fixa, independente da variação nos frames?<br />
<span id="more-727"></span><br />
Quando jogamos, o que vemos na tela é uma sucessão de quadros que nos dá a impressão de movimento. Isso é chamado animação e tenho certeza que você já conhece seus princípios. Em geral somos levados a crer que, a cada quadro novo que vemos, algo mudou no estado do jogo. Se uma nave está se movendo, a cada quadro ela estará, digamos, um pixel para a direita.</p>
<p>É o <em>game loop</em>, o laço principal do jogo, que emite o que podemos chamar de <strong>pulsos </strong>para atualizar o estado do jogo (<em><strong>update</strong></em>) e redesenhar a imagem na tela (<em><strong>render</strong></em>). Em sua forma mais simples, a cada volta do <em>game loop</em> temos um pulso para <em>update </em>e um para <em>render</em>. Mas estas duas tarefas não precisam ser sempre sincronizadas. Na verdade, é melhor que não sejam.</p>
<p>Vamos contruir um programa de exemplo para estudar mais a fundo o <em>game loop</em>. Neste post vamos ver o <em>loop </em>mais simples e entender sua limitação. No próximo veremos como desacoplar o <em>update </em>do <em>render</em>, de forma que o <em>update </em>rode sempre a uma determinada velocidade e o <em>render </em>rode o mais rápido que puder.</p>
<p><strong>Arquivo Main.java</strong></p>
<div style="overflow:scroll;border:1px solid #cccccc;">
<pre><span style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">package</span> abrindoojogo.exemplos.gameloop;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> Main<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">static</span> <span style="color:#0000e6;">void</span> main(String[] args)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>        </span>JogoLoopSimples jogo = <span style="color:#0000e6;">new</span> JogoLoopSimples();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>        </span>jogo.gameloop();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span></span>}</span></pre>
</div>
<p>Esta classe simplesmente cria um objeto do tipo JogoLoopSimples e chama seu método gameloop() que vai rodar o jogo. A seguir a classe do jogo em sí, que possui o game loop.</p>
<p><strong>Arquivo JogoLoopSimples</strong></p>
<div style="overflow:scroll;border:1px solid #cccccc;">
<pre><span style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">package</span> abrindoojogo.exemplos.gameloop;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span></span><span style="color:#0000e6;">import</span> java.awt.Color;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span></span><span style="color:#0000e6;">import</span> java.awt.Dimension;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span></span><span style="color:#0000e6;">import</span> java.awt.Graphics2D;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span></span><span style="color:#0000e6;">import</span> java.awt.Toolkit;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span></span><span style="color:#0000e6;">import</span> java.awt.event.KeyEvent;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span></span><span style="color:#0000e6;">import</span> java.awt.event.KeyListener;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span></span><span style="color:#0000e6;">import</span> java.awt.image.BufferStrategy;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span></span><span style="color:#0000e6;">import</span> javax.swing.JFrame;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span></span><span style="color:#0000e6;">import</span> javax.swing.WindowConstants;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">012</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">013</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> JogoLoopSimples <span style="color:#0000e6;">extends</span> JFrame <span style="color:#0000e6;">implements</span> KeyListener<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">014</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">015</span>    </span>BufferStrategy bs;<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">016</span>    </span></span><span style="color:#ff0000;">Contador contador;</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">017</span>    </span><span style="color:#0000e6;">int</span> nave_x, nave_y, nave_qtd;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">018</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">019</span>    </span><span style="color:#0000e6;">public</span> JogoLoopSimples()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">020</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">021</span>        </span>setUndecorated(<span style="color:#0000e6;">true</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">022</span>        </span>setSize(<span style="color:#000000;">800</span>, <span style="color:#000000;">600</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">023</span>        </span>Dimension d = Toolkit.getDefaultToolkit().getScreenSize();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">024</span>        </span>setLocation(d.width / <span style="color:#000000;">2</span> - <span style="color:#000000;">400</span>, d.height / <span style="color:#000000;">2</span> - <span style="color:#000000;">300</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">025</span>        </span>setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">026</span>        </span>setIgnoreRepaint(<span style="color:#0000e6;">true</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">027</span>        </span>addKeyListener(<span style="color:#0000e6;">this</span>);<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">028</span>        </span></span><span style="color:#ff0000;">contador = new Contador();</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">029</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">030</span>
<strong><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">031</span>    </strong></span><strong><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> gameloop()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">032</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">033</span>        </span>initialize();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">034</span>        </span><span style="color:#0000e6;">while</span> (<span style="color:#0000e6;">true</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">035</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">036</span>            </span>Thread.yield();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">037</span>            </span>update();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">038</span>            </span>render();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">039</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">040</span>    </span>}</strong><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">041</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">042</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> initialize()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">043</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">044</span>        </span>setVisible(<span style="color:#0000e6;">true</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">045</span>        </span>createBufferStrategy(<span style="color:#000000;">2</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">046</span>        </span>bs = getBufferStrategy();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">047</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">048</span>        </span>nave_x = <span style="color:#000000;">400</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">049</span>        </span>nave_y = <span style="color:#000000;">50</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">050</span>        </span>nave_qtd = <span style="color:#000000;">1</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">051</span>
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">052</span>        </span></span><span style="color:#ff0000;">contador.inicia();</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">053</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">054</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">055</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> update()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">056</span>    </span>{<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">057</span>        </span></span><span style="color:#ff0000;">contador.contaPulso();</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">058</span>        </span>nave_x += <span style="color:#000000;">1</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">059</span>        </span><span style="color:#0000e6;">if</span> (nave_x &gt; getWidth() + <span style="color:#000000;">30</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">060</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">061</span>            </span>nave_x = <span style="color:#000000;">0</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">062</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">063</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">064</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">065</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> render()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">066</span>    </span>{<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">067</span>        </span></span><span style="color:#ff0000;">contador.contaFrame();</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">068</span>        </span>Graphics2D g = (Graphics2D) bs.getDrawGraphics();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">069</span>        </span>g.setColor(Color.black);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">070</span>        </span>g.fillRect(<span style="color:#000000;">0</span>, <span style="color:#000000;">0</span>, getWidth(), getHeight());<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">071</span>        </span><span style="color:#0000e6;">int</span> x = nave_x;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">072</span>        </span><span style="color:#0000e6;">int</span> y = nave_y;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">073</span>        </span><span style="color:#0000e6;">for</span> (<span style="color:#0000e6;">int</span> i = <span style="color:#000000;">0</span>; i &lt; nave_qtd; i++)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">074</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">075</span>            </span>g.setColor(Color.yellow);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">076</span>            </span>g.drawLine(x, y, x - <span style="color:#000000;">20</span>, y - <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">077</span>            </span>g.drawLine(x, y, x - <span style="color:#000000;">20</span>, y + <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">078</span>            </span>g.drawLine(x - <span style="color:#000000;">20</span>, y - <span style="color:#000000;">5</span>, x - <span style="color:#000000;">20</span>, y + <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">079</span>            </span>y += <span style="color:#000000;">15</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">080</span>            </span><span style="color:#0000e6;">if</span> (y &gt; <span style="color:#000000;">550</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">081</span>            </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">082</span>                </span>y = nave_y;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">083</span>                </span>x += <span style="color:#000000;">15</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">084</span>            </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">085</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">086</span>        </span>g.setColor(Color.white);<span style="color:#000000;">
<span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">087</span></span>        </span>g.drawString(<span style="color:#ce7b00;">"Pulsos: "</span> + <span style="color:#ff0000;">contador.getPulsosPorSegundo()</span> + <span style="color:#ce7b00;">"  Frames: "</span> + <span style="color:#ff0000;">contador.getFramesPorSegundo()</span> + <span style="color:#ce7b00;">"          naves: "</span> + nave_qtd, <span style="color:#000000;">10</span>, <span style="color:#000000;">20</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">088</span>        </span>g.dispose();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">089</span>        </span>bs.show();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">090</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">091</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">092</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> keyPressed(KeyEvent e)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">093</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">094</span>        </span><span style="color:#0000e6;">if</span> (e.getKeyCode() == KeyEvent.VK_ESCAPE)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">095</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">096</span>            </span>System.exit(<span style="color:#000000;">0</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">097</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">098</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">099</span>        </span><span style="color:#0000e6;">if</span> (e.getKeyCode() == KeyEvent.VK_UP)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">100</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">101</span>            </span>nave_y -= <span style="color:#000000;">1</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">102</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">103</span>        </span><span style="color:#0000e6;">if</span> (e.getKeyCode() == KeyEvent.VK_DOWN)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">104</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">105</span>            </span>nave_y += <span style="color:#000000;">1</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">106</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">107</span>        </span><span style="color:#0000e6;">if</span> (e.getKeyCode() == KeyEvent.VK_RIGHT)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">108</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">109</span>            </span><span style="color:#0000e6;">if</span> (nave_qtd &lt; <span style="color:#000000;">1054</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">110</span>            </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">111</span>                </span>nave_qtd += <span style="color:#000000;">1</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">112</span>            </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">113</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">114</span>        </span><span style="color:#0000e6;">if</span> (e.getKeyCode() == KeyEvent.VK_LEFT)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">115</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">116</span>            </span><span style="color:#0000e6;">if</span> (nave_qtd &gt; <span style="color:#000000;">1</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">117</span>            </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">118</span>                </span>nave_qtd -= <span style="color:#000000;">1</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">119</span>            </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">120</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">121</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">122</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">123</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> keyReleased(KeyEvent e)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">124</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">125</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">126</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">127</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> keyTyped(KeyEvent e)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">128</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">129</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">130</span></span>}</span></pre>
</div>
<p>Vejamos os métodos mais importantes. O contructor faz bastante coisa de configuração, mas tudo com relação à janela do jogo. É tirada a decoração (título, borda, etc) ficando apenas um quadro centralizado no vídeo. É centralizado baseado no tamanho da tela, obtida por meio de Toolkit.getDefaultToolkit().getScreenSize().  Boa parte desse código é parecida com o que foi mostrado no post <a href="http://blog.abrindoojogo.com.br/2009/09/18/passive-vs-active-rendering-%E2%80%93-parte-2-de-2/">Passive VS Active Rendering</a>. Note, no entando na criação do objeto &#8220;contador&#8221;. Ele será utilizado para contar quantos pulsos e quantos <em>frames </em>obteremos. Os pontos onde ele é utilizado estão destacados em vermelho.</p>
<p>O jogo é muito simples &#8211; na verdade nem é um jogo. O método update() incrementa a variável nave_x, fazendo ela ir até a direita da tela e então recomeçar da esquerda. Quando uma tecla é pressionada, o método keyPressed modifica a variável nave_y, fazendo a posição subir ou descer, ou aumenta/diminui a variável nave_qtd, que informa quantos sprites teremos na tela.</p>
<p>O método render() limpa a tela, desenha a &#8220;nave&#8221; (um triângulo feito com linhas) dentro de um <em>loop </em>que vai repetir o desenho tantas vezes quanto for o valor de nave_qtd. Depois mostra na tela os valores de pulsos por segundo e <em>frames </em>por segundos do contador.</p>
<p>Note que toda vez que o método update() é executado, dentro dele é chamado o contador.contaPulso(). E no método render() é chamado contador.contaFrame(). Assim estamos contando quantas vezes estes dois métodos são chamados.</p>
<p>Nosso game loop é a versão mais simples possível, reproduzida abaixo.</p>
<div style="overflow:scroll;border:1px solid #cccccc;">
<pre><span style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">031</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> gameloop()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">032</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">033</span>        </span>initialize();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">034</span>        </span><span style="color:#0000e6;">while</span> (<span style="color:#0000e6;">true</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">035</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">036</span>            </span>Thread.yield();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">037</span>            </span>update();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">038</span>            </span>render();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">039</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">040</span>    </span>}</span></pre>
</div>
<p>É chamado update() e depois render(), um após o outro sem nenhum controle mais elaborado. O método yield() faz o programa interromper rapidamente seu processamento para que o resto do sistema tenha tempo de CPU. Usar ele faz o programa parar um pouco para escutar o teclado. Sem ele, um pressionar de tecla pode ser perdido.</p>
<p>Finalmente vejamos o código do contador.</p>
<p><strong>Arquivo Contador.java</strong></p>
<div style="overflow:scroll;border:1px solid #cccccc;">
<pre><span style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#0000e6;">package</span> abrindoojogo.exemplos.gameloop;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span></span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">class</span> Contador<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span></span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span>    </span><span style="color:#0000e6;">static</span> <span style="color:#0000e6;">public</span> <span style="color:#0000e6;">double</span> NANOS_EM_UM_SEGUNDO = <span style="color:#000000;">1e9</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span>    </span><span style="color:#0000e6;">protected</span> <span style="color:#0000e6;">long</span> pulsosPorSegundo;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>    </span><span style="color:#0000e6;">protected</span> <span style="color:#0000e6;">long</span> framesPorSegundo;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>    </span><span style="color:#0000e6;">protected</span> <span style="color:#0000e6;">long</span> nanoTimeAnterior;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>    </span><span style="color:#0000e6;">protected</span> <span style="color:#0000e6;">long</span> pulsosContados;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>    </span><span style="color:#0000e6;">protected</span> <span style="color:#0000e6;">long</span> framesContados;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">012</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> inicia()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">013</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">014</span>        </span>nanoTimeAnterior = System.nanoTime();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">015</span>        </span>pulsosContados = <span style="color:#000000;">0</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">016</span>        </span>framesContados = <span style="color:#000000;">0</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">017</span>        </span>pulsosPorSegundo = <span style="color:#000000;">0</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">018</span>        </span>framesPorSegundo = <span style="color:#000000;">0</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">019</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">020</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">021</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> contaPulso()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">022</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">023</span>        </span>pulsosContados++;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">024</span>        </span>verifica();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">025</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">026</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">027</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> contaFrame()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">028</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">029</span>        </span>framesContados++;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">030</span>        </span>verifica();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">031</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">032</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">033</span>    </span><span style="color:#0000e6;">protected</span> <span style="color:#0000e6;">void</span> verifica()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">034</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">035</span>        </span><span style="color:#0000e6;">if</span> (System.nanoTime() - nanoTimeAnterior &gt; NANOS_EM_UM_SEGUNDO)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">036</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">037</span>            </span>pulsosPorSegundo = pulsosContados;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">038</span>            </span>framesPorSegundo = framesContados;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">039</span>            </span>pulsosContados = <span style="color:#000000;">0</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">040</span>            </span>framesContados = <span style="color:#000000;">0</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">041</span>            </span>nanoTimeAnterior = System.nanoTime();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">042</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">043</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">044</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">045</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> sleep(<span style="color:#0000e6;">long</span> miliSecondsToSleep)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">046</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">047</span>        </span><span style="color:#0000e6;">try</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">048</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">049</span>            </span>Thread.sleep(miliSecondsToSleep);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">050</span>        </span>} <span style="color:#0000e6;">catch</span> (Exception e)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">051</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">052</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">053</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">054</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">055</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">long</span> getPulsosPorSegundo()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">056</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">057</span>        </span><span style="color:#0000e6;">return</span> pulsosPorSegundo;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">058</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">059</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">060</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">long</span> getFramesPorSegundo()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">061</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">062</span>        </span><span style="color:#0000e6;">return</span> framesPorSegundo;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">063</span>    </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">064</span></span>}</span></pre>
</div>
<p>O trabalho desta classe é interessante: cada vez que chamamos o método contaPulso(), ela incrementa o contador de pulsos e chama o método verifica() que testa se já passou um segundo desde a última verificação. Se sim, ele atribui a quantidade de pulsos contados para a variável pulsosPorSegundo. Assim, esta variável é atualizada a cada segundo com a quantidade de pulsos que ocorreram. Nesse momento o contador de pulsos é zerado para contar quantos pulsos ocorrerão no próximo segundo. A mesma coisa para a contagem de frames.</p>
<p>O tempo é medido em nanosegundos, que é bem menor que os milisegundos geralmente utilizados nos programas. Um segundo contém 1.000 milisegundos, ou seja, <strong>1e3</strong> (mil). E possui 1.000.000.000 nano segundos, ou seja, <strong>1e9</strong> (um milhão). Esse valor está registrado na constante NANOS_EM_UM_SEGUNDO para ser utilizado nos cálculos.</p>
<p>Essa classe oferece ainda um método utilitário chamado sleep(), que servirá para realizarmos alguns testes. Ele simplifica o uso do método sleep() de Thread, que precisa de um <em>try-catch</em> para ser usado. Ele faz o processamento parar durante os milisegundos informados.</p>
<p>Executando esse programa, obtenho o seguinte resultado (só mostro o canto da tela):</p>
<p><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop01.png"><img class="aligncenter size-full wp-image-732" title="GameLoop01" src="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop01.png?w=400&#038;h=100" alt="GameLoop01" width="400" height="100" /></a>Conforme os dados do contador mostrados, tenho 47 pulsos por segundo e também 47 frames. Naturalmente estes números serão sempre iguais, porque dentro do loop chamo uma vez update() e uma vez o render().</p>
<p>Se eu desejasse 60 fps (<em>frames </em>por segundo), não seria possível. 47 é tudo que eu consigo no meu computador e ainda fica variando. Se eu pressiono a seta para direita, aumentando a quantidade de <em>sprites </em>até 1054, a taxa de <em>frames </em>cai mais um pouco.</p>
<p><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop02.png"><img class="aligncenter size-full wp-image-733" title="GameLoop02" src="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop02.png?w=400&#038;h=100" alt="GameLoop02" width="400" height="100" /></a>Talvez seu computador seja bem mais rápid e mesmo aumentando os <em>sprites </em>a taxa de frames não apresente muita diferença. Vamos fazer um teste mais exagerado. Chamaremos o método contador.sleep() dentro do método render(), de forma a fazer este método demorar alguns milisegundos a mais.</p>
<div style="overflow:scroll;border:1px solid #cccccc;">
<pre><span style="font-family:Monospaced,monospace;color:#000000;"><span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">001</span><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">002</span>
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">003</span>    </span><span style="color:#0000e6;">public</span> <span style="color:#0000e6;">void</span> render()<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">004</span>    </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">005</span>        </span>contador.contaFrame();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">006</span>        </span>Graphics2D g = (Graphics2D) bs.getDrawGraphics();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">007</span>        </span>g.setColor(Color.black);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">008</span>        </span>g.fillRect(<span style="color:#000000;">0</span>, <span style="color:#000000;">0</span>, getWidth(), getHeight());<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">009</span>        </span><span style="color:#0000e6;">int</span> x = nave_x;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">010</span>        </span><span style="color:#0000e6;">int</span> y = nave_y;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">011</span>        </span><span style="color:#0000e6;">for</span> (<span style="color:#0000e6;">int</span> i = <span style="color:#000000;">0</span>; i &lt; nave_qtd; i++)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">012</span>        </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">013</span>            </span>g.setColor(Color.yellow);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">014</span>            </span>g.drawLine(x, y, x - <span style="color:#000000;">20</span>, y - <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">015</span>            </span>g.drawLine(x, y, x - <span style="color:#000000;">20</span>, y + <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">016</span>            </span>g.drawLine(x - <span style="color:#000000;">20</span>, y - <span style="color:#000000;">5</span>, x - <span style="color:#000000;">20</span>, y + <span style="color:#000000;">5</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">017</span>            </span>y += <span style="color:#000000;">15</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">018</span>            </span><span style="color:#0000e6;">if</span> (y &gt; <span style="color:#000000;">550</span>)<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">019</span>            </span>{<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">020</span>                </span>y = nave_y;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">021</span>                </span>x += <span style="color:#000000;">15</span>;<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">022</span>            </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">023</span>        </span>}<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">024</span>        </span>g.setColor(Color.white);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">025</span>        </span>g.drawString(<span style="color:#ce7b00;">"Pulsos: "</span> + contador.getPulsosPorSegundo() + <span style="color:#ce7b00;">"  Frames: "</span> + contador.getFramesPorSegundo() + <span style="color:#ce7b00;">"          naves: "</span> + nave_qtd, <span style="color:#000000;">10</span>, <span style="color:#000000;">20</span>);<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">026</span>        </span>g.dispose();<span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">027</span>        </span>bs.show();<span style="color:#000000;">
<strong><span style="color:#ff0000;"><span style="border-right:1px solid #999999;background-color:#dddddd;margin-right:5px;padding:2px;">028</span>        </span></strong></span><strong><span style="color:#ff0000;">contador.sleep(50);</span></strong><span style="color:#000000;">
<span style="color:#666;background-color:#DDD;border-right:1px #999 solid;margin-right:5px;padding:2px;">029</span>    </span>}</span></pre>
</div>
<p>Agora sim. O tempo de atualizar a tela (render) leva absurdos 50 ms (milisegundos). Absolutamente lento demais. A taxa de <strong>frames </strong>cai para 14 na minha máquina.</p>
<p><a href="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop03.png"><img class="aligncenter size-full wp-image-734" title="GameLoop03" src="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop03.png?w=400&#038;h=100" alt="GameLoop03" width="400" height="100" /></a>Agora preste atenção na parte mais importante: <strong>a taxa de pulsos por segundo cai junto com os frames</strong>, embora apenas a rotina render() tenha recebido o tempo a mais. Isso ocorre porque como uma rotina é chamada depois da outra, em sequencia, update() tem que esperar render() executar para ser executada novamente.</p>
<p>Rodando o jogo você percebe que não é apenas a taxa de atualização da tela que fica lenta, <strong>mas o jogo todo</strong>. A nave agora leva uma eternidade para chegar até a extremidade da tela, porque temos apenas 14 pulsos de atualização da sua posição por segundo.</p>
<p>Está comprovado o problema. No próximo post a solução. Até amanhã.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evertonbaumgarten.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evertonbaumgarten.wordpress.com/727/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evertonbaumgarten.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evertonbaumgarten.wordpress.com/727/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evertonbaumgarten.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evertonbaumgarten.wordpress.com/727/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evertonbaumgarten.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evertonbaumgarten.wordpress.com/727/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evertonbaumgarten.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evertonbaumgarten.wordpress.com/727/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abrindoojogo.com.br&blog=4942331&post=727&subd=evertonbaumgarten&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.abrindoojogo.com.br/2009/09/25/gameloop-com-taxa-constante-de-pulsos-parte-1-de-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835c2a89e65f8dbe1d3786e83de73f42?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Nörnberg</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop1.png" medium="image">
			<media:title type="html">GameLoop</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop01.png" medium="image">
			<media:title type="html">GameLoop01</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop02.png" medium="image">
			<media:title type="html">GameLoop02</media:title>
		</media:content>

		<media:content url="http://evertonbaumgarten.files.wordpress.com/2009/09/gameloop03.png" medium="image">
			<media:title type="html">GameLoop03</media:title>
		</media:content>
	</item>
	</channel>
</rss>