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

<channel>
	<title>Abrindo o Jogo &#187; Técnico</title>
	<atom:link href="http://abrindoojogo.com.br/category/tecnico/feed" rel="self" type="application/rss+xml" />
	<link>http://abrindoojogo.com.br</link>
	<description></description>
	<lastBuildDate>Mon, 06 Feb 2012 10:00:08 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<copyright>Copyright © Abrindo o Jogo 2011 </copyright>
	<managingEditor>contato@abrindoojogo.com.br (Abrindo o Jogo)</managingEditor>
	<webMaster>contato@abrindoojogo.com.br (Abrindo o Jogo)</webMaster>
	<ttl>1440</ttl>
	<image>
		<url>http://abrindoojogo.com.br/files/logoItunes_144.jpg</url>
		<title>Abrindo o Jogo</title>
		<link>http://abrindoojogo.com.br</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle>PodAbrir - o Podcast do Abrindo o Jogo.</itunes:subtitle>
	<itunes:summary>Dicas e opiniões sobre a indústria dos games, abordando desde o desenvolvimento até o mercado.</itunes:summary>
	<itunes:keywords>jogos, game, development, desenvolvimento, indie, programming</itunes:keywords>
	<itunes:category text="Games &#38; Hobbies">
		<itunes:category text="Video Games" />
	</itunes:category>
	<itunes:category text="Technology" />
	<itunes:author>Abrindo o Jogo</itunes:author>
	<itunes:owner>
		<itunes:name>Abrindo o Jogo</itunes:name>
		<itunes:email>contato@abrindoojogo.com.br</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://abrindoojogo.com.br/files/logoItunes_600.jpg" />
		<item>
		<title>Tutorial HTML 5 &#8211; Parte 1/3</title>
		<link>http://abrindoojogo.com.br/tutorial-html-5-parte-13</link>
		<comments>http://abrindoojogo.com.br/tutorial-html-5-parte-13#comments</comments>
		<pubDate>Wed, 11 Jan 2012 21:35:07 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Técnico]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> aojNewImage<span style="color: #009900;">&#40;</span>imgURL<span style="color: #339933;">,</span> optionalLoadCallback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> img <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    img.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> imgURL<span style="color: #339933;">;</span>
    img.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> optionalLoadCallback<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> img<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> aojDrawImage<span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> _aojCanvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> x <span style="color: #339933;">-</span> img.<span style="color: #660066;">width</span> <span style="color: #009966; font-style: italic;">/ 2, y - img.height /</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>_aojShowImageCenter<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">*</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        ctx.<span style="color: #660066;">fill</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> aojDrawImageScale<span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> sx<span style="color: #339933;">,</span> sy<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> _aojCanvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">translate</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">scale</span><span style="color: #009900;">&#40;</span>sx<span style="color: #339933;">,</span> sy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> <span style="color: #339933;">-</span>img.<span style="color: #660066;">width</span> <span style="color: #009966; font-style: italic;">/ 2, -img.height /</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">scale</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">/</span>sx<span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">/</span>sy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ctx.<span style="color: #660066;">translate</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>x<span style="color: #339933;">,</span> <span style="color: #339933;">-</span>y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>_aojShowImageCenter<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">*</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        ctx.<span style="color: #660066;">fill</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No arquivo aojcanva.js existem outras funções deste tipo. Este arquivo e os demais estão no Zip no final da página.</p>
<h2>Conclusão</h2>
<p>Neste artigo vimos o basico da utilização do canvas para mostrar imagens.</p>
<p>No site abaixo há um guia de referência do canvas para ser impresso, com todos os comandos. O Autor (Jacob Seidelin) também escreveu um livro sobre jogos em HTML 5.<br />
<a href="http://blog.nihilogic.dk/2009/02/html5-canvas-cheat-sheet.html" target="_blank">http://blog.nihilogic.dk/2009/02/html5-canvas-cheat-sheet.html</a></p>
<p>No próximo artigo veremos como implementar um game loop e utilizar o teclado e mouse.</p>
<ul>
<li><a href="http://www.abrindoojogo.com.br/files/tutorial-html5/01/" target="_blank">Visualizar o exemplo funcionando</a></li>
<li><a href="http://abrindoojogo.com.br/wp-content/uploads/2012/01/AoJ-tutorial-HTML5-01.zip">Baixar o código fonte do exemplo</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/tutorial-html-5-parte-13/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How-to: Configuração do Google PlayN</title>
		<link>http://abrindoojogo.com.br/tutorial-de-configuracao-do-google-playn</link>
		<comments>http://abrindoojogo.com.br/tutorial-de-configuracao-do-google-playn#comments</comments>
		<pubDate>Thu, 10 Nov 2011 04:54:53 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Técnico]]></category>
		<category><![CDATA[how-to]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3407</guid>
		<description><![CDATA[Google vem desenvolvendo a certo tempo uma biblioteca para criação de jogos que promete facilitar o desenvolvimento multiplataforma. A PlayN, como é chamada hoje, permite o desenvolvimento de jogos utilizando a linguagem Java e uma API própria, e gera automaticamente o código do jogo em HTML5, Android e Flash. Parece incrível e é, mas a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/11/ImgPlayN1.png"><img class="alignleft size-full wp-image-3423" title="ImgPlayN" src="http://abrindoojogo.com.br/wp-content/uploads/2011/11/ImgPlayN1.png" alt="" width="200" height="200" /></a>Google vem desenvolvendo a certo tempo uma biblioteca para criação de jogos que promete facilitar o desenvolvimento multiplataforma. A <strong>PlayN</strong>, como é chamada hoje, permite o desenvolvimento de jogos utilizando a linguagem Java e uma API própria, e gera automaticamente o código do jogo em HTML5, Android e Flash.</p>
<p>Parece incrível e é, mas a configuração do ambiente ainda é um desafio para quem não está acostumado a trabalhar com Git, Maven, Ant e outros diretamente. Nesse curto passo a passo mostramos como configurar PlayN no Eclipse.</p>
<p><span id="more-3407"></span></p>
<p>O projeto PlayN está passando por modificações neste exato momento. Por isso este passo a passo acabou demorando mais do que eu gostaria &#8211; depois que prometi ele, o PlayN simplesmente parou de funcionar em função da atualização da API do Android. Hoje este problema está resolvido, mas para isso o PlayN não vem mais com o pacote de samples &#8211; demonstrações do uso da plataforma. Eles poderão ser baixados separadamente em breve &#8211; quando ocorrer, informamos aqui.</p>
<h3>[ATUALIZAÇÃO]</h3>
<p>O PlayN está agora disponível no Maven Central, que é um repositório público. Isso facilita muito o processo todo, já que não é preciso baixar todos os fontes do PlayN para a máquina para poder utilizá-lo &#8211; só é preciso criar um novo projeto do tipo Maven e basear ele no arquétipo desejado do Maven Central.</p>
<p>Incluí abaixo o how-to para criar um novo projeto do PlayN no NetBeans, que é mais amigável que o Eclipse, mas o processo é praticamente o mesmo para ambos.</p>
<p>Todo o processo é feito em uma máquina limpa, sem nada previamente instalado. Utilizei o Netbeans 7.0.1 recém instalado e com todas atualizações aplicadas.</p>
<p>Os dados para o arquétipo de projeto são os seguintes:</p>
<div>
<ul>
<li>group: com.googlecode.playn</li>
<li>artefato: playn-archetype</li>
<li>versão: 1.0.1</li>
</ul>
</div>
<div>
<ul>
<li><a href="https://docs.google.com/present/view?id=dgmf7xht_617gd44jvfz" target="_blank">Clique aqui para ver a apresentação.</a></li>
</ul>
</div>
<p><strong>Segue post original.</strong></p>
<p>Este how-to está longe de ser à prova de falhas &#8211; muita coisa depende da configuração da sua máquina se você já tiver o Eclipse ou Maven instalado. Se você não tem nada disso, é provável que a coisa funcione sem problemas.</p>
<p>Um problema que tive foi o Eclipse rodar com JRE, que é run-time do Java para usuários finais, não para desenvolvimento. E com isso não conseguir compilar algumas coisas. Se você desconfiar que seu problema é esse, recomendo desinstalar temporariamente o JRE e deixar instalado apenas o JDK (versão de desenvolvimento do Java). Se o Eclipse não iniciar, por não achar mais o Java, abra o arquivo eclipse.ini (que fica na pasta do Eclipse) e acrescente a ele as seguintes linhas (são duas):</p>
<pre>-vm
C:\Program Files\Java\jdk1.7.0_01\jre\bin\client\jvm.dll</pre>
<p>O caminho do Java pode variar conforme sua configuração, principalmente a versão.</p>
<ul>
<li><a href="https://docs.google.com/present/view?id=dgmf7xht_546sm5qzdx" target="_blank">Clique aqui para ver a apresentação do how-to e boa sorte</a>.</li>
</ul>
<p>Sites citados:</p>
<ul>
<li><a href="http://eclipse.org/" target="_blank">Eclipse</a></li>
</ul>
<ul>
<li><a href="https://developers.google.com/playn/" target="_blank">PlayN</a>
<ul>
<li>Endereço do repositório para obter o PlayN:
<p>https://code.google.com/p/playn</li>
</ul>
</li>
</ul>
<ul>
<li><a href="http://code.google.com/eclipse/" target="_blank">Plugin do Google para o Eclipse</a>
<ul>
<li>Endereço para instalação de novo software no Eclipse:
<p>http://dl.google.com/eclipse/plugin/3.7</li>
</ul>
</li>
</ul>
<ul>
<li>Plugin de integração do Maven com o Web Tools Plataform do Eclipse
<ul>
<li>Endereço para instalação de novo software no Eclipse:
<p>http://download.jboss.org/jbosstools/updates/m2eclipse-wtp</li>
</ul>
</li>
</ul>
<ul>
<li><a href="http://developer.android.com/sdk/eclipse-adt.html" target="_blank">Plugin ADT (Android Development Tools) para Eclipse</a> (não necessário para o tutorial acima)
<ul>
<li>Endereço para instalação de novo software no Eclipse:
<p>https://dl-ssl.google.com/android/eclipse/</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/tutorial-de-configuracao-do-google-playn/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>HTML 5 &#8211; futuro dos jogos para web?</title>
		<link>http://abrindoojogo.com.br/html-5-futuro-dos-jogos-para-web</link>
		<comments>http://abrindoojogo.com.br/html-5-futuro-dos-jogos-para-web#comments</comments>
		<pubDate>Thu, 27 Oct 2011 01:59:26 +0000</pubDate>
		<dc:creator>Luiz Nörnberg</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Negócios]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3340</guid>
		<description><![CDATA[Com a geração atual de navegadores, e com a atualização do padrão HTML, já é possível criar jogos web sem depender de nenhum plugin. Isto permite jogos que podem ser executados em todos navegadores atuais, inclusive em smartphones e tablets. Há quem diga, até, que o futuro dos webgames seja o HTML 5 em detrimento [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/HTML5-logo.png"><img class="alignleft size-medium wp-image-3349" title="HTML5-logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/HTML5-logo-300x300.png" alt="" width="168" height="168" /></a>Com a geração atual de navegadores, e com a atualização do padrão HTML, já é possível criar jogos web sem depender de nenhum plugin. Isto permite jogos que podem ser executados em todos navegadores atuais, inclusive em smartphones e tablets.</p>
<p>Há quem diga, até, que o futuro dos webgames seja o HTML 5 em detrimento do Flash, mas embora isso seja discutível, é fato que a tecnologia merece consideração e tem aplicação imediata nos projetos atuais.</p>
<p><span id="more-3340"></span></p>
<p>HTML é a linguagem utilizada na criação de páginas web. Durante muito tempo a criação de jogos para web podia ser feita apenas com tecnologias separadas do HTML, como Flash, applets Java, Untity3D ou outra, todas embutidas nas páginas por meio de plugins. Estes plugins são a saída que o programador web tem para a criação de aplicativos e jogos para web, mas ao mesmo tempo que permitem isso, possuem também uma fraqueza: sua implementação é inconsistente nas várias plataformas existentes. Mesmo plugin do Flash, o mais difundido de todos, apresenta diferenças em sua versão para Linux, sem falar que não esta presente nos smartphones e tablets da Apple &#8211; tablets que estão substituindo o netbook entre os executivos e profissionais liberais &#8211; e sim, eles são consumidores de jogos!</p>
<p>A última especificação do HTML, a versão 4.01, tem mais de 10 anos &#8211; já era hora de ter uma atualização. A versão 5 ainda está em desenvolvimento nesta data, mas alguns recursos já são considerados estáveis e seguros para uso. Este é o caso do elemento &lt;canvas&gt;, que oferece uma área onde podemos desenhar livremente e assim cai como uma luva para o desenvolvimento de jogos. Este é o recurso do HTML 5 que propiciou uma grande onda de jogos em HTML puro, alguns indistinguíveis de jogos em Flash.</p>
<p>No entanto a atualização do padrão, por si, não serviria de nada se os navegadores não implementassem ele. Felizmente desde as versões do ano passado dos navegadores, vários recursos do HTML 5 já estão disponíveis. Com relação ao &lt;canvas&gt;, a exceção é o Internet Explorer. Enquanto os demais (Chrome, Firefox, Safari e até mesmo o Opera) já oferecem o &lt;canvas&gt; até mesmo com aceleração por hardware (WebGL), o IE ainda sequer oferece o elemento.</p>
<p>Mas isto não quer dizer que usuários do IE ficam de fora, já que é possível adicionar suporte a &lt;canvas&gt; nele. Ninguém fica de fora mesmo! Esta tem sido uma das principais vantagens dos jogos em HTML 5, principalmente para quem trabalha com jogos criados sob encomenda, para o mercado de advergames por exemplo. O cliente espera que o jogo que ele encomendou funcione em todas plataformas, e falamos aqui de navegadores, sistemas operacionais, smartphones e tablets. Não é ficção a situação onde o cliente (executivo) avisa que vai revisar o jogo no final de semana, em casa, e na segunda feira vem reclamando que o jogo nem abriu. “<em>Mas como, qual seu navegador?</em>”, você pergunta e ele responde: “<em>Heim? Não sei&#8230; é um iPad 2!</em>”.</p>
<p>E aí, como explicar que o gadget do momento, que custa milhares de reais, e pelo qual ele trocou o antigo netbook, não roda seu jogo? Como fazer para rodar? Flash não vai&#8230; applet java? Também não. Programar tudo de novo em objective-C? Pode ser impossível porque, além do trabalhão que vai dar (para suportar apenas uma plataforma), você precisaria ter um computador Mac e um iPad ou iPhone para testar &#8211; se esta não é sua plataforma atual de desenvolvimento, é um investimento grande.</p>
<p>Nem preciso falar que a solução é o HTML 5. Embora os smartphones mais comuns não sejam os melhores exemplos de desempenho, os dispositivos Android mais modernos, o iPhone e iPad possuem capacidade para rodar este tipo de jogo. Android pode rodar jogos em Flash, mas os dispositivos da Apple não. Aliás, se tomarmos por base o <a href="http://abrindoojogo.com.br/leitor-no-controle-web-games" target="_blank">post do leitor Fabricio Boemeke</a>, ele cita duas desvantagens dos web games: no caso de baseados em plugins, são mais rápidos mas mesmo assim não tanto quanto jogos nativos. Com aceleração por hardware do WebGL, o HTML 5 deixa isso no passado. E no caso de jogos baseados apenas no navegador, cita a desvantagem de serem apenas on-line, de forma que a pessoa precisa estar conectada para jogar. O Angry Birds que está na loja de aplicativos do Chrome mostra que isso também não é mais uma limitação, sendo instalado localmente, ficando acessível dentro do Chrome mesmo quando levamos o notebook para férias na praia, onde fica desconectado.</p>
<p>Mas falar apenas em HTML é metade da história. O HTML é uma linguagem de marcação, que permite incluir elementos em uma página. Campos de formulário, texto, imagens, vídeos, etc. Mas isso tudo é estático, ou seja, com o HTML você especifica onde uma coisa é inserida e lá ela fica. A ação toda precisa ser escrita em uma linguagem de programação &#8211; e aí entra o Javascript (JS). Com sintaxe baseada em C++ e Java, porém com suporte apenas parcial à orientação a objetos, o Javascript é uma linguagem poderosa o suficiente para a criação de jogos.</p>
<p>Novamente o papel dos navegadores é importantíssimo. Sendo o Javascript uma linguagem interpretada (em oposição a compilada), sua velocidade de execução depende da máquina interpretadora que o navegador possui. Atualmente o Chrome talvez seja o navegador mais rápido para execução de código em Javascript, mas nenhum dos outros vai fazer feio, Internet Explorer, Firefox, Safari ou Opera.</p>
<p>E no quesito bibliotecas e frameworks? Existe facilidades para criação de  jogos em HTML 5? Sim, existe. Ainda não temos uma grande quantidade de frameworks completos e como isto é um diferencial no mercado, os melhores são pagos. Mas bibliotecas específicas, como bibliotecas de física, existem &#8211; geralmente são bibliotecas conhecidas que foram portadas para o Javascript. Inclusive nosso leitor Luiz Otávio Afonso, que mexe bastante como Game Maker, já nos <a href="http://abrindoojogo.com.br/leitor-no-controle-game-maker-para-html5" target="_blank">informou que este software vai gerar jogos em HTML 5</a>.</p>
<p>Mas veja que a programação de um jogo em Javascript não é nada complicada. Pode ser comparada a Java ou Action Script 3 &#8211; em certos casos, é ainda mais fácil, porque permite que alguns elementos, como HUD e outras partes da interface sejam feitas diretamente com HTML padrão.</p>
<p>Quer ter uma idéia do que é possível fazer com HTML 5? Abaixo cito alguns links que vão mostrar isso.</p>
<ul>
<li>Existem muitos “joguinhos” por aí, mas vamos começar com os produtos mais bem acabados. Quem está por dentro de jogos certamente já ouviu falar de Angry Birds, o sucesso do iPhone e depois do Android. Já faz um tempo que é sucesso também na loja de aplicativos do Chrome e hoje é um dos melhores exemplos de jogo em HTML 5:
<ul>
<li><a href="http://chrome.angrybirds.com/"><strong>http://chrome.angrybirds.com/</strong></a></li>
<li>Roda nos principais navegadores, menos o Opera.</li>
</ul>
</li>
</ul>
<ul>
<li>Já que o Opera foi deixado de fora do Andry Birds, segue uma iniciativa própria:
<ul>
<li><a href="http://operasoftware.github.com/Emberwind/"><strong>http://operasoftware.github.com/Emberwind/</strong></a></li>
</ul>
</li>
</ul>
<ul>
<li>Outro exemplo de produto bem acabado é este jogo de bilhar. Ele faz bom uso do HTML puro para elementos da interface:
<ul>
<li><a href="http://agent8ball.com/"><strong>http://agent8ball.com/</strong></a></li>
</ul>
</li>
</ul>
<ul>
<li>Aqui um concurso da Mozilla para jogos em HTML5. Tem vários exemplos:
<ul>
<li><a href="https://gaming.mozillalabs.com/"><strong>https://gaming.mozillalabs.com/</strong></a></li>
</ul>
</li>
</ul>
<ul>
<li>Os dois sites abaixo possuem excelentes exemplos:
<ul>
<li><a href="http://www.effectgames.com/effect/"><strong>http://www.effectgames.com/effect/</strong></a></li>
<li><a href="http://www.canvasdemos.com/type/games/"><strong>http://www.canvasdemos.com/type/games/</strong></a></li>
</ul>
</li>
</ul>
<ul>
<li>Finalmente, dois sites que aceitam jogos em HTML5 para publicação:
<ul>
<li><a href="http://html5games.com/"><strong>http://html5games.com/</strong></a></li>
<li><a href="http://www.html5games.net/"><strong>http://www.html5games.net/</strong></a></li>
</ul>
</li>
</ul>
<p>Ficou interessado?</p>
<p>Bem, este post serviu para apresentar a tecnologia para quem não conhecia e talvez motivar quem conhecia mas não tinha dado a devida importância. Estamos planejando também um tutorial sobre a criação de jogos em HTML 5 &#8211; se você está interessado, e gostaria de ver esse tutorial o mais rápido possível, faça seu comentário! Com uma quantidade maior de interessados, o tutorial sai mais cedo&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/html-5-futuro-dos-jogos-para-web/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>PodAbrir 07 &#8211; O Programador de Jogos</title>
		<link>http://abrindoojogo.com.br/podabrir-07-o-programador-de-jogos</link>
		<comments>http://abrindoojogo.com.br/podabrir-07-o-programador-de-jogos#comments</comments>
		<pubDate>Thu, 20 Oct 2011 00:41:50 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Pod-Abrir]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3301</guid>
		<description><![CDATA[Olá gurizada, quinta-feira é dia de podcast e aqui estamos para mais um episódio do PodAbrir. Hoje será um programa especial. Estamos iniciamos um arco de episódios voltados às profissões existentes em uma empresa de games. Neste episódio discutiremos o que é necessário para ser um bom programador de jogos. Quais são as linguagens, técnicas [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/logo2.jpg"><img class="alignleft size-full wp-image-3322" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/logo2.jpg" alt="" width="157" height="204" /></a>Olá gurizada,</p>
<p>quinta-feira é dia de podcast e aqui estamos para mais um episódio do PodAbrir. Hoje será um programa especial. Estamos iniciamos um arco de episódios voltados às profissões existentes em uma empresa de games. Neste episódio discutiremos o que é necessário para ser um bom <strong>programador de jogos</strong>. Quais são as linguagens, técnicas e postura adequada para se tornar um bom profissional nesta função? Confira as respostas e comente <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><span id="more-3301"></span></p>
<p><strong>Participantes</strong>: Everton Vieira  e Alessandro Nornberg</p>
<p><strong>Categoria</strong>: Técnico &#8211; Programação</p>
<p><strong>Links comentados na seção de recados e e-mails</strong></p>
<ul>
<li><a href="http://jogosindie.tumblr.com/">Blog do Eduardo Pereira</a>;</li>
<li><a href="http://www.portaldenoticias.com.br/Geral/Estrada%20sobre%20taipa%20tem%20pouca%20prote%E7%E3o.htm">Taipa de açude</a>;</li>
<li><a href="https://developers.google.com/playn/">Google PlayN</a>.</li>
</ul>
<p><strong>Links comentados neste episódio</strong></p>
<ul>
<li><a href="http://abrindoojogo.com.br/category/tecnico/projeto-de-software/padrao-de-projeto">Padrões de Projeto aqui no Aoj</a>;</li>
<li><a href="http://www.braid-game.com/">Braid</a>;</li>
<li><a href="http://abrindoojogo.com.br/10-dicas-para-se-tornar-um-programador-de-jogos">Post sobre dicas para se tornar um bom programador de games</a>;</li>
<li>Palestras sobre Arquitetura de Componentes<a href="http://www.gdcvault.com/play/1911/Theory-and-Practice-of-the"><br />
</a></p>
<ul>
<li><a href="http://www.gdcvault.com/play/1911/Theory-and-Practice-of-the">GDC Canadá 2009 (inglês);</a></li>
<li><a href="http://www.gdcvault.com/play/1013164/A-Dynamic-Component-Architecture-for">GDC Canadá 2010 (inglês).</a>
<ul>
<li><a href="http://www.terrancecohen.com/index.html">Site do palestrante.</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>Trilha Sonora</strong></p>
<ul>
<li>You Shook me all night long &#8211; AC/DC</li>
</ul>
<p><strong>PodCast</strong></p>
<p>Siga o nosso podcast em <a href="../feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>.  Para o Itunes, basta copiar e colar este endereço em “Advanced –  Subscribe to podcast…&#8221; ou acesse direto na store por <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-07-o-programador-de-jogos/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/3301/0/podAbrir07.mp3" length="46644860" type="audio/mpeg" />
		<itunes:duration>0:48:35</itunes:duration>
		<itunes:subtitle>Olá gurizada,
quinta-feira é dia de podcast e aqui estamos para mais um episódio do PodAbrir. Hoje será um programa especial. Estamos iniciamos um arco de episódios voltados às profissões existentes em uma empresa de games. Neste episódio discutirem[...]</itunes:subtitle>
		<itunes:summary>Olá gurizada,
quinta-feira é dia de podcast e aqui estamos para mais um episódio do PodAbrir. Hoje será um programa especial. Estamos iniciamos um arco de episódios voltados às profissões existentes em uma empresa de games. Neste episódio discutiremos o que é necessário para ser um bom programador de jogos. Quais são as linguagens, técnicas e postura adequada para se tornar um bom profissional nesta função? Confira as respostas e comente  

Participantes: Everton Vieira  e Alessandro Nornberg
Categoria: Técnico &#8211; Programação
Links comentados na seção de recados e e-mails

Blog do Eduardo Pereira;
Taipa de açude;
Google PlayN.

Links comentados neste episódio

Padrões de Projeto aqui no Aoj;
Braid;
Post sobre dicas para se tornar um bom programador de games;
Palestras sobre Arquitetura de Componentes


GDC Canadá 2009 (inglês);
GDC Canadá 2010 (inglês).

Site do palestrante.





Trilha Sonora

You Shook me all night long &#8211; AC/DC

PodCast
Siga o nosso podcast em http://abrindoojogo.com.br/feed/podcast.  Para o Itunes, basta copiar e colar este endereço em “Advanced –  Subscribe to podcast…&#8221; ou acesse direto na store por aqui.</itunes:summary>
		<itunes:keywords>Pod-Abrir, Técnico</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
		<item>
		<title>A Matemática nos Games &#8211; Velocidade e Aceleração</title>
		<link>http://abrindoojogo.com.br/a-matematica-nos-games-velocidade-e-aceleracao</link>
		<comments>http://abrindoojogo.com.br/a-matematica-nos-games-velocidade-e-aceleracao#comments</comments>
		<pubDate>Mon, 17 Oct 2011 17:51:35 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3276</guid>
		<description><![CDATA[Olá gurizada, Hoje daremos continuidade ao nosso arco de posts sobre a matemática nos games. No epsisódio anterior, vimos como utilizar a rotação de ponto em um game de corrida top down (Super Sprint). Neste episódio vamos um pouco além da proposta orginal, adentrando em uma outra área de conhecimento que, apesar das semelhanças, é [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/logo.jpg"><img class="alignleft size-full wp-image-3226" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/logo.jpg" alt="" width="157" height="153" /></a>Olá gurizada,</p>
<p>Hoje daremos continuidade ao nosso arco de posts sobre a matemática nos games. No <a href="http://abrindoojogo.com.br/a-matematica-nos-games-rotacao-de-ponto">epsisódio anterior</a>, vimos como utilizar a rotação de ponto em um game de corrida top down (Super Sprint). Neste episódio vamos um pouco além da proposta orginal, adentrando em uma outra área de conhecimento que, apesar das semelhanças, é uma ciência a parte. Estamos falando da &#8220;temida&#8221; <strong>Física</strong>. Mas não se preocupe, os seus pesadelos do ensino médio, não estarão de volta <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-3276"></span><br />
Bom, precisamos finalizar o nosso protótipo do Super Sprint, certo? Para isso, precisamos implementar uma feature muito importante para um game de carro, a Aceleração. Se pesquisarmos em nossos alfarrábios, veremos que aceleração é variação de velocidade de um corpo em um determinado intervalo de tempo. O resultado esperado seria o carrinho levar algum tempo para atingir sua velocidade máxima, em seguida, desacelerando gradativamente. Para isso, criaremos uma variável <em>acceleration </em>que será aplicada ao ponto rotacionado do nosso exemplo anterior. Ela funcionará como um acréscimo/decréscimo percentual ao ponto de destino. Observe o trecho de código genérico com comentários a seguir:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900; font-style: italic;">//Novas variáveis</span>
<span style="color: #6699cc; font-weight: bold;">var</span> acceleration<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span>=<span style="color: #000000; font-weight:bold;">1</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #6699cc; font-weight: bold;">var</span> accelerrationLimit<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = <span style="color: #000000; font-weight:bold;">1.5</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #6699cc; font-weight: bold;">var</span> deceleration<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span>=<span style="color: #000000; font-weight:bold;">0.08</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> onUpdate<span style="color: #000000;">&#40;</span>event<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">left</span><span style="color: #000000;">&#41;</span>
		<span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">-</span>= angleVariation<span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">right</span><span style="color: #000000;">&#41;</span>
		<span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">+</span>= angleVariation<span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>up<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		newPoint = getNextPoint<span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">,</span>velocity<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
                <span style="color: #009900; font-style: italic;">//removemos a movimentação do carro deste ponto</span>
		<span style="color: #009900; font-style: italic;">//car.x += newPoint.x;</span>
		<span style="color: #009900; font-style: italic;">//car.y += newPoint.y;</span>
&nbsp;
              <span style="color: #009900; font-style: italic;">// Se aceleração não estiver no limite, incrementa</span>
              <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>aceleration <span style="color: #000066; font-weight: bold;">&lt;</span>= acelerrationLimit<span style="color: #000000;">&#41;</span>
			aceleration <span style="color: #000066; font-weight: bold;">+</span>= <span style="color: #000000; font-weight:bold;">0.1</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #009900; font-style: italic;">// A moviemntação do carro fica fora do IF, sendo acionada agora a todo looping do game.</span>
	car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span> <span style="color: #000066; font-weight: bold;">+</span>= newPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span> <span style="color: #000066; font-weight: bold;">*</span> acceleration<span style="color: #000066; font-weight: bold;">;</span>
	car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> <span style="color: #000066; font-weight: bold;">+</span>= newPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> <span style="color: #000066; font-weight: bold;">*</span> acceleration<span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
	<span style="color: #009900; font-style: italic;">//Em todo looping decrementa a aceleração não permitindo que esta seja negativa</span>
        acceleration <span style="color: #000066; font-weight: bold;">-</span>= deceleration<span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>acceleration <span style="color: #000066; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000;">&#41;</span>
		acceleration = <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight:bold;">0</span> <span style="color: #000000;">&#41;</span>
            <span style="color: #004993;">angle</span> = <span style="color: #000000; font-weight:bold;">360</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">;</span>        
        <span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight:bold;">360</span><span style="color: #000000;">&#41;</span>
		<span style="color: #004993;">angle</span> = <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
	car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">rotation</span> = <span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">;</span>
	tAngle<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;ângulo: &quot;</span><span style="color: #000066; font-weight: bold;">+</span><span style="color: #004993;">angle</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>Com esta pequena alteração, já teremos um resultado interessante. Perceba que agora o carro acelera gradativamente e, mesmo depois de soltar o acelerador (seta para cima), ele simula um efeito de desaceleração e inércia.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="450" height="280" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.abrindoojogo.com.br/files/extrafiles/superSprint2.swf" /><embed type="application/x-shockwave-flash" width="450" height="280" src="http://www.abrindoojogo.com.br/files/extrafiles/superSprint2.swf"></embed></object></p>
<p>Bom, com a aceleração já implementada, partimos para a velocidade. A física descreve a velocidade uniforme como distância/tempo. Simples não? Mas, temos que ter uma atenção para a distância em um espaço 2D. Para calcularmos esta reta não podemos apenas diminuir os pontos. Observe na figura a seguir como duas retas de mesmo tamanho podem parecer diferentes dependendo de sua angulação.</p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/plano_distancia1.gif"><img class="aligncenter size-full wp-image-3284" title="plano_distancia" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/plano_distancia1.gif" alt="" width="500" height="190" /></a></p>
<p>Para solucionar este problema precisamos utilizar a nossa velha amiga trigonometria. A solução chama-se <strong>cálculo da reta</strong>, e para entendê-lo basta lembrarmos do post passado, onde mostrei que seria possível enxergar uma triângulo retângulo entre os pontos. Sendo assim, podemos identificar: Cateto oposto (ao ângulo), cateto adjacente (ao ângulo) e a hipotenusa. Estes três fazem parte de uma fórmula bastante conhecida:</p>
<p style="text-align: center;"><strong>(hipotenusa)² = (catetoOposto)² + (catetoAdajscente)²</strong></p>
<p>Queremos encontrar exatamente o valor da hipotenusa, correto? É ela que corresponde ao tamanho da reta entre os dois pontos, ou seja, a nossa distância. Isolando a variável, ficamos com: <strong></strong></p>
<p style="text-align: center;"><strong>hipotenusa = Raiz Quadrada de (catetoOposto)² + (catetoAdajscente)²</strong></p>
<p style="text-align: left;">Com esta fórmula em mãos, já temos todas as ferramentas, basta partir para o código. Vamos lá</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">var</span> acceleration<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span>=<span style="color: #000000; font-weight:bold;">1</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #6699cc; font-weight: bold;">var</span> accelerrationLimit<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = <span style="color: #000000; font-weight:bold;">1.5</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #6699cc; font-weight: bold;">var</span> deceleration<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span>=<span style="color: #000000; font-weight:bold;">0.08</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
<span style="color: #009900; font-style: italic;">//Novas variáveis</span>
<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">distance</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #009900; font-style: italic;">// ponto utilizado no cálculo da distância, armazenando a posição anterior do carro</span>
<span style="color: #6699cc; font-weight: bold;">var</span> lastPoint = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Point</span><span style="color: #000000;">&#40;</span>car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span><span style="color: #000066; font-weight: bold;">,</span>car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #009900; font-style: italic;">// tempo utilizado no cálculo da velocidade, armazenando os milisegundos entre um pulso e outro</span>
<span style="color: #6699cc; font-weight: bold;">var</span> lastTime<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">time</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> onUpdate<span style="color: #000000;">&#40;</span>event<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
         <span style="color: #009900; font-style: italic;">//Melhoria que permite girar o carro apenas quando houver aceleração</span>
	<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>acceleration<span style="color: #000066; font-weight: bold;">!</span>=<span style="color: #000000; font-weight:bold;">0</span> <span style="color: #000066; font-weight: bold;">&amp;&amp;</span> <span style="color: #004993;">left</span><span style="color: #000000;">&#41;</span>
		<span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">-</span>= angleVariation<span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>acceleration<span style="color: #000066; font-weight: bold;">!</span>=<span style="color: #000000; font-weight:bold;">0</span> <span style="color: #000066; font-weight: bold;">&amp;&amp;</span> <span style="color: #004993;">right</span><span style="color: #000000;">&#41;</span>
		<span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">+</span>= angleVariation<span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>up<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		newPoint = getNextPoint<span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">,</span>velocity<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
		<span style="color: #009900; font-style: italic;">// Se aceleração não estiver no limite, incrementa</span>
		<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>acceleration <span style="color: #000066; font-weight: bold;">&lt;</span>= accelerationLimit<span style="color: #000000;">&#41;</span>
			acceleration <span style="color: #000066; font-weight: bold;">+</span>= <span style="color: #000000; font-weight:bold;">0.1</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span> <span style="color: #000066; font-weight: bold;">+</span>= newPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span> <span style="color: #000066; font-weight: bold;">*</span> acceleration<span style="color: #000066; font-weight: bold;">;</span>
	car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> <span style="color: #000066; font-weight: bold;">+</span>= newPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> <span style="color: #000066; font-weight: bold;">*</span> acceleration<span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
	acceleration <span style="color: #000066; font-weight: bold;">-</span>= deceleration<span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
        <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>acceleration <span style="color: #000066; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		acceleration = <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000066; font-weight: bold;">;</span>
                tVelocity<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;velocidade: 0&quot;</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight:bold;">0</span> <span style="color: #000000;">&#41;</span> 		
          <span style="color: #004993;">angle</span> = <span style="color: #000000; font-weight:bold;">360</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">;</span> 	
       <span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight:bold;">360</span><span style="color: #000000;">&#41;</span>
	  <span style="color: #004993;">angle</span> = <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
	car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">rotation</span> = <span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">;</span>
	tAngle<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;ângulo: &quot;</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
        <span style="color: #009900; font-style: italic;">// Calcula a distancia através do novo método criado.</span>
	<span style="color: #004993;">distance</span> = calcDistance<span style="color: #000000;">&#40;</span>lastPoint<span style="color: #000066; font-weight: bold;">,</span> <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Point</span><span style="color: #000000;">&#40;</span>car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span><span style="color: #000066; font-weight: bold;">,</span>car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
        <span style="color: #009900; font-style: italic;">// Só calcula a velociadade se a distância for superior a 10px. Isso evita que o cálculo seja executado a todo momento, deixando o indicador da tela ilegível.</span>
	<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">distance</span> <span style="color: #000066; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight:bold;">10</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
                 <span style="color: #009900; font-style: italic;">// Atribui a caixa de texto a distancia dividida pelo tempo percorrido. Dividimos o resultado por 1000 para obtermos a unidade pixels/seg.</span>
		tVelocity<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;velocidade: &quot;</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">round</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">distance</span><span style="color: #000066; font-weight: bold;">/</span><span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">.</span>time<span style="color: #000066; font-weight: bold;">-</span>lastTime<span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">1000</span> <span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
		lastTime = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">time</span><span style="color: #000066; font-weight: bold;">;</span>
		lastPoint = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Point</span><span style="color: #000000;">&#40;</span>car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span><span style="color: #000066; font-weight: bold;">,</span>car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> calcDistance<span style="color: #000000;">&#40;</span>point1<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Point</span><span style="color: #000066; font-weight: bold;">,</span> point2<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Point</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #009900; font-style: italic;">//calcula o tamanho do cateto adjascente</span>
        <span style="color: #6699cc; font-weight: bold;">var</span> adjoiningSide<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">int</span> = <span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">abs</span><span style="color: #000000;">&#40;</span>point1<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span> <span style="color: #000066; font-weight: bold;">-</span> point2<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #009900; font-style: italic;">//calcula o tamanho do cateto oposto</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> oppositeSide<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">int</span> = <span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">abs</span><span style="color: #000000;">&#40;</span>point1<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> <span style="color: #000066; font-weight: bold;">-</span> point2<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
	<span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">sqrt</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">pow</span><span style="color: #000000;">&#40;</span>adjoiningSide<span style="color: #000066; font-weight: bold;">,</span><span style="color: #000000; font-weight:bold;">2</span><span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">pow</span><span style="color: #000000;">&#40;</span>oppositeSide<span style="color: #000066; font-weight: bold;">,</span><span style="color: #000000; font-weight:bold;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>Vejam como ficou o resultado final.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="450" height="280" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.abrindoojogo.com.br/files/extrafiles/superSprint3.swf" /><embed type="application/x-shockwave-flash" width="450" height="280" src="http://www.abrindoojogo.com.br/files/extrafiles/superSprint3.swf"></embed></object></p>
<p>O que achou do segundo post sobre matemática? Experimente modificar os valores iniciais de aceleração para obter outros resultados. No próximo veremos um importante conceito chamado <strong>Vetores</strong>. Não, não confunda com o Objeto de programação similar ao Array, esse vem da matemática <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Até mais e não esqueçam de deixar seus comentários com dúvidas ou sugestões de código.</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/a-matematica-nos-games-velocidade-e-aceleracao/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Entrevista &#8211; Super Mario Bros (parte 4)</title>
		<link>http://abrindoojogo.com.br/entrevista-super-mario-bros-parte-4</link>
		<comments>http://abrindoojogo.com.br/entrevista-super-mario-bros-parte-4#comments</comments>
		<pubDate>Wed, 12 Oct 2011 19:13:57 +0000</pubDate>
		<dc:creator>rafael.rodrigues</dc:creator>
				<category><![CDATA[Entrevistas]]></category>
		<category><![CDATA[Jogo Aberto]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3258</guid>
		<description><![CDATA[Oi pessoal, já faz algum tempo que começamos uma série de posts sobre a entrevista feita com a equipe de desenvolvimento do Super Mário Bros. Retomando essa série, vejam que interessante a abordagem utilizada na época para a função de projeto de níveis e a gigante preocupação e importância que teve que ser dada para [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/03/splash3.png"><img class="alignleft size-full wp-image-2291" title="splash3" src="http://abrindoojogo.com.br/wp-content/uploads/2011/03/splash3.png" alt="" width="204" height="148" /></a>Oi pessoal,</p>
<p>já faz algum tempo que começamos uma <a href="http://abrindoojogo.com.br/?s=Jogo+Aberto+-+Super+Mario&amp;search=Search">série de posts</a> sobre a entrevista feita com a equipe de desenvolvimento do Super Mário Bros. Retomando essa série, vejam que interessante a abordagem utilizada na época para a função de projeto de níveis e a gigante preocupação e importância que teve que ser dada para a falta de memória e limitações do hardware existente na época.</p>
<p>Então&#8230; vamos lá!</p>
<h2><span id="more-3258"></span><span style="color: #003366;"><strong>O projeto de níveis em conjunto</strong></span></h2>
<p><strong>Tezuka</strong>: Não estamos falando de um game show sobre compras, mas precisamos impor limites no game. Os novos colaboradores não tem bom senso para trabalhar com limites.</p>
<p><strong>Iwata</strong>: Nos dias de hoje, se alguém pede para você fazer algo com 30 bytes de memória, você não consegue fazer nada. Mas naquele tempo, era possível. &#8220;Uau, são mais 10 objetos no game!&#8221; (Risos)</p>
<p><strong>Miyamoto</strong>: Nós gostávamos&#8230; Isso não nos abalava.</p>
<p><strong>Tezuka</strong>: É isso aí!</p>
<p><strong>Iwata</strong>: Tezuka, você entrou para o time como um artista. Você gostava de todas essas restrições tecnológicas também?</p>
<p><strong>Tezuka</strong>: Era realmente divertido. Eu havia acabado de entrar para a companhia e ficava sempre perguntando quais eram as restrições que tínhamos para desenvolver o projeto.</p>
<p><img class="aligncenter" title="http://us.wii.com/iwata_asks/mario25th/vol5/photo11.jpg" src="http://us.wii.com/iwata_asks/mario25th/vol5/photo11.jpg" alt="" width="250" height="150" /></p>
<p><strong>Iwata</strong>: Isso foi divertido para mim também. Na época, eu ficava muito feliz quando alguém chegava para mim e dizia: &#8211; Estou com problemas porque não há memória suficiente. Isso fazia com que o programador se destacasse resolvendo este tipo de situação.</p>
<p><strong>Miyamoto</strong>: Se nós deixássemos para o Iwata resolver, ele resolveria.</p>
<p><strong>Iwata</strong>: Eu gostava do jeito que eu trabalhava.</p>
<p><strong>Nakago</strong>: (Folheando alguns documentos) Por exemplo, este castelo foi assim.</p>
<p><strong>Nakago</strong>: No início o castelo é pequeno. No final da fase, o castelo é grande. Mas se pararmos para analisar o castelo é o mesmo. Usamos muito reaproveitamento de códigos.</p>
<p><img class="aligncenter" title="http://us.wii.com/iwata_asks/mario25th/vol5/img005.jpg" src="http://us.wii.com/iwata_asks/mario25th/vol5/img005.jpg" alt="" width="500" height="200" /></p>
<p><strong>Tezuka</strong>: Na verdade, o que fizemos foi pegar o topo do castelo grande que já estava pronto e colocamos ele no início como um castelo pequeno.</p>
<p><strong>Nakago</strong>: Se olhar atentamente para o andar superior, vai ver que tem uma porta, mas para nós aquilo é uma janela. (risos)</p>
<p><strong>Iwata</strong>: (risos)</p>
<p><strong>Nakago</strong>: Estávamos sempre pensando em alternativas de viabilizar o game.</p>
<p><strong>Iwata</strong>: O objetivo era fazer o game ficar muito rico com pouca quantidade de dados pois nossa memória era muito limitada.</p>
<p><strong>Nakago</strong>: Suamos muito para fazer muito com pouco espaço de memória.</p>
<p><strong>Iwata</strong>: Nakago, você começou a fazer o Super Mario Bros e implantou vários artifícios chaves de jogos anteriores. Qual foi o ponto que você acha que realmente seria inovador?</p>
<p><strong>Nakago</strong>: Quando fizemos o plano de fundo do game.</p>
<p><strong>Iwata</strong>: Quando trocaram o fundo preto para o céu azul?</p>
<p><strong>Nakago</strong>: Sim!</p>
<p><strong>Miyamoto</strong>: (Pegando um folheto de planejamento) Aqui está.</p>
<p><img class="aligncenter" title="http://us.wii.com/iwata_asks/mario25th/vol5/img006.gif" src="http://us.wii.com/iwata_asks/mario25th/vol5/img006.gif" alt="" width="500" height="350" /></p>
<p><strong>Nakago</strong>: Oh&#8230; lá está o Mario.</p>
<p><strong>Iwata</strong>: Tezuka, foi você que desenhou este draft?</p>
<p><strong>Tezuka</strong>: Eu acho que foi o Miyamoto.</p>
<p><strong>Iwata</strong>: Miyamoto, foi você?</p>
<p><strong>Miyamoto</strong>: Eu desenhei isso? Hum&#8230; Sim, fui eu. Eu assinei este draft.</p>
<p><strong>Iwata</strong>: (Olhando para a data) Está assinado em 28 de fevereiro de 1985, apenas uma semana depois das primeiras especificações.</p>
<p><strong>Miyamoto</strong>: Não é que eu trabalho rápido mesmo? (risos)</p>
<p><strong>Iwata</strong>: (risos)</p>
<p><strong>Miyamoto</strong>: No canto direito superior tem uma paleta de planejamento de cores. Usamos muito isso para trabalhar as cores dos objetos semelhantes.</p>
<p><strong>Iwata</strong>: A vegetação e as nuvens são feitas com um mesmo objeto apenas trocando as cores.</p>
<p><strong>Miyamoto</strong>: Tudo isso em função das restrições de capacidade do hardware que estavamos usando na época &#8211; Famicom.</p>
<p><img class="aligncenter" title="http://us.wii.com/iwata_asks/mario25th/vol5/photo12.jpg" src="http://us.wii.com/iwata_asks/mario25th/vol5/photo12.jpg" alt="" width="250" height="150" /></p>
<p><strong>Iwata</strong>: Foi um grande quebra-cabeça fazer o Super Mario Bros.</p>
<p><strong>Miyamoto</strong>: Foi divertido fazer.</p>
<p><strong>Nakago</strong>: Com certeza foi.</p>
<p><strong>Miyamoto</strong>: Foi divertido para nós fazer o game. E, o projeto de níveis ficou interessante para os jogadores. Os níveis de dificuldade ficaram divertidos.</p>
<p><strong>Iwata</strong>: Quem projetou os níveis?</p>
<p><strong>Miyamoto</strong>: Tezuka e eu.</p>
<p><strong>Tezuka</strong>: Nós projetamos em conjunto.</p>
<p><strong>Miyamoto</strong>: E mais ninguém. Fomos nós dois.</p>
<p><strong>Nakago</strong>: É verdade, foram somente eles.</p>
<p><strong>Miyamoto</strong>: Projetamos todos os níveis em conjunto usando traços das nossas personalidades. Incorporamos isso no projeto de níveis para que ficasse interessante.</p>
<p><strong>Iwata</strong>: Tezuka, o que você tinha em mente na época sobre o posicionamento de inimigos? Mesmo 25 anos depois, todos reconhecem que o posicionamento dos inimigos no game é algo muito interessante. Como esse mapeamento foi feito?</p>
<p><strong>Tezuka</strong>: Hum&#8230;</p>
<p><strong>Iwata</strong>: &#8220;Por acaso&#8221; (risos)</p>
<p><strong>Tezuka</strong>: Não foi por acaso. (risos) Eu projetava um nível, simulava como o jogador iria jogar e as possibilidades que ele tinha e mostrava para o Miyamoto.</p>
<p><strong>Iwata</strong>: Entendi!</p>
<p><strong>Tezuka</strong>: Eu pensava: &#8220;O jogador vai provavelmente fazer isso aqui. Quando um inimigo aparecer aqui o jogador vai correr dessa forma. Mas ele pode bater a cabeça do Mario aqui se for fazer aquilo. &#8230;&#8221; Então íamos consertando o que não estava bom.</p>
<p><strong>Iwata</strong>:  Tezuka, você comentou sobre alguns mapas que o Miyamoto fez. Certo?</p>
<p><strong>Tezuka</strong>: Eu?</p>
<p><strong>Miyamoto</strong>: (risos)</p>
<p><strong>Iwata</strong>: Ou foi o Miyamoto &#8211; o mestre? Não lembro.</p>
<p><strong>Tezuka</strong>: Ele era o mestre. Naquela época só era possível ver a versão do trabalho uma vez por dia.</p>
<p><strong>Iwata</strong>: Ah, sim. Essa era outra restrição do projeto. Na época não tínhamos todas as ferramentas que temos hoje e não podíamos testar a cada item novo inserido no game. Então montávamos um mapa de tudo no papel primeiro.</p>
<p><img class="aligncenter" title="http://us.wii.com/iwata_asks/mario25th/vol5/photo13.jpg" src="http://us.wii.com/iwata_asks/mario25th/vol5/photo13.jpg" alt="" width="250" height="150" /></p>
<p><strong>Tezuka</strong>: Quando me perguntasse, achei realmente que eu tinha feito isso.</p>
<p><strong>Iwata</strong>: Desculpe. (risos)</p>
<p><strong>Miyamoto</strong>: O trabalho era duro!</p>
<h3><span style="color: #003366;">Fim da parte 4</span></h3>
<p>Então pessoal, o que acharam? Não tem como negar que a criatividade faz milagres. Quando maiores as limitações, mais criativo o game developer deve ser. Quais seriam as maiores limitações que encontramos hoje? São as mesmas de antigamente? Comentem &#8230;</p>
<p><strong>fonte</strong>:Entrevista <a href="http://us.wii.com/iwata_asks/mario25th/vol5_page4.jsp">Iwata_asks Mario 25th</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/entrevista-super-mario-bros-parte-4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Matemática nos Games &#8211; Rotação de Ponto</title>
		<link>http://abrindoojogo.com.br/a-matematica-nos-games-rotacao-de-ponto</link>
		<comments>http://abrindoojogo.com.br/a-matematica-nos-games-rotacao-de-ponto#comments</comments>
		<pubDate>Tue, 04 Oct 2011 15:22:56 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3179</guid>
		<description><![CDATA[Olá pessoal, Começamos hoje um novo arco de posts técnicos. O assunto? Um elemento presente desde Tennis for Two de 1958 até o novo Battle Field 3 &#8211; a saudosa ciência conhecida como Matemática. Para alguns, um bixo de sete cabeças &#8211; para outros, nem tanto. Porém, sempre tendo um papel importantíssimo na história do [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/logo.jpg"><img class="alignleft size-full wp-image-3226" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/logo.jpg" alt="" width="180" height="175" /></a>Olá pessoal,</p>
<p>Começamos hoje um novo arco de posts técnicos. O assunto? Um elemento presente desde Tennis for Two de 1958 até o novo Battle Field 3 &#8211; a saudosa ciência conhecida como <strong>Matemática</strong>. Para alguns, um bixo de sete cabeças &#8211; para outros, nem tanto. Porém, sempre tendo um papel importantíssimo na história do desenvolvimento de jogos. Esta ciência muitas vezes não recebe a devida atenção por parte dos desenvolvedores. Muito programadores desconhecem que vários dos seus problemas podem ser resolvidos com um conhecimento mínimo de trigonometria. Estamos aqui para mudar esta realidade.</p>
<p><span id="more-3179"></span></p>
<p>Falando em trigonometria, ela será a base para o nosso primeiro assunto. Para quem não recorda, ela é o segmento da matemática que foca o estudo das relação dos lados de um triângulo retângulo. Porém, a ideia aqui não será repetir os ensinamentos do meu professor de ensino médio, mas sim, através de exemplos práticos, mostrar a utilidade e aplicação da matemática nos games. Para isso, criaremos um case, um game básico, para justificar nossos ensinamentos. Neste primeiro post, vou utilizar um título que fez parte da minha infância. Logo quando ganhei o meu Phantom System (versão da Gradiente para o NES), peguei emprestado de um colega um divertido game de corrida chamado, <a href="http://www.youtube.com/watch?v=0Bgj0Ca95eM">Super Sprint</a>.</p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/477139-super_sprint_1_large2.png"><img class="aligncenter size-full wp-image-3202" title="477139-super_sprint_1_large" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/477139-super_sprint_1_large2.png" alt="" width="503" height="220" /></a>Ok,  temos que dar um desconto, isso foi em 1991 <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Apesar de simples, utilizando uma visão top-down da pista de corrida, <em>Super Sprint</em> rendeu boas horas de diversão. Vamos experimentar um pouco da sua mecânica através do protótipo a seguir. Clique e utilize as setas do teclado para girar e mover o carro.</p>
<p><object style="width: 450px; height: 280px;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="450" height="280" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="align" value="center" /><param name="menu" value="false" /><param name="src" value="http://www.abrindoojogo.com.br/files/extrafiles/superSprint.swf" /><param name="bgcolor" value="#000000" /><embed style="width: 450px; height: 280px;" type="application/x-shockwave-flash" width="450" height="280" src="http://www.abrindoojogo.com.br/files/extrafiles/superSprint.swf" bgcolor="#000000" menu="false" align="center"></embed></object></p>
<p>Analisando o protótipo, você consegue imaginar o algoritmo por trás do game? Qual seria a técnica responsável por fazer o carro girar e movimentar-se em qualquer direção?</p>
<p>Temos basicamente dois movimentos para o carro, translação e rotação. Para obtermos o movimento de translação, bastaria somarmos a velocidade nas posições x e y . Algo como, se seta para direta pressionada, <em><strong>x += velocidade</strong></em>. Porém, Super Sprint é um pouco mais complexo que isso. Não podemos simplesmente somar a velocidade nos dois eixos. Você pode notar que podemos mover e girar o carro em qualquer direção. Observe que o movimento é realizado levando em conta o ângulo do veículo (canto superior direito). A seta para cima, sempre move o carro para frente, enquanto as setas para direita e esquerda aumentam e diminuem o ângulo de rotação.  Como faremos isso? Vamos primeiro ver um exemplo<em></em>. Observe a imagem a seguir para entender bem o que precisamos. Através de um determinado ângulo (qualquer um) e um distância (velocidade) precisamos encontrar o ponto seguinte para movermos o nosso carrinho.</p>
<pre><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/planocarteziano_14.gif"><img class="aligncenter size-full wp-image-3195" title="planocarteziano_1" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/planocarteziano_14.gif" alt="" width="344" height="216" /></a>Figura 1</pre>
<p>A posição atual do nosso carro seria x=10 e y=20. A velocidade, neste exemplo, está configurada para 20 pixels. Sendo assim, chegaríamos no  ponto <strong>p1</strong> de coordenadas x=25 e y= 33. O que devemos fazer para chegar nestes valores? A matemática nos auxilia na solução desse problema através de um conceito chamado<strong> rotação de ponto</strong>. Você já ouviu falar de seno e cosseno? Entendeu como eles funcionam e qual a sua utilidade? Pois é, durante o ensino médio isso pode não ter ficad0 muito claro, mas vamos acabar com os seus problemas <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/10/planocarteziano21.gif"><img class="aligncenter size-full wp-image-3210" title="planocarteziano2" src="http://abrindoojogo.com.br/wp-content/uploads/2011/10/planocarteziano21.gif" alt="" width="396" height="173" /></a></p>
<pre>Figura 2</pre>
<p>Observe a imagem a cima. A definição nos diz que, dado um círculo trigonométrico de centro<strong> (0,0)</strong> e raio de valor 1, o seno de um angulo X é sua representação no eixo Y. Já o Cosseno,  é a representação no eixo X. Lembre-se, cosseno (com sono), é o eixo deitado <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . É importante também registrar que os pontos formam um triângulo retângulo (veremos a utilidade disso nos próximos posts).</p>
<p>O valor de seno ou cosseno para um ângulo X pode ser obtido através das funções <strong>Math.sin</strong> e <strong>Math.cos</strong> de sua linguagem de programação favorita, ou através da tabela trigonométrica.</p>
<p>Ok Everton, mas como isso irá me ajudar a fazer a movimentação do carro exatamente? Bom, a matemática vai fazer a pior parte. Com o ângulo em mãos, e utilizando seno e cosseno, vimos que é possível encontrar o ponto que seria a extremidade de uma reta de tamanho 1. Depois disso, basta multiplicarmos pelo valor desejado para obter o resultado. Vamos fazer uma prova com o exemplo da figura 1:</p>
<ul>
<li>A posição atual é x=10 y=20</li>
<li>O ângulo de rotação é de 40º</li>
<li>A velocidade (distância a ser percorrida) é de 20 pixels</li>
<li>Cosseno de 40º é 0,766</li>
<li>Seno de 40º 0,6428</li>
<li>Multiplicando os valores de seno e cosseno pela <strong>velocidade</strong> de 20<strong>,</strong> relacionando-os a x e y, teremos:
<ul>
<li>x = 15,32</li>
<li>y = 12,85</li>
</ul>
</li>
<li>Note que esta técnica parte do princípio que o ponto de equilíbrio está no centro do círculo. Sendo assim, teremos que fazer a translação do nosso carro somando sua posição atual (x=10,y=20) aos valores obtidos, resultando em:
<ul>
<li>x = 25,32</li>
<li>y = 32,85</li>
</ul>
</li>
<li>Arredondando os valores, chegamos no resultado exato apresentado pela figura 1.</li>
</ul>
<p>Vamos ver como ficaria o código genérico para este mecânica.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900; font-style: italic;">// Em um método que executa de forma intermitente (pulso do game)</span>
<span style="color: #339966; font-weight: bold;">function</span> onUpdate<span style="color: #000000;">&#40;</span>event<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #009900; font-style: italic;">// Testa as teclas do teclado para modificar o ângulo</span>
   <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">left</span><span style="color: #000000;">&#41;</span>
     <span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">-</span>= velocity<span style="color: #000066; font-weight: bold;">;</span>
   <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">right</span><span style="color: #000000;">&#41;</span>
     <span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">+</span>= velocity<span style="color: #000066; font-weight: bold;">;</span>
   <span style="color: #009900; font-style: italic;">// Se a seta pra cima estiver pressionada, calcular o próximo ponto e somar na posição atual do carro</span>
   <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>up<span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
     <span style="color: #6699cc; font-weight: bold;">var</span> newPoint<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Point</span> = getNextPoint<span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">,</span>velocity<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
     car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span> <span style="color: #000066; font-weight: bold;">+</span>= newPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span><span style="color: #000066; font-weight: bold;">;</span>
     car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> <span style="color: #000066; font-weight: bold;">+</span>= newPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span><span style="color: #000066; font-weight: bold;">;</span>
   <span style="color: #000000;">&#125;</span>
&nbsp;
   <span style="color: #009900; font-style: italic;">// Testa as extremidades dos ângulos, algumas linguagens suportam graus multiplos de 360 fazendo automaticamente a relação</span>
   <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight:bold;">0</span> <span style="color: #000000;">&#41;</span>
      <span style="color: #004993;">angle</span> = <span style="color: #000000; font-weight:bold;">360</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">;</span>    
   <span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span> <span style="color: #000066; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight:bold;">360</span><span style="color: #000000;">&#41;</span>
     <span style="color: #004993;">angle</span> = <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
   car<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">rotation</span> = <span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #009900; font-style: italic;">// Método que calcula a rotação do ponto através de um angulo e um comprimeto</span>
<span style="color: #339966; font-weight: bold;">function</span> getNextPoint<span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span><span style="color: #000066; font-weight: bold;">,</span> lenght<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Point</span>
<span style="color: #000000;">&#123;</span>
  <span style="color: #6699cc; font-weight: bold;">var</span> newPoint<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Point</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Point</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
  <span style="color: #009900; font-style: italic;">// Precisamos convertar o valor de graus para radianos devido a função da classe Math trabalhar com esta unidade.</span>
  newPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">x</span> = <span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">cos</span><span style="color: #000000;">&#40;</span>convertDegreesToRadians<span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">*</span> lenght<span style="color: #000066; font-weight: bold;">;</span>
  newPoint<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">y</span> = <span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">sin</span><span style="color: #000000;">&#40;</span>convertDegreesToRadians<span style="color: #000000;">&#40;</span><span style="color: #004993;">angle</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">*</span> lenght<span style="color: #000066; font-weight: bold;">;</span>
  <span style="color: #0033ff; font-weight: bold;">return</span> newPoint<span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #009900; font-style: italic;">//Método que converte um valor em graus para radianos</span>
<span style="color: #339966; font-weight: bold;">function</span> convertDegreesToRadians<span style="color: #000000;">&#40;</span>degrees<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">int</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">Math</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">PI</span> <span style="color: #000066; font-weight: bold;">*</span> degrees<span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">180</span><span style="color: #000066; font-weight: bold;">;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>E ai, o que acharam? Ficou mais claro a aplicação do Seno e Cosseno para encotrarmos o ponto rotacionado?O nosso Super Sprint ainda não está pronto. Precisamos acrescentar um pouco de física para deixá-lo mais próximo da versão original. Mas, isso fica para o próximo post <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Mandem suas dúvidas através dos comentários.</p>
<p>Grande abraço e até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/a-matematica-nos-games-rotacao-de-ponto/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Editor de Código para o Unity3D</title>
		<link>http://abrindoojogo.com.br/editor-de-codigo-para-o-unity3d</link>
		<comments>http://abrindoojogo.com.br/editor-de-codigo-para-o-unity3d#comments</comments>
		<pubDate>Mon, 19 Sep 2011 04:00:29 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3124</guid>
		<description><![CDATA[Olá pessoal, Após o nosso podAbrir sobre Unity3D, vários leitores pediram dicas de como configurar um editor externo para programar nesse interessante game engine. Bom, montei rapidamente um post mostrando as principais dicas pra esta configuração. Vamos aos passos MonoDevelop Conforme comentamos no podcast, a primeira opção para o programador seria o MonoDevelop. Um editor [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/09/logo1.png"><img class="alignleft size-full wp-image-3145" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/09/logo1.png" alt="" width="187" height="195" /></a>Olá pessoal,</p>
<p>Após o nosso podAbrir sobre Unity3D, vários leitores pediram dicas de como configurar um editor externo para programar nesse interessante <em>game engin</em>e. Bom, montei rapidamente um post mostrando as principais dicas pra esta configuração. Vamos aos passos <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3><span id="more-3124"></span>MonoDevelop</h3>
<p>Conforme comentamos no podcast, a primeira opção para o programador seria o <strong>MonoDevelop</strong>. Um editor que já acompanha o pacote de instalação do Unity3D desde a versão 3. Apesar de ser a ferramenta padrão para edição de código, vamos apenas reforçar os passos necessários.</p>
<address style="text-align: center;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/09/passo11.png"><img class="aligncenter size-full wp-image-3127" title="passo1" src="http://abrindoojogo.com.br/wp-content/uploads/2011/09/passo11.png" alt="" width="515" height="224" /></a>Passo 1</address>
<address style="text-align: center;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/09/passo21.png"><img class="aligncenter size-full wp-image-3128" title="passo2" src="http://abrindoojogo.com.br/wp-content/uploads/2011/09/passo21.png" alt="" width="406" height="261" /></a>Passo 2</address>
<p>Após configurar, ou conferir, o editor padrão. Basta sincronizar os scripts de seu projeto. Para fazer isso, basta acessar a opção <strong><em>Sync MonoDevelop Project </em></strong>no menu <em>Asset</em>, conforme mostra a figura abaixo.</p>
<address style="text-align: center;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/09/passo3.png"><img class="aligncenter size-full wp-image-3130" title="passo3" src="http://abrindoojogo.com.br/wp-content/uploads/2011/09/passo3.png" alt="" width="375" height="245" /></a>Passo3</address>
<p>Após a sincronização, basta dar dois cliques sobre o <em>asset </em>de <em>script </em>para o editor abrir automaticamente. Abaixo confira o layout do MonoDevelop.</p>
<address style="text-align: center;"><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/09/monoDevelop.png"><img class="aligncenter size-full wp-image-3129" title="monoDevelop" src="http://abrindoojogo.com.br/wp-content/uploads/2011/09/monoDevelop.png" alt="" width="509" height="314" /></a>MonoDevelop</address>
<p>Eu considero o MonoDevelop um editor leve e com boas funcionalidades. Para projetos de pequeno e médio porte, não há dúvida que ele dará conta do recado. Sua versão padrão não acompanha nenhum tipo de controle de versão de arquivos, porém, isso poderá ser resolvido através de plugins adicionais, ou até mesmo, de clientes de controle de versão como o Tortoise.</p>
<h3>Visual Studio C#</h3>
<p>Mesmo o MonoDevelop sendo uma boa opção, não podemos deixar de comentar sobre a integração do Unity3D com o Visual Studio C#, o editor da <em>Microsoft </em>bastante conhecido dos programadores de .Net. Se você já utiliza esta IDE, há várias vantagens em manter o ambiente de desenvolvimento. Nesse caso, teremos duas formas distintas de integração, uma para a versão Pró (paga) e outra para a versão Express (gratuita).</p>
<p>Para a versão paga, não há segredos. Basta o programador seguir os passos 1, 2 e 3, clicando em <em>Browse </em>e selecionando o executável do editor da Microsoft.  Já a versão Express, tem uma significativa limitação. Além de um erro na opção de sincronizar o projeto (que mostrar ainda o nome do MonoDevelop), a integração com esta versão do editor, não permite que o programador clique no <em>Script </em>e abra a IDE automaticamente mostrando o código para edição. O impecilho pode parecer pequeno, mas com o tempo pode realmente atrapalhar o desenvolvimento.</p>
<p>Para solucionar este problema, há algumas soluções alternativas. Abaixo listo uma das mais simples.</p>
<p>1) Baixe o programa <a href="http://fvue.nl/wiki/ClassExec">ClassExec</a>, extraindo o .exe para uma pasta conhecida, por exemplo d:\visualUnity.</p>
<p>2) Crie um arquito BAT com o seguinte código:</p>
<pre> "d:\visualUnity\classexec.exe" %1 --class .cs</pre>
<p>3) No Unity, siga os mesmos passos 1, 2 e 3 descritos neste post, selecionando o arquivo BAT recém criado como o seu editor externo.</p>
<p>4) Após clicar na opção para sincronizar, os arquivos de Script estarão agora relacionados corretamente ao Visual C# Express, permitindo que o programador utilize o clique duplo para editá-los.</p>
<p>Esta solução, aparentemente nada oficial, está resgistrada na própria wiki da ferramenta, <a href="http://www.unifycommunity.com/wiki/index.php?title=Setting_up_Visual_Studio_for_Unity#Using_Visual_C.23_Express_As_the_code_editor">confira</a>.</p>
<p>Bom pessoal, seria isso. Espero que o post bem técnico tenha respondido as dúvidas. Até a próxima <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/editor-de-codigo-para-o-unity3d/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PodAbrir 04 – Unity3D – Uma Ferramenta Profissional</title>
		<link>http://abrindoojogo.com.br/podabrir-04-%e2%80%93-unity3d-%e2%80%93-uma-ferramenta-profissional</link>
		<comments>http://abrindoojogo.com.br/podabrir-04-%e2%80%93-unity3d-%e2%80%93-uma-ferramenta-profissional#comments</comments>
		<pubDate>Thu, 08 Sep 2011 12:15:52 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Pod-Abrir]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=3058</guid>
		<description><![CDATA[Olá pessoal, mais um episódio do nosso podcast sobre desenvolvimento de jogos chegando. Nesta quinta-feira, eu e Alessandro falaremos sobre a ferramenta Unity3D, assunto bastante pedido pelos leitores. Abordaremos os aspectos técnicos da ferramenta, seu potencial, dicas de desenvolvimento, e a arquitetura por trás do engine. Como de costume, não deixe de participar através de comentários [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/09/logo.jpg"><img class="alignleft size-full wp-image-3067" title="logo" src="http://abrindoojogo.com.br/wp-content/uploads/2011/09/logo.jpg" alt="" width="125" height="158" /></a>Olá pessoal, mais um episódio do nosso podcast sobre desenvolvimento de jogos chegando. Nesta quinta-feira, eu e Alessandro falaremos sobre a ferramenta <strong>Unity3D</strong>, assunto bastante pedido pelos leitores. Abordaremos os aspectos técnicos da ferramenta, seu potencial, dicas de desenvolvimento, e a arquitetura por trás do <em>engine</em>.</p>
<p>Como de costume, não deixe de participar através de comentários ou e-mails <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><span id="more-3058"></span><strong>Participantes</strong>: Everton Vieira e Alessandro Nornberg</p>
<p><strong>Categoria</strong>: Técnico</p>
<p><strong>Links comentados na seção de recados e e-mails</strong></p>
<ul>
<li><a href="http://forums.naughtydog.com/t5/General-Discussion/Naughty-Dog-Rejected-Brazillian-dub-and-chose-a-Miami-Studio-do/td-p/459775 ">Fórum da NaughtyDog sobre a dublagem de Uncharted 3</a>
<ul>
<li><a href="http://www.youtube.com/watch?feature=player_embedded&amp;v=aMInoLwQJW4">Vídeo com a dublagem original em inglês;</a></li>
<li><a href="http://www.youtube.com/watch?feature=player_embedded&amp;v=pOcW-BDCstY"> Vídeo da dublagem do estúdio de Miami (aprovada);</a></li>
<li><a href="http://www.youtube.com/watch?v=ZUxCpj4RH2c&amp;feature=player_embedded">Vídeo da dublagem do estúdio nacional (reprovada).</a></li>
</ul>
</li>
</ul>
<p><strong>Links comentados neste episódio</strong></p>
<ul>
<li><a href="http://unity3d.com/unity/licenses">Comparação entre as licenças</a>;</li>
<li><a href=" http://www.aquiris.com.br/pt/games/">Games produzidos pela Aquiris;</a>
<ul>
<li><a href="http://unity3d.com/gallery/live-demos/index.html#bootcamp">TechDemo BootCamp</a></li>
</ul>
</li>
<li><a href="http://blogs.unity3d.com/2011/09/01/unity-and-flash-a-sneak-peek/">Unity3D poderá gera conteúdo para o Flash Player</a></li>
<li><a href="http://www.youtube.com/watch?feature=player_embedded&amp;v=pvfVDczQXOY">Jogos 2D feitos na Unity3D</a></li>
</ul>
<p><strong>PodCast</strong></p>
<p>Siga o nosso podcast em <a href="../feed/podcast" target="_blank">http://abrindoojogo.com.br/feed/podcast</a>. Para o Itunes, basta copiar e colar este endereço em “Advanced – Subscribe to podcast…&#8221; ou acesse direto na <em>store </em>por <a href="http://itunes.apple.com/br/podcast/abrindo-o-jogo/id459808539?l=en">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/podabrir-04-%e2%80%93-unity3d-%e2%80%93-uma-ferramenta-profissional/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
			<enclosure url="http://abrindoojogo.com.br/podpress_trac/feed/3058/0/podAbrir04.mp3" length="40987166" type="audio/mpeg" />
		<itunes:duration>0:42:42</itunes:duration>
		<itunes:subtitle>Olá pessoal, mais um episódio do nosso podcast sobre desenvolvimento de jogos chegando. Nesta quinta-feira, eu e Alessandro falaremos sobre a ferramenta Unity3D, assunto bastante pedido pelos leitores. Abordaremos os aspectos técnicos da ferramenta,[...]</itunes:subtitle>
		<itunes:summary>Olá pessoal, mais um episódio do nosso podcast sobre desenvolvimento de jogos chegando. Nesta quinta-feira, eu e Alessandro falaremos sobre a ferramenta Unity3D, assunto bastante pedido pelos leitores. Abordaremos os aspectos técnicos da ferramenta, seu potencial, dicas de desenvolvimento, e a arquitetura por trás do engine.
Como de costume, não deixe de participar através de comentários ou e-mails  
Participantes: Everton Vieira e Alessandro Nornberg
Categoria: Técnico
Links comentados na seção de recados e e-mails

Fórum da NaughtyDog sobre a dublagem de Uncharted 3

Vídeo com a dublagem original em inglês;
 Vídeo da dublagem do estúdio de Miami (aprovada);
Vídeo da dublagem do estúdio nacional (reprovada).



Links comentados neste episódio

Comparação entre as licenças;
Games produzidos pela Aquiris;

TechDemo BootCamp


Unity3D poderá gera conteúdo para o Flash Player
Jogos 2D feitos na Unity3D

PodCast
Siga o nosso podcast em http://abrindoojogo.com.br/feed/podcast. Para o Itunes, basta copiar e colar este endereço em “Advanced – Subscribe to podcast…&#8221; ou acesse direto na store por aqui.</itunes:summary>
		<itunes:keywords>Pod-Abrir, Técnico</itunes:keywords>
		<itunes:author>Abrindo o Jogo</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
		<item>
		<title>Padrões de Projeto em Games &#8211; Builder</title>
		<link>http://abrindoojogo.com.br/padroes-de-projeto-em-games-builder</link>
		<comments>http://abrindoojogo.com.br/padroes-de-projeto-em-games-builder#comments</comments>
		<pubDate>Wed, 24 Aug 2011 04:12:41 +0000</pubDate>
		<dc:creator>everton.vieira</dc:creator>
				<category><![CDATA[Padrão de Projeto]]></category>
		<category><![CDATA[Técnico]]></category>

		<guid isPermaLink="false">http://abrindoojogo.com.br/?p=2899</guid>
		<description><![CDATA[Olá gurizada, Estou de volta trazendo mais um padrão de projeto aplicado a jogos. Desta vez, escolhi um padrão de uma categoria que ainda não tínhamos falado aqui no AoJ. É o padrão de criação Builder. Ao contrário das categorias comportamentais e estruturais, os padrões de criação são bem abrangentes, e por esse motivo, úteis [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/08/logoBuilder.jpg"><img class="alignleft size-full wp-image-2906" title="logoBuilder" src="http://abrindoojogo.com.br/wp-content/uploads/2011/08/logoBuilder.jpg" alt="" width="174" height="168" /></a>Olá gurizada,</p>
<p>Estou de volta trazendo mais um padrão de projeto aplicado a jogos. Desta vez, escolhi um padrão de uma categoria que ainda não tínhamos falado aqui no AoJ. É o padrão de criação <strong>Builder</strong>. Ao contrário das categorias comportamentais e estruturais, os padrões de criação são bem abrangentes, e por esse motivo, úteis em praticamente todo o tipo de software. Vamos ver se a técnica do Sr Miyagi nos mostra uma aplicação interessante para os games. Vamos lá.</p>
<p><span id="more-2899"></span>Para iniciar o nosso post, vamos primeiro conhecer a definição da categoria de padrões de criação. Ela diz que tais padrões abstraem o processo de instanciação de objetos. Eles ajudam a tornar um sistema independente de como seus objetos são criados, compostos e representados.</p>
<p>Já a definição formal do padrão Builder diz que ele separa a construção de um objeto complexo da sua representação, de modo que o mesmo processo de construção possa criar diferentes representações.</p>
<p>Vamos ver como se parece o diagrama de classes do padrão Builder.</p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/08/diagramaClasse.gif"><img class="aligncenter size-full wp-image-2900" title="diagramaClasse" src="http://abrindoojogo.com.br/wp-content/uploads/2011/08/diagramaClasse.gif" alt="" width="533" height="240" /></a>Sendo que:</p>
<ul>
<li><strong>Builder</strong>
<ul>
<li>especifica uma interface abstrata para criação de partes de um objeto produto</li>
</ul>
</li>
<li><strong>ConcreteBuilder</strong>
<ul>
<li>constrói e monta parte do produto pela implementação da <em>interface </em>de Builder;</li>
<li>define e mantém a representação que cria;</li>
<li>fornece uma <em>interface </em>para recuperação do produto.</li>
</ul>
</li>
<li><strong>Director</strong>
<ul>
<li>constrói um objeto utilizando o objeto Builder que recebeu.</li>
</ul>
</li>
<li><strong>Product</strong>
<ul>
<li>representa o objeto complexo em construção.</li>
</ul>
</li>
</ul>
<p>Normalmente, as definições bibliográficas são um pouco formais, dificultando um pouco o entendimento. Mas, estou aqui para facilitar, não é verdade? Então vamos mostrar um exemplo em homenagem as saudosas Tartarugas Ninjas (Teenage Mutant Ninja Turtles), protagonistas de grandes games Beat &#8216;em ups nos anos 90. Observe o exemplo do diagrama de sequência abaixo.</p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/08/Builder-Pattern1.png"><img class="aligncenter size-full wp-image-2905" title="Builder Pattern" src="http://abrindoojogo.com.br/wp-content/uploads/2011/08/Builder-Pattern1.png" alt="" width="500" height="323" /></a>Analisando esse exemplo, é possível perceber que o pizzaiolo poderá facilmente montar outros tipos de Pizza &#8211; sem borda por exemplo &#8211; apenas criando outro método. Porém, o ponto mais interessante seria a troca do objeto Builder. Podemos criar outros tipos, como: FruitPizzaBuilder, DietPizzaBuilder, ou até para a favorita do Michelangelo, a PeanutButterExtraPicklesPizzaBuilder (Pizza de pasta de amendoim com uma porção extra de picles) <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Vamos agora ver como a técnica do Sr. Miyagi nos mostra a aplicação desse padrão nos games.</p>
<p><a href="http://abrindoojogo.com.br/wp-content/uploads/2011/07/myiagi.png"><img class="alignleft size-full wp-image-2399" title="myiagi" src="http://abrindoojogo.com.br/wp-content/uploads/2011/07/myiagi.png" alt="" width="128" height="165" /></a>Um padrão de projeto desta categoria possui várias aplicações em games. Acredito que a mais comum seja para a criação de inimigos de fase. Em cada estágio de um game do Mario, por exemplo, o programador pode simplesmente trocar a chamada do Director para criar novas variações de tartarugas (verdes, vermelhas, voadoras), ou trocar o objeto Builder, criando inimigos totalmente novos.</p>
<p>E ai? O que você achou desse padrão e suas aplicações? Conseguiria imaginar ele sendo útil em outros módulos de seu jogo? Envie o seu comentário.</p>
<p>Grande abraço e não se esqueça que nesta quinta-feira tem PodAbrir <img src='http://abrindoojogo.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://abrindoojogo.com.br/padroes-de-projeto-em-games-builder/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

