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

<channel>
	<title>UnderCode</title>
	<atom:link href="http://undercode.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://undercode.wordpress.com</link>
	<description>Novo blog em http://www.mottaweb.com.br/</description>
	<lastBuildDate>Tue, 10 Nov 2009 15:32:01 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='undercode.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/ad0de3a3817ed8afaf3e35be561c7d83?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>UnderCode</title>
		<link>http://undercode.wordpress.com</link>
	</image>
			<item>
		<title>UnderCode de casa nova =D</title>
		<link>http://undercode.wordpress.com/2009/03/22/undercode-de-casa-nova-d/</link>
		<comments>http://undercode.wordpress.com/2009/03/22/undercode-de-casa-nova-d/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 21:47:47 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Off]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=76</guid>
		<description><![CDATA[Pois é, como eu tive que arranjar um host para mim e comprei um domínio, eu resolvi mudar o UnderCode pra http://www.mottaweb.com.br/. Os motivos são simples: Eu posso alterar o layout, adicionar plugins e mais uma infinidade de coisas que não dá pra fazer no WordPress.com
Eu também pretendo postar com mais freqüência aqui, não só [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=76&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Pois é, como eu tive que arranjar um host para mim e comprei um domínio, eu resolvi mudar o UnderCode pra <a href="http://www.mottaweb.com.br/blog/">http://www.mottaweb.com.br/</a>. Os motivos são simples: Eu posso alterar o layout, adicionar plugins e mais uma infinidade de coisas que não dá pra fazer no WordPress.com</p>
<p>Eu também pretendo postar com mais freqüência aqui, não só coisas relacionadas à GameDev, mas sobre internet e outros inúmeros interesses meus. Aliás, pretendo falar sobre roteiros para games também. ^.-</p>
<p>So, look forward to it ^^</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=76&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2009/03/22/undercode-de-casa-nova-d/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>
	</item>
		<item>
		<title>A web 2.0 e suas Rich Internet Applications</title>
		<link>http://undercode.wordpress.com/2009/03/10/a-web-20-e-suas-rich-internet-applications/</link>
		<comments>http://undercode.wordpress.com/2009/03/10/a-web-20-e-suas-rich-internet-applications/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 18:26:15 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ria]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=73</guid>
		<description><![CDATA[Eu ainda me lembro do tempo em que RIA era um sinônimo para Flash. Hoje em dia, porém, existem diversos frameworks além do antigo (e ainda largamente usado) software da Macromedia (agora da Adobe). Microsoft e Adobe e Sun, também entraram nesta disputa com seus aplicativos para desenvolver aplicações para web com características de aplicativos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=73&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Eu ainda me lembro do tempo em que RIA era um sinônimo para Flash. Hoje em dia, porém, existem diversos frameworks além do antigo (e ainda largamente usado) software da Macromedia (agora da Adobe). Microsoft e Adobe e Sun, também entraram nesta disputa com seus aplicativos para desenvolver aplicações para web com características de aplicativos desktop. M$ Silverlight, Adobe Air, e JavaFX são programas para gerar aplicativos ricos para internet, mas que ainda precisam de plugins no cliente para rodar suas aplicações.</p>
<p>Okay, isso não é surpresa para ninguém (ao menos, creio eu, não entre desenvolvedores/curiosos web), e não é sobre isso que eu queria falar também. Eu tenho alguns projetos de aplicações para internet em mente, e não gostaria de usar nenhum desses frameworks. Até porque, eu não estou a fim de aprender nenhuma nova linguagem atualmente (e nem tenho tempo para isso).</p>
<p>Enfim, como eu já tinha decidido usar Ajax e Javascript, eu estava procurando na net por alguns frameworks para facilitar minha vida (eu estava usando Prototype + Scriptaculous no projeto), e um framework me chamou muito a atenção: <a href="http://pyjs.org/">Pyjamas</a>. Um framework para desenvolver RIA usando Python (como o GWT da Google).</p>
<p>Vou dar uma olhada nele e depois posto algumas coisinhas aqui ^-^</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/73/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=73&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2009/03/10/a-web-20-e-suas-rich-internet-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>
	</item>
		<item>
		<title>Criando jogos em Delphi &#8211; Parte IV</title>
		<link>http://undercode.wordpress.com/2009/03/09/criando-jogos-em-delphi-parte-iv/</link>
		<comments>http://undercode.wordpress.com/2009/03/09/criando-jogos-em-delphi-parte-iv/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 14:37:03 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[desenvolvimento de jogos]]></category>
		<category><![CDATA[windows GDI]]></category>
		<category><![CDATA[animação]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=68</guid>
		<description><![CDATA[- Animações -
&#160;&#160;&#160; Quando várias imagens são mostradas em um curto intervalo de tempo, nosso cérebro interpreta isso como movimento. À freqüência de imagens mostradas damos o nome de FPS (Frames per Second, em inglês). Filmes normalmente utilizam 30 quadros (frames) por segundo, enquanto os jogos mais atuais utilizam 60 quadros. Note que 15 é [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=68&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><b>- Animações -</b></p>
<p>&nbsp;&nbsp;&nbsp; Quando várias imagens são mostradas em um curto intervalo de tempo, nosso cérebro interpreta isso como movimento. À freqüência de imagens mostradas damos o nome de <b>FPS</b> (<i>Frames per Second</i>, em inglês). Filmes normalmente utilizam 30 quadros (frames) por segundo, enquanto os jogos mais atuais utilizam 60 quadros. Note que 15 é o mínimo de quadros aceitável em uma animação, mas quanto mais quadros por segundo uma animação tiver, mais suave ela será.</p>
<p>&nbsp;&nbsp;&nbsp; Teoria básica apresentada, vamos ao que interessa. Para montarmos uma animação no Delphi, tudo o que precisaremos é mostrar uma seqüência de imagens na tela. Mas como mostrar essa seqüência? Simples. Vamos usar variáveis para recordar qual quadro devemos mostrar na tela, e por quanto tempo ele ainda deve ser mostrado na tela.</p>
<p><b>- A classe TAnimation-</b></p>
<p>&nbsp;&nbsp;&nbsp; Para controlar a animação vamos criar uma classe, nesse caso a <strong>TAnimation</strong>, que derivará apenas de TObject (como todas as classes em Delphi derivam de TObject, nós podemos deixar essa herança implícita). Essa classe precisa guardar uma matriz contendo as imagens de cada quadro, o quadro que está sendo mostrado atualmente e o tempo de espera entre um quadro e outro. Além disso, ela precisa de uma rotina que atualize a animação. Essa rotina recebe o tempo decorrido e atualiza a variável que guarda o tempo que o quadro atual foi exibido. Se esse tempo for maior do que o tempo de espera, alteramos o quadro da animação. Por fim, precisamos de uma rotina para desenhar o quadro atual na tela. Sabendo disso, podemos criar a nossa classe.</p>
<p><code><b><font color="#000080">type</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//Aqui nós declaramos a classe da nossa explosão</font></i><br />
&nbsp;&nbsp;TAnimation = <b><font color="#000080">class</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">private</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;fFrame: Integer; <font color="#008000"><i>//o quadro atual da animação</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;fDelay: Integer; <font color="#008000"><i>//o tempo de espera entre um quadro e outro (em ms)</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;fDelayed: Double; <font color="#008000"><i>//o tempo que o frame atual foi exibido na tela (em ms)</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;fSpeed: Double; <font color="#008000"><i>//a velocidade da animação</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;fX, fY: Double; <font color="#008000"><i>//a posição da animação no formulário</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;fFrames: <b><font color="#000080">array</b></font> <b><font color="#000080">of</b></font> TBitmap; <font color="#008000"><i>//os frames da animação</font></i><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">procedure</b></font> setFrame(value: Integer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">procedure</b></font> setDelayed(value: Double);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">procedure</b></font> setFrameImage(Index: Integer; value: TBitmap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">function</b></font> getFrame(Index: Integer): TBitmap;<br />
&nbsp;&nbsp;<b><font color="#000080">public</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">property</b></font> Frame: Integer read fFrame write setFrame;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">property</b></font> Delay: Integer read fDelay write fDelay;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">property</b></font> Delayed: Double read fDelayed write setDelayed;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">property</b></font> Speed: Double read fSpeed write fSpeed;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">property</b></font> X: Double read fX write fX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">property</b></font> Y: Double read fY write fY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">property</b></font> Image[Index: Integer]: TBitmap read getFrame write SetFrameImage;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">constructor</b></font> Create;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">destructor</b></font> Destroy; override;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//desenha o quadro atual na tela</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">procedure</b></font> Paint(canvas: TCanvas);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//atualiza a animação</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">procedure</b></font> Update(lag: Integer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//seta os frames a partir de uma array de bitmaps</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">procedure</b></font> SetFrames(values: <b><font color="#000080">array</b></font> <b><font color="#000080">of</b></font> TBitmap);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<b><font color="#000080">implementation</b></font><br />
&nbsp;<br />
<font color="#008000"><i>// --------------------------------------------------------------------------</font></i><br />
<font color="#008000"><i>// TAnimation</font></i><br />
<font color="#008000"><i>// -----------</font></i><br />
&nbsp;<br />
<font color="#008000"><i>// Inicializa a classe</font></i><br />
<b><font color="#000080">constructor</b></font> TAnimation.Create;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">inherited</b></font> Create;<br />
&nbsp;&nbsp;fFrame:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;fDelay:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;fDelayed:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;fX:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;fY:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;fSpeed:= <font color="#0000FF">1</font>;<br />
&nbsp;&nbsp;setLength(fFrames, <font color="#0000FF">0</font>);<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Destrói a instancia</font></i><br />
<b><font color="#000080">destructor</b></font> TAnimation.Destroy;<br />
<b><font color="#000080">var</b></font> i: Integer;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font> I := <font color="#0000FF">0 </font><b><font color="#000080">to</b></font> High(fFrames) <b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(fFrames[I]);<br />
&nbsp;&nbsp;setLength(fFrames, <font color="#0000FF">0</font>);<br />
&nbsp;&nbsp;FreeAndNil(fFrames);<br />
&nbsp;&nbsp;<b><font color="#000080">inherited</b></font> Destroy;<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Retorna a imagem do frame atual</font></i><br />
<font color="#008000"><i>// Gera um erro se o índice (Index) estiver fora dos limites da matriz de</font></i><br />
<font color="#008000"><i>// frames.</font></i><br />
<b><font color="#000080">function</b></font> TAnimation.getFrame(Index: Integer): TBitmap;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> (Index &lt; <font color="#0000FF">0</font>) <b><font color="#000080">or</b></font> (Index &gt; High(fFrames)) &nbsp;<b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">raise</b></font> Exception.Create(<font color="#0000FF">'Índice da animação fora da faixa permitida.'</font>);<br />
&nbsp;&nbsp;Result:= fFrames[Index];<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Desenha o frame atual no canvas</font></i><br />
<b><font color="#000080">procedure</b></font> TAnimation.Paint(canvas: TCanvas);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> fFrame &lt; <font color="#0000FF">0 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;exit;<br />
&nbsp;&nbsp;canvas.Draw(Round(fX), Round(fY), fFrames[fFrame]);<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Modifica o tempo que o frame atual foi exibida</font></i><br />
<font color="#008000"><i>// Se este tempo for maior ou igual ao tempo que precisamos esperar, passa</font></i><br />
<font color="#008000"><i>// para o próximo frame.</font></i><br />
<b><font color="#000080">procedure</b></font> TAnimation.setDelayed(value: Double);<br />
<b><font color="#000080">var</b></font> incFrame: Integer;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;fDelayed:= value;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> fDelayed &gt;= fDelay <b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;incFrame := floor(fDelayed / fDelay);<br />
&nbsp;&nbsp;&nbsp;&nbsp;fDelayed:= floor(fDelayed) <b><font color="#000080">mod</b></font> fDelay;<br />
&nbsp;&nbsp;&nbsp;&nbsp;setFrame(fFrame + incFrame);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Modifica o frame da animação</font></i><br />
<b><font color="#000080">procedure</b></font> TAnimation.setFrame(value: Integer);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;fFrame:= value;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> fFrame &lt; <font color="#0000FF">0 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;fFrame:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> fFrame &gt; High(fFrames) <b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;fFrame:= -<font color="#0000FF">1</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;fSpeed:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Altera a imagem de um dos frames da matriz</font></i><br />
<b><font color="#000080">procedure</b></font> TAnimation.setFrameImage(Index: Integer; value: TBitmap);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> (Index &lt; <font color="#0000FF">0</font>) <b><font color="#000080">or</b></font> (Index &gt; High(fFrames)) <b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">raise</b></font> Exception.Create(<font color="#0000FF">'Índice da animação fora da faixa permitida.'</font>);<br />
&nbsp;&nbsp;fFrames[Index]:= value;<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Seta os frames da matriz pela matriz de bitmaps passada</font></i><br />
<b><font color="#000080">procedure</b></font> TAnimation.SetFrames(values: <b><font color="#000080">array</b></font> <b><font color="#000080">of</b></font> TBitmap);<br />
<b><font color="#000080">var</b></font><br />
&nbsp;&nbsp;I: Integer;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;setLength(fFrames, Length(values));<br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font> I := <font color="#0000FF">0 </font><b><font color="#000080">to</b></font> High(values) <b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;fFrames[I]:= TBitmap.Create;<br />
&nbsp;&nbsp;&nbsp;&nbsp;fFrames[I].Assign(values[I]);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Atualiza a animação</font></i><br />
<b><font color="#000080">procedure</b></font> TAnimation.Update(lag: Integer);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;setDelayed(fDelayed + (lag * fSpeed));<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Nossa classe agora está criada. É uma classe que pode controlar qualquer animação usando imagens (quadros) no formato bitmap. Para esse tutorial, vamos criar um pequeno programa que mostra várias animações de explosão em lugares aleatórios da tela.</p>
<p>&nbsp;&nbsp;&nbsp; Antes de continuar, faça o download do <a href="http://mottaweb.com.br/files/delphi/animacao.zip">código fonte e imagens da animação aqui</a>.</p>
<p>&nbsp;&nbsp;&nbsp; Agora que você já tem as imagens, vai perceber que elas estão no formato <strong>jpeg</strong> (aliás, um formato que não deve ser usado para animações/sprites), que eu usei aqui só pra reduzir o tamanho do arquivo. =D Mas, enfim, como as imagens estão em <strong>jpeg</strong>, temos três alternativas: A primeira é converter cada imagem manualmente para <strong>bitmap</strong>, já que nossa classe só aceita esse formato. A segunda, é alterar nossa classe para funcionar com imagems em <strong>jpeg</strong> ao invés de <strong>bitmap</strong>, mas como eu disse, jpeg deve ser evitado em animações e sprites. A terceira, é criar uma função para converter as imagens de <strong>jpeg</strong> para <strong>bitmap</strong>. Vamos usar a terceira, já que eu sou um programador <span style='text-decoration:line-through;'>garoto preguiçoso demais para converter as imagens manualmente</span> ^.- </p>
<p><code><font color="#008000"><i>//transforma JPEG em BMP</font></i><br />
<b><font color="#000080">function</b></font> jpeg2bmp(imagem: TJPEGImage): TBitmap;<br />
&nbsp;<br />
<b><font color="#000080">implementation</b></font><br />
&nbsp;<br />
<b><font color="#000080">function</b></font> jpeg2bmp(imagem: TJPEGImage): TBitmap;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>// instancia o bitmap</font></i><br />
&nbsp;&nbsp;result:= TBitmap.Create;<br />
&nbsp;&nbsp;<font color="#008000"><i>// altera as propriedades (largura/altura) para desenhar a imagem jpeg nele</font></i><br />
&nbsp;&nbsp;result.Width:= imagem.Width;<br />
&nbsp;&nbsp;result.Height:= imagem.Height;<br />
&nbsp;&nbsp;<font color="#008000"><i>// desenha a imagem jpeg no canvas</font></i><br />
&nbsp;&nbsp;result.Canvas.Draw(<font color="#0000FF">0</font>, <font color="#0000FF">0</font>, imagem);<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Agora nós temos imagens que servem como quadros em nossa classe de animação, podemos começar a criar nosso programa. Primeiro, vamos precisar de algumas variáveis para controlar as animações e, claro, nosso <strong>backbuffer</strong>.</p>
<p><code><b><font color="#000080">var</b></font><br />
&nbsp;&nbsp;Form1: TForm1;<br />
&nbsp;&nbsp;<font color="#008000"><i>// variável do backbuffer</font></i><br />
&nbsp;&nbsp;bbuffer: TBitmap;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// array dos frames usados na animação</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>// Note que essa variável global só foi adicionada para não carregar</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>// a mesma animação do HD várias vezes.</font></i><br />
&nbsp;&nbsp;AnimFrames: <b><font color="#000080">array</b></font> <b><font color="#000080">of</b></font> TBitmap;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// Número de frames mostrados.</font></i><br />
&nbsp;&nbsp;Frames: Integer;<br />
&nbsp;&nbsp;<font color="#008000"><i>// Número de frames por segundo.</font></i><br />
&nbsp;&nbsp;FPS: Integer = -<font color="#0000FF">1</font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>// Número de milisegundos para cálculo de FPS.</font></i><br />
&nbsp;&nbsp;FPSTime: Integer;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// Uma lista das animações ativas</font></i><br />
&nbsp;&nbsp;RunningAnims: TList;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// O tempo gasto na última atualização da tela</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>// Necessário para que as animações rodem em uma velocidade constante,</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>// independente da velocidade da máquina</font></i><br />
&nbsp;&nbsp;OldTime: Integer = -<font color="#0000FF">1</font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; <strong>AnimFrames</strong> é uma variável útil, já que ela vai permitir carregar as imagens do HD no formato <strong>jpeg</strong> e guardá-las no formato <strong>bitmap</strong>, assim nós só precisamos convertê-las uma vez. Já <strong>RunningAnims</strong> é uma lista com ponteiros para instâncias das animações mostradas na tela. Enfim, nós carregamos as imagens e inicializamos essas variáveis quando o <strong>form</strong> é criado, e liberamos os recursos quando ele é destruído.</p>
<p>&nbsp;&nbsp;&nbsp; Além disso, precisaremos de 2 objetos <strong>TTimer</strong>. Um com o intervalo de 1 milisegundo, que vai controlar a atualização das explosões, e o outro com intervalo de 100 milisegundos, que vai criar animações aleatoriamente na tela.</p>
<p><code><b><font color="#000080">procedure</b></font> TForm1.FormCreate(Sender: TObject);<br />
<b><font color="#000080">var</b></font><br />
&nbsp;&nbsp;I: Integer;<br />
&nbsp;&nbsp;image: TJPEGImage;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;randomize;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// Cria o backbuffer</font></i><br />
&nbsp;&nbsp;bbuffer:= TBitmap.Create;<br />
&nbsp;&nbsp;bbuffer.Width:= <font color="#0000FF">640</font>;<br />
&nbsp;&nbsp;bbuffer.Height:= <font color="#0000FF">480</font>;<br />
&nbsp;&nbsp;bbuffer.Canvas.CopyMode:= cmSrcPaint;<br />
&nbsp;&nbsp;bbuffer.Canvas.Brush.Color:= clBlack;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// Carrega a animação do HD</font></i><br />
&nbsp;&nbsp;setLength(AnimFrames, <font color="#0000FF">36</font>);<br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font> I := <font color="#0000FF">0 </font><b><font color="#000080">to</b></font> <font color="#0000FF">35 </font><b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;image:= TJPEGImage.Create;<br />
&nbsp;&nbsp;&nbsp;&nbsp;image.LoadFromFile(<font color="#0000FF">'explosion/screen'</font> + IntToStr(I+<font color="#0000FF">1</font>) + <font color="#0000FF">'.jpg'</font>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;AnimFrames[I]:= jpeg2bmp(image);<br />
&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(image); <font color="#008000"><i>// libera a imagem da memória</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// Inicializa a lista de animações</font></i><br />
&nbsp;&nbsp;RunningAnims:= TList.Create;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// Habilita o timer</font></i><br />
&nbsp;&nbsp;Timer1.Enabled:= True;<br />
&nbsp;&nbsp;Timer2.Enabled:= True;<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>// Destrói o form e libera os recursos</font></i><br />
<b><font color="#000080">procedure</b></font> TForm1.FormDestroy(Sender: TObject);<br />
<b><font color="#000080">var</b></font> i: Integer;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;FreeAndNil(bbuffer);<br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font> I := <font color="#0000FF">0 </font><b><font color="#000080">to</b></font> <font color="#0000FF">35 </font><b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(AnimFrames[I]);<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; O modo de cópia <strong>cmSrcPaint</strong> em conjunto com o fundo preto, faz com que a cor preta das imagens desenhadas no <strong>backbuffer</strong> fique transparente.</p>
<p>&nbsp;&nbsp;&nbsp; Agora que inicializamos tudo, falta criar as animações. Então no evento <strong>OnTimer</strong> do <strong>Timer2</strong> vamos colocar um pequeno código que cria animações aleatórias pela tela.</p>
<p><code><font color="#008000"><i>// cria animações em intervalos regulares em posições aleatórias</font></i><br />
<b><font color="#000080">procedure</b></font> TForm1.Timer2Timer(Sender: TObject);<br />
<b><font color="#000080">var</b></font> anim: TAnimation;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>// instancia a animação</font></i><br />
&nbsp;&nbsp;anim:= TAnimation.Create;<br />
&nbsp;&nbsp;<font color="#008000"><i>// coloca a animação em um lugar aleatório da tela</font></i><br />
&nbsp;&nbsp;anim.X:= Random(ClientWidth);<br />
&nbsp;&nbsp;anim.Y:= Random(ClientHeight);<br />
&nbsp;&nbsp;<font color="#008000"><i>// carrega os frames da matriz AnimFrames na animação</font></i><br />
&nbsp;&nbsp;anim.SetFrames(AnimFrames);<br />
&nbsp;&nbsp;<font color="#008000"><i>// seta um tempo de espera aleatório</font></i><br />
&nbsp;&nbsp;anim.Delay:= random(<font color="#0000FF">10</font>)+<font color="#0000FF">20</font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>// adiciona o ponteiro da instância na lista de animações ativas</font></i><br />
&nbsp;&nbsp;RunningAnims.Add(anim);<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Por fim, precisamos escrever o código do evento <strong>OnTimer</strong> do <strong>Timer1</strong>, que irá controlar todas as animações ativas na tela. Isso é possível pois temos uma lista de todas as animações ativas guardadas em <strong>RunningAnims</strong>, então basta percorrer esta lista e atualizar as animações nela.</p>
<p><code><font color="#008000"><i>// Timer que controla a atualização da tela</font></i><br />
<b><font color="#000080">procedure</b></font> TForm1.Timer1Timer(Sender: TObject);<br />
<b><font color="#000080">var</b></font><br />
&nbsp;&nbsp;I: Integer;<br />
&nbsp;&nbsp;at: TAnimation;<br />
&nbsp;&nbsp;Lag: Integer;<br />
&nbsp;&nbsp;t: Integer;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>// como o timer tem um intervalo de 1 milisegundo, esperamos que a tela</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>// seja atualizada neste intervalo, mas se demorarmos mais para atualizar</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>// a tela, verifica quanto tempo se passou para que a animação não seja</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>// prejudicada</font></i><br />
&nbsp;<br />
&nbsp;&nbsp;t:= getTickCount;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> OldTime &lt; <font color="#0000FF">0 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;OldTime:= t;<br />
&nbsp;&nbsp;Lag:= (t - OldTime);<br />
&nbsp;&nbsp;OldTime:= t;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> Lag &lt; <font color="#0000FF">0 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;Lag:= <font color="#0000FF">1</font>;<br />
&nbsp;&nbsp;I:= <font color="#0000FF">0</font>;<br />
&nbsp;<br />
&nbsp;&nbsp;Inc(FPSTime, Lag);<br />
&nbsp;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> FPSTime &gt; <font color="#0000FF">1000 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;FPSTime:= FPSTime - <font color="#0000FF">1000</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FPS:= Frames;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Frames:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;Inc(Frames);<br />
&nbsp;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> FPS &gt; -<font color="#0000FF">1 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;caption:= <font color="#0000FF">'Parte IV - Animações - FPS: '</font> + &nbsp;IntToStr(FPS);<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// limpa o canvas</font></i><br />
&nbsp;&nbsp;bbuffer.Canvas.FillRect(Rect(<font color="#0000FF">0</font>,<font color="#0000FF">0</font>,<font color="#0000FF">640</font>,<font color="#0000FF">480</font>));<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// desenha todas as animações da lista</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">while</b></font> I &lt; RunningAnims.Count-<font color="#0000FF">1 </font><b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;at:= TAnimation(RunningAnims.Items[I]);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>// se a animação tiver acabado, retira ela da lista</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">if</b></font> at.fFrame = -<font color="#0000FF">1 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RunningAnims.Remove(at);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(at);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">end</b></font><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>// do contrário, atualiza e desenha a animação</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">else</b></font> <b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at.Update(lag);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at.Paint(bbuffer.Canvas);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(I);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>// envia o backbuffer pra tela</font></i><br />
&nbsp;&nbsp;Canvas.Draw(<font color="#0000FF">0</font>,<font color="#0000FF">0</font>, bbuffer);<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Para ver o efeito das animações basta rodar o programa e voílà! Você deve ver várias animações sendo criadas aleatóriamente pela tela em intervalos regulares.</p>
<p><b>- Conclusão -</b></p>
<p>&nbsp;&nbsp;&nbsp; Esse foi um pequeno tutorial para desenvolvimento de jogos em Delphi, utilizando apenas a <strong>GDI</strong> do Windows. Claro, você não deve utilizar a GDI do Windows para desenvolver jogos, mas o conceito aqui se aplica a qualquer outra framework. Eu pretendo escrever mais tutoriais de GameDev em Delphi, utilizando frameworks como <strong><a href="http://www.afterwarp.net/">Asphyre</a></strong> e <strong><a href="http://www.delphi-jedi.org/">SDL</a></strong> (apesar de estar um pouco mais ocupado agora i.i). Até lá o(^-^)/&#8221;</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/68/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=68&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2009/03/09/criando-jogos-em-delphi-parte-iv/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>
	</item>
		<item>
		<title>[in]utilidades</title>
		<link>http://undercode.wordpress.com/2008/11/28/57/</link>
		<comments>http://undercode.wordpress.com/2008/11/28/57/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 20:31:05 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Off]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=57</guid>
		<description><![CDATA[Eu estou aprendendo java agora e estou gostando bastante (sim, eu gosto de linguagens tipadas &#8212; nem tanto assim também &#8212; e que tenham padrões) apesar de até agora não ter feito nada realmente legal. Bem, paciência, pelo menos o logo de java me anima lol
Quanto ao resto do tutorial de desenvolvimento de jogos em [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=57&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Eu estou aprendendo java agora e estou gostando bastante (sim, eu gosto de linguagens tipadas &#8212; nem tanto assim também &#8212; e que tenham padrões) apesar de até agora não ter feito nada realmente legal. Bem, paciência, pelo menos o logo de java me anima lol</p>
<p>Quanto ao resto do tutorial de desenvolvimento de jogos em Delphi, ele sai sim, aliás, eu estou trabalhando no próximo agora, mas como eu estou estudando quase o dia inteiro (não, não é java, eu estou estudando pro vestiba mesmo) i.i, deve demorar um pouquinho.</p>
<p>E pensar que eu tenho que comprar um novo HD &gt;.&lt; já que o HD do outro pc definitivamente morreu, e o HD deste PC está praticamente lotado (músicas + coisinhas relacionadas à programação + Visual Novels lol aliás, a maior parte do HD está ocupado por visual novels, eu acho que estou ficando viciado nisso). Eu preciso de 1TB, ia realmente resolver a maioria dos meus problemas *-*</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=57&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2008/11/28/57/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>
	</item>
		<item>
		<title>Tile Mapping</title>
		<link>http://undercode.wordpress.com/2008/10/08/tile-mapping/</link>
		<comments>http://undercode.wordpress.com/2008/10/08/tile-mapping/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 16:24:18 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[desenvolvimento de jogos]]></category>
		<category><![CDATA[tile mapping]]></category>
		<category><![CDATA[windows GDI]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=53</guid>
		<description><![CDATA[&#160;&#160;&#160; Técnicas de tile mapping são bastante utilizados em jogos que precisem usar imagens muito grandes em dispositivos com uma memória reduzida. Neste artigo eu vou falar um pouco sobre a estrutura destes arquivos e sua respectiva implementação em Delphi (Object Pascal).
- O que é tile mapping? -
&#160;&#160;&#160; Tile Mapping é uma técnica que consiste [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=53&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>&nbsp;&nbsp;&nbsp; Técnicas de <i>tile mapping</i> são bastante utilizados em jogos que precisem usar imagens muito grandes em dispositivos com uma memória reduzida. Neste artigo eu vou falar um pouco sobre a estrutura destes arquivos e sua respectiva implementação em <b>Delphi</b> (Object Pascal).</p>
<p><b>- O que é tile mapping? -</font></b></p>
<p>&nbsp;&nbsp;&nbsp; <i>Tile Mapping</i> é uma técnica que consiste em formar imagens 2d grandes a partir de blocos menores, chamados <i>tiles</i>. Uma imagem formada por esta técnica tende a ter várias partes que se repetem, portanto seria desperdício alocar memória para esta mesma parte várias vezes.</p>
<p>&nbsp;&nbsp;&nbsp; <i>Tiles</i> são, além de blocos menores de imagem, estruturas que guardam várias informações sobre a imagem que será desenhada, como o tipo de bloco que ele representa, se ele é um obstáculo ou não, se ele possui animações, etc.</p>
<p>&nbsp;&nbsp;&nbsp; Você deve estar acostumado a ver jogos usando esta técnica em RPGs, jogos de plataforma 2d e mesmo jogos desenvolvidos para plataformas móveis (GB, GBA, NDS, celulares, &#8230;).</p>
<p>&nbsp;&nbsp;&nbsp; Exemplo de jogo usando técnicas de <i>tile mapping</i>:</p>
<p align="center"><img border="0" src="http://undercode.files.wordpress.com/2008/10/img1.jpg?w=400&#038;h=150" width="400" height="150"><br />
<i>Mario é um exemplo de jogo que utiliza a técnica de tile mapping</i></p>
<p><b>- Estrutura -</font></b></p>
<p>&nbsp;&nbsp;&nbsp; Como foi dito antes, a técnica de <i>tile mapping</i> consiste em formar uma imagem grande a partir de blocos menores de imagem. Para isso nós usamos uma matriz bidimensional, o <i>tile map</i>, que indica qual posição cada um desses blocos ocupa.</p>
<p>&nbsp;&nbsp;&nbsp; A estrutura abaixo representa um tipo comum de <i>tilemap</i>:</p>
<p><code>&nbsp;&nbsp;<font color="#008000"><i>//essas&nbsp;flags&nbsp;são&nbsp;usadas&nbsp;para&nbsp;determinar&nbsp;algumas</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//informações&nbsp;sobre&nbsp;o&nbsp;tile</font></i><br />
&nbsp;&nbsp;TTileFlag&nbsp;=&nbsp;(tfObstaculo,&nbsp;tfPlataforma,&nbsp;tfAgua,&nbsp;tfEspinho,&nbsp;tfFogo);<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//aqui&nbsp;eu&nbsp;usei&nbsp;o&nbsp;"set"&nbsp;porque&nbsp;é&nbsp;mais&nbsp;conveniente.</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//mas&nbsp;você&nbsp;pode&nbsp;usar&nbsp;inteiros&nbsp;também.</font></i><br />
&nbsp;&nbsp;TTileFlags&nbsp;=&nbsp;<b><font color="#000080">set</b></font>&nbsp;<b><font color="#000080">of</b></font>&nbsp;TTileFlag;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//Estrutura&nbsp;dos&nbsp;tiles.&nbsp;Varia&nbsp;muito&nbsp;de&nbsp;acordo&nbsp;com&nbsp;as</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//funções&nbsp;que&nbsp;você&nbsp;quer&nbsp;que&nbsp;seu&nbsp;mapa&nbsp;tenha.&nbsp;Este</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//é&nbsp;apenas&nbsp;um&nbsp;exemplo&nbsp;básico&nbsp;</font></i><br />
&nbsp;&nbsp;TTile&nbsp;=&nbsp;<b><font color="#000080">record</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//o&nbsp;índice&nbsp;da&nbsp;imagem&nbsp;que&nbsp;será&nbsp;desenhada</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Imagem:&nbsp;Integer;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//outras&nbsp;informações&nbsp;sobre&nbsp;o&nbsp;tile</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Flags:&nbsp;TTileFlags;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//Estrutura&nbsp;do&nbsp;mapa&nbsp;de&nbsp;tiles</font></i><br />
&nbsp;&nbsp;TTileMap&nbsp;=&nbsp;<b><font color="#000080">record</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//Matriz&nbsp;bidimensional&nbsp;que&nbsp;indica&nbsp;a&nbsp;posição&nbsp;de</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//cada&nbsp;tile&nbsp;no&nbsp;mapa</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;tiles:&nbsp;<b><font color="#000080">array</b></font>&nbsp;<b><font color="#000080">of</b></font>&nbsp;<b><font color="#000080">array</b></font>&nbsp;<b><font color="#000080">of</b></font>&nbsp;TTile;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//O&nbsp;tileset&nbsp;que&nbsp;vamos&nbsp;usar&nbsp;para&nbsp;guardar&nbsp;as&nbsp;imagens</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//dos&nbsp;tiles.</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;TileSet:&nbsp;TBitmap;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//A&nbsp;largura&nbsp;e&nbsp;altura&nbsp;de&nbsp;cada&nbsp;tile&nbsp;armazenado&nbsp;no</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//tileset.</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Width,&nbsp;Height:&nbsp;Integer;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Como vocês podem ver, as imagens não são armazenadas diretamente nos <i>tiles</i>. Isto acontece porque vários <i>tiles</i> diferentes costumam usar a mesma imagem, neste caso é melhor colocar todas as imagens em um outro lugar e usar apenas um índice para identificá-las. Para isso usamos os <i>tilesets</i> (conjunto de <i>tiles</i>).</p>
<p><b>- Tile sets -</font></b></p>
<p>&nbsp;&nbsp;&nbsp; Os <i>tilesets</i> normalmente são um grande arquivo bitmap (ou outro formato de imagem) contendo as imagens. Como todos os <i>tiles</i> têm o mesmo tamanho não há problema em colocá-los todos juntos em uma única e grande imagem.</p>
<p>&nbsp;&nbsp;&nbsp; Dê uma olhada nesta imagem:</p>
<p align="center"><img border="0" src="http://undercode.files.wordpress.com/2008/10/img2.jpg?w=400&#038;h=239" width="400" height="239"><br />
<i>Um tileset utilizado por RPGs</i></p>
<p>&nbsp;&nbsp;&nbsp; Quando o programa precisa desenhar um<i>tile</i>, ele pega o índice da imagem, procura por esta imagem no <i>tileset</i> e copia a imagem do <i>tileset</i> para a tela.</p>
<p>&nbsp;&nbsp;&nbsp; O código abaixo é apenas um exemplo de uma rotina de desenho de <i>tilemaps</i>.</p>
<p><code>&nbsp;&nbsp;<font color="#008000"><i>//percorre&nbsp;todas&nbsp;as&nbsp;linhas&nbsp;da&nbsp;matriz&nbsp;de&nbsp;tiles&nbsp;</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//(tilemap)</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font>&nbsp;Y:=&nbsp;<font color="#0000FF">0&nbsp;</font><b><font color="#000080">to</b></font>&nbsp;High(TileMap.tiles)&nbsp;<b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//percorre&nbsp;todas&nbsp;as&nbsp;colunas&nbsp;da&nbsp;linha&nbsp;Y&nbsp;da</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//matriz&nbsp;de&nbsp;tiles&nbsp;(tilemap)</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">for</b></font>&nbsp;X&nbsp;:=&nbsp;<font color="#0000FF">0&nbsp;</font><b><font color="#000080">to</b></font>&nbsp;High(TileMap.Tiles[Y])&nbsp;<b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//pega&nbsp;a&nbsp;distância&nbsp;do&nbsp;canto&nbsp;esquerdo&nbsp;no&nbsp;tileset</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//note&nbsp;que&nbsp;aqui&nbsp;as&nbsp;imagens&nbsp;usam&nbsp;um&nbsp;índice&nbsp;que</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//começa&nbsp;em&nbsp;1</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ix:=&nbsp;((TileMap.Tiles[Y][X].Imagem&nbsp;-&nbsp;<font color="#0000FF">1</font>)&nbsp;<b><font color="#000080">mod</b></font>&nbsp;TILESET_COLS)&nbsp;*&nbsp;TileMap.Width;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//pega&nbsp;a&nbsp;distância&nbsp;do&nbsp;canto&nbsp;direito&nbsp;do&nbsp;tileset</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iy:=&nbsp;((TileMap.Tiles[Y][X].Imagem&nbsp;<b><font color="#000080">div</b></font>&nbsp;TILESET_COLS)&nbsp;-&nbsp;<font color="#0000FF">1</font>)&nbsp;*&nbsp;TileMap.Height;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//variável&nbsp;com&nbsp;a&nbsp;área&nbsp;a&nbsp;ser&nbsp;copiada&nbsp;do&nbsp;tileset</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TileRect:=&nbsp;Rect(Ix,&nbsp;Iy,&nbsp;Ix&nbsp;+&nbsp;TileMap.Width,&nbsp;Iy&nbsp;+&nbsp;TileMap.Height);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//variável&nbsp;com&nbsp;a&nbsp;área&nbsp;de&nbsp;destino&nbsp;na&nbsp;tela</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DestRect:=&nbsp;Rect(X&nbsp;*&nbsp;TileMap.Width,&nbsp;Y&nbsp;*&nbsp;TileMap.Height,&nbsp;(X+<font color="#0000FF">1</font>)&nbsp;*&nbsp;TileMap.Width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Y+<font color="#0000FF">1</font>)&nbsp;*&nbsp;TileMap.Height);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//copia&nbsp;do&nbsp;tileset&nbsp;para&nbsp;a&nbsp;tela...</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Canvas.CopyRect(DestRect,&nbsp;TileMap.TileSet.Canvas,&nbsp;TileRect);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; As coisas devem começar a fazer sentido agora. Quando o programa vai desenhar o mapa, ele percorre a matriz, pega a imagem correspondente a cada <i>tile</i> no <i>tileset</i> e copia para a tela. Mas imaginem um mapa de 100 x 100, ou 1000 x 1000, ou até maior! Seria muito demorado percorrer um mapa deste tamanho e seria desperdício de tempo e recursos, afinal, nós não precisamos percorrer um mapa inteiro de 100 x 100 <i>tiles</i> se em nossa tela só cabem 10 x 10 <i>tiles</i>.</p>
<p>&nbsp;&nbsp;&nbsp; Então vamos otimizar um pouquinho o código, percorrendo apenas os tiles que estarão visíveis na tela.</p>
<p><code>&nbsp;&nbsp;<font color="#008000"><i>//calcula&nbsp;o&nbsp;número&nbsp;de&nbsp;tiles&nbsp;visíveis&nbsp;horizontalmente</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//Ceil&nbsp;faz&nbsp;com&nbsp;que&nbsp;o&nbsp;número&nbsp;seja&nbsp;arredondado&nbsp;para&nbsp;cima</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//1.3&nbsp;vira&nbsp;2,&nbsp;7.1&nbsp;vira&nbsp;8,&nbsp;etc.</font></i><br />
&nbsp;&nbsp;TilesX:=&nbsp;Ceil(ClientWidth&nbsp;/&nbsp;TileMap.Width);<br />
&nbsp;&nbsp;<font color="#008000"><i>//calcula&nbsp;o&nbsp;número&nbsp;de&nbsp;tiles&nbsp;visíveis&nbsp;verticalmente</font></i><br />
&nbsp;&nbsp;TilesY:=&nbsp;Ceil(ClientHeight&nbsp;/&nbsp;TileMap.Height);<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//ViewX&nbsp;e&nbsp;ViewY&nbsp;são&nbsp;os&nbsp;pontos&nbsp;de&nbsp;onde&nbsp;o&nbsp;mapa&nbsp;começará</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//a&nbsp;ser&nbsp;desenhado.</font></i><br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//percorre&nbsp;as&nbsp;linhas&nbsp;visíveis&nbsp;da&nbsp;matriz&nbsp;de&nbsp;tiles</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//(tilemap)</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font>&nbsp;Y:=&nbsp;ViewY&nbsp;<b><font color="#000080">to</b></font>&nbsp;ViewX&nbsp;+&nbsp;TilesX&nbsp;<b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//percorre&nbsp;as&nbsp;colunas&nbsp;visíveis&nbsp;da&nbsp;linha&nbsp;Y&nbsp;da&nbsp;matriz</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//de&nbsp;tiles&nbsp;(tilemap)</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">for</b></font>&nbsp;X&nbsp;:=&nbsp;ViewX&nbsp;<b><font color="#000080">to</b></font>&nbsp;ViewY&nbsp;+&nbsp;TilesY&nbsp;<b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//pega&nbsp;a&nbsp;distância&nbsp;do&nbsp;canto&nbsp;esquerdo&nbsp;no&nbsp;tileset</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//note&nbsp;que&nbsp;aqui&nbsp;as&nbsp;imagens&nbsp;usam&nbsp;um&nbsp;índice&nbsp;que</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//começa&nbsp;em&nbsp;1</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ix:=&nbsp;((TileMap.Tiles[Y][X].Imagem&nbsp;-&nbsp;<font color="#0000FF">1</font>)&nbsp;<b><font color="#000080">mod</b></font>&nbsp;TILESET_COLS)&nbsp;*&nbsp;TileMap.Width;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//pega&nbsp;a&nbsp;distância&nbsp;do&nbsp;canto&nbsp;direito&nbsp;do&nbsp;tileset</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iy:=&nbsp;((TileMap.Tiles[Y][X].Imagem&nbsp;<b><font color="#000080">div</b></font>&nbsp;TILESET_COLS)&nbsp;-&nbsp;<font color="#0000FF">1</font>)&nbsp;*&nbsp;TileMap.Height;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//variável&nbsp;com&nbsp;a&nbsp;área&nbsp;a&nbsp;ser&nbsp;copiada&nbsp;do&nbsp;tileset</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TileRect:=&nbsp;Rect(Ix,&nbsp;Iy,&nbsp;Ix&nbsp;+&nbsp;TileMap.Width,&nbsp;Iy&nbsp;+&nbsp;TileMap.Height);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//variável&nbsp;com&nbsp;a&nbsp;área&nbsp;de&nbsp;destino&nbsp;na&nbsp;tela</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DestRect:=&nbsp;Rect(X&nbsp;*&nbsp;TileMap.Width,&nbsp;Y&nbsp;*&nbsp;TileMap.Height,&nbsp;(X+<font color="#0000FF">1</font>)&nbsp;*&nbsp;TileMap.Width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Y+<font color="#0000FF">1</font>)&nbsp;*&nbsp;TileMap.Height);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//copia&nbsp;do&nbsp;tileset&nbsp;para&nbsp;a&nbsp;tela...</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Canvas.CopyRect(DestRect,&nbsp;TileMap.TileSet.Canvas,&nbsp;TileRect);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Como vocês puderam ver, o código percorre apenas os <i>tiles</i> visíveis e os desenha na tela.</p>
<p><b>- Finalizando &#8211; </font></b></p>
<p>&nbsp;&nbsp;&nbsp; É isso por hoje, abaixo eu deixo um pequeno código fonte em Delphi de com desenhar esses mapas usando a <b>GDI</b> do windows.</p>
<p><a href="http://www.4shared.com/file/66163246/2c67837c/tile_mapping.html" target="_blank"><img src="http://killdream.webng.com/imgs/download.png"> Download do código fonte</a></p>
<p>&nbsp;&nbsp;&nbsp; Pretendo escrever outros artigos sobre outros tipos de mapas (como os isométricos) e aprofundar um pouco nos <i>tilemaps</i>, usando diversos <i>layers </i>(camadas).</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=53&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2008/10/08/tile-mapping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>

		<media:content url="http://undercode.files.wordpress.com/2008/10/img1.jpg" medium="image" />

		<media:content url="http://undercode.files.wordpress.com/2008/10/img2.jpg" medium="image" />

		<media:content url="http://killdream.webng.com/imgs/download.png" medium="image" />
	</item>
		<item>
		<title>Trix v0.0.2beta release</title>
		<link>http://undercode.wordpress.com/2008/09/11/trix-v002beta-release/</link>
		<comments>http://undercode.wordpress.com/2008/09/11/trix-v002beta-release/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 19:15:48 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[jogos]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[pygame]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tetris]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=50</guid>
		<description><![CDATA[Trix v0.0.2beta release! Algumas melhorias e correção de bugs. O código também está melhor comentado (mas em inglês ^^&#8217;)
- screenshot -

Trix Website ~ Info + Downloads
- Features -
» Graphics in true color with alpha channel
» Background music (with random background music for levels)
» Graphic effects with particles and surfarray
» Sound test
» High scores
» Combo system
» You [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=50&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Trix v0.0.2beta release! Algumas melhorias e correção de bugs. O código também está melhor comentado (mas em inglês ^^&#8217;)</p>
<p style="text-align:center;"><strong>- screenshot -<br />
<a href="http://killdream.webng.com/upload/trix_002ss.jpg" target="_blank"><img src="http://killdream.webng.com/upload/ttrix_002ss.jpg" border="0" alt="" /></a></strong></p>
<p style="text-align:center;"><a href="http://killdream.webng.com/project/trix" target="_blank">Trix Website ~ Info + Downloads</a></p>
<p><strong>- Features -<br />
</strong>» Graphics in true color with alpha channel<br />
» Background music (with random background music for levels)<br />
» Graphic effects with particles and surfarray<br />
» Sound test<br />
» High scores<br />
» Combo system<br />
» You can add your own music to use in levels, just put it in &#8220;bgm&#8221; folder</p>
<p><strong>- Download -</strong><br />
» Source Code (Trix.py ~ 80kb):<br />
<a href="http://www.4shared.com/file/90034098/596e47a2/Trix.html" target="_blank"><img src="http://killdream.webng.com/imgs/download.png" border="0" alt="" align="absMiddle" /> Download this file</a></p>
<p>» Source Version (7z ~ 5.68mb):<br />
<a href="http://www.4shared.com/file/62082659/9a5529c2/Trix_v002.html"><img src="http://killdream.webng.com/imgs/download.png" border="0" alt="" align="absMiddle" /> Download this file</a><br />
<em>Note that downloading the source version you&#8217;ll need to install the dependencies (Python 2.5, Pygame 1.8.1 and Numeric 24.2) before running the game.</em> </p>
<p>» Binary Version (EXE ~ 13.1mb):<br />
<a href="http://www.4shared.com/file/62105939/a1a869a4/setup.html"><img src="http://killdream.webng.com/imgs/download.png" border="0" alt="" align="absMiddle" /> Download this file</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/undercode.wordpress.com/50/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/undercode.wordpress.com/50/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=50&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2008/09/11/trix-v002beta-release/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>

		<media:content url="http://killdream.webng.com/upload/ttrix_002ss.jpg" medium="image" />

		<media:content url="http://killdream.webng.com/imgs/download.png" medium="image" />

		<media:content url="http://killdream.webng.com/imgs/download.png" medium="image" />

		<media:content url="http://killdream.webng.com/imgs/download.png" medium="image" />
	</item>
		<item>
		<title>Trix</title>
		<link>http://undercode.wordpress.com/2008/08/14/trix/</link>
		<comments>http://undercode.wordpress.com/2008/08/14/trix/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 16:06:50 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[jogos]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[pygame]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tetris]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=43</guid>
		<description><![CDATA[Esta semana eu estava mexendo um pouquinho em Python e PyGame (um módulo para usar SDL com python), então eu resolvi (já que eu não tinha criado um antes) criar um joguinho de tetris. Ainda tenho que melhorar um pouco os gráficos do jogo e adicionar algumas coisinhas. O código está um pouco desorganizado e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=43&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Esta semana eu estava mexendo um pouquinho em Python e PyGame (um módulo para usar SDL com python), então eu resolvi (já que eu não tinha criado um antes) criar um joguinho de tetris. Ainda tenho que melhorar um pouco os gráficos do jogo e adicionar algumas coisinhas. O código está um pouco desorganizado e está comentado em inglês (eu tenho mania de ficar comentando o código em inglês *se morre*), no próximo release eu arrumo tudo isso ^-^</p>
<p><strong>- Tela do jogo -</strong></p>
<p><a href="http://undercode.files.wordpress.com/2008/08/screen.jpg"><img class="aligncenter size-medium wp-image-44" src="http://undercode.files.wordpress.com/2008/08/screen.jpg?w=300&#038;h=237" alt="" width="300" height="237" /></a></p>
<p style="text-align:left;">
<p style="text-align:left;">Para baixar o jogo <a href="http://www.4shared.com/file/59035435/a0b24cb0/Trix.html">clique aqui</a> (7.37 mb)</p>
<p style="text-align:left;">Eu tive um pequeno probleminha ao usar o <strong>py2exe</strong> para gerar o executável, ele não aceitava o módulo de músicas T_T. Então para rodar o jogo você vai precisar desses programas/módulos abaixo:</p>
<p style="text-align:left;">Python 2.5 ~ <a href="http://www.python.org/">http://www.python.org/</a><br />
PyGame 1.8.1 ~ <a href="http://www.pygame.org/">http://</a><span class="a"><a href="http://www.pygame.org/">www.pygame.org/</a><br />
NumPy 1.1.1 (para Python 2.5) ~ <a href="http://numpy.scipy.org/">http://numpy.scipy.org/</a></span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/undercode.wordpress.com/43/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/undercode.wordpress.com/43/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=43&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2008/08/14/trix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>

		<media:content url="http://undercode.files.wordpress.com/2008/08/screen.jpg?w=300" medium="image" />
	</item>
		<item>
		<title>Então você quer fazer jogos?</title>
		<link>http://undercode.wordpress.com/2008/08/03/entao-voce-quer-fazer-jogos/</link>
		<comments>http://undercode.wordpress.com/2008/08/03/entao-voce-quer-fazer-jogos/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 20:10:51 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Iniciantes]]></category>
		<category><![CDATA[áreas de jogos]]></category>
		<category><![CDATA[como fazer jogos]]></category>
		<category><![CDATA[desenvolvimento de jogos]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=35</guid>
		<description><![CDATA[Quem costuma freqüentar fórums sobre desenvolvimento de jogos normalmente vê iniciantes fazendo perguntas do tipo: &#8220;Quero criar jogos, por onde eu começo?&#8221; (isso quando não é a nova mania do &#8220;Quero fazer um MMORPG revolucionário.&#8221;). Então eu decidi escrever alguns artigos sobre o assunto, espero que seja útil para quem está começando. ^.^
- Antes de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=35&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Quem costuma freqüentar fórums sobre desenvolvimento de jogos normalmente vê iniciantes fazendo perguntas do tipo: <em>&#8220;Quero criar jogos, por onde eu começo?&#8221;</em> (isso quando não é a nova mania do <em>&#8220;Quero fazer um MMORPG revolucionário.&#8221;</em>). Então eu decidi escrever alguns artigos sobre o assunto, espero que seja útil para quem está começando. ^.^</p>
<p><strong>- Antes de começar -</strong></p>
<p>Antes de começar a desenvolver jogos tenha uma coisa em mente: é um caminho longo e difícil. Então não começe pensando que daqui a duas semanas você vai fazer um Need For Speed ou um Final Fantasy XIII. As empresas que desenvolvem esses jogos gastam milhões de dólares, têm uma equipe bem grande (normalmente mais de 30 pessoas) e principalmente, pessoas com <strong>BASTANTE</strong> experiência na área. Mas um dia, quem sabe, a gente chega lá.</p>
<p>Cerca de 70% (sim, tudo isso) dos projetos de amadores acaba abandonado no meio (eu mesmo já abandonei muitos) porque as coisas começam a ficar muito mais difícil do que imaginavam e as pessoas começam a desanimar com o projeto. Existem pessoas que começam tentando fazer RPGs e gastam muito tempo e dinheiro para depois abandonar o projeto no meio. Fica a dica: não tente começar por projetos maiores do que o que você consegue completar.</p>
<p><strong>- Mas e então, por onde eu começo? -</strong></p>
<p>Essa pergunta vai depender muito do que você realmente quer fazer. A área de desenvolvimento de jogos é <strong>muito</strong> extensa e possui coisas que você nem imagina (<em>Design de interiores, Moda, e muitas outras</em>). Então antes de perguntar por onde começar, que tal ver qual das áreas de desenvolvimento de jogos você quer trabalhar.</p>
<p><em>Note que aqui eu só coloquei as principais áreas.</em></p>
<p><strong>» Programação</strong></p>
<p>O pessoal da programação é o responsável por passar o jogo do papel para uma linguagem que o computador entenda. Se você gosta de matemática, física, lógica e inteligência artificial esta deve ser a área mais adequada para você. Mas tenha em mente que você vai precisar estudar bastante. É recomendável também aprender inglês, já que a maioria do conteúdo está neste idioma.</p>
<p><strong>» Artes gráficas</strong></p>
<p>O pessoal desta área é o responsável pelo conteúdo visual do jogo, seja ele em 2D ou 3D. Se você gosta de desenhar, de modelagem 3D, de animação ou qualquer outro tipo de arte gráfica, seu talento pode ser explorado na área de jogos.</p>
<p><strong>» Game design</strong></p>
<p>Normalmente ignorado pelos desenvolvedores <em>indie</em> (independentes), os Game Designers são os responsáveis por projetar o jogo. Se você vive tendo idéias sobre jogos, se gosta de escrever histórias, criar personagens, projetar cenários, enfim, esta é a área ideal para você. É recomendável um pouco de conhecimento em todas as áreas do desenvolvimento, mas isso não é obrigatório.</p>
<p><strong>» Música e som</strong></p>
<p>As músicas e efeitos sonoros são o responsáveis pela imersão no ambiente do jogo. Se você gosta de compor, tocar, dublar, etc. você pode aproveitar seus talentos na área de jogos.</p>
<p><strong>- Já sei o que quero fazer, e agora? -</strong></p>
<p>Estude bastante, monte uma pequena equipe ou seja o típico &#8220;faz-tudo&#8221;. Comece por projetos pequenos, jogos 2D. A medida que você (e sua equipe, se tiver uma) for ganhando experiência e confiança em seus trabalhos parta para projetos maiores e mais arriscados.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/undercode.wordpress.com/35/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/undercode.wordpress.com/35/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/35/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=35&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2008/08/03/entao-voce-quer-fazer-jogos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>
	</item>
		<item>
		<title>Alpha Blending</title>
		<link>http://undercode.wordpress.com/2008/07/19/alpha-blending/</link>
		<comments>http://undercode.wordpress.com/2008/07/19/alpha-blending/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 16:41:50 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[alpha blending]]></category>
		<category><![CDATA[processamento de imagem]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=28</guid>
		<description><![CDATA[- Alpha Blending -
&#160;&#160;&#160; O Alpha Blending consiste em juntar duas imagens levando em conta o canal alpha, ou seja, a transparência em cada pixel. Aqui eu vou abordar apenas uma forma simples e eficiente para desenhar imagens semi-transparentes (mas sem transparência por pixel). Os códigos estão em Object Pascal (Delphi/Lazarus), mas creio que será [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=28&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><b>- Alpha Blending -</b></p>
<p>&nbsp;&nbsp;&nbsp; O <i>Alpha Blending </i>consiste em juntar duas imagens levando em conta o canal alpha, ou seja, a transparência em cada pixel. Aqui eu vou abordar apenas uma forma simples e eficiente para desenhar imagens semi-transparentes (mas sem transparência por pixel). Os códigos estão em <b>Object Pascal</b> (<i>Delphi/Lazarus</i>), mas creio que será bem fácil adaptar para outras linguagens.</p>
<p><b>- Matemática -</b></p>
<p>&nbsp;&nbsp;&nbsp; Para combinar as imagens nós combinamos cada pixel de uma imagem com os pixels da outra imagem. Como exemplo, suponha que vamos desenhar uma imagem totalmente verde limão com 50% de transparência (R: 0, G: 255, B: 0) em cima de uma imagem vermelha (R: 255, G: 0, B: 0). Observe o resultado na imagem abaixo:</p>
<p align="center"><img border="0" src="http://undercode.files.wordpress.com/2008/07/pixel.gif?w=377&#038;h=165" width="377" height="165"><br /><i>Combinando os pixels</i></p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A matemática para essa combinação é muito simples: pegamos as cores principais do pixel a ser desenhado e multiplicamos cada uma pela porcentagem de transparência da imagem (nesse caso 50%, o que seria a mesma coisa que dividir os valores por 2) e somamos com o valor das cores principais do pixel base (da imagem onde iremos desenhar) multiplicado por 100% &#8211; a transparência da imagem a ser desenhada (que nesse caso também seria 50%). Assim nós chegamos à esta equação:</p>
<p><code>cor final = (cor do pixel 2 * transparência da imagem) + (cor do pixel 1 * 100% - transparência da imagem))</code></p>
<p align="left">&nbsp;&nbsp;&nbsp; Levando em conta o exemplo acima, usaríamos esta equação três vezes (uma para cada cor principal):</p>
<p><code>&nbsp;&nbsp;vermelho = (<font color="#0000FF">0 </font>* <font color="#0000FF">50</font>%) + (<font color="#0000FF">255 </font>* (<font color="#0000FF">100</font>% - <font color="#0000FF">50</font>%)) = <font color="#0000FF">127</font>,<font color="#0000FF">5</font><br />
&nbsp;&nbsp;verde = (<font color="#0000FF">255 </font>* <font color="#0000FF">50</font>%) + (<font color="#0000FF">0 </font>* (<font color="#0000FF">100</font>% - <font color="#0000FF">50</font>%)) = <font color="#0000FF">127</font>,<font color="#0000FF">5</font><br />
&nbsp;&nbsp;azul = (<font color="#0000FF">0 </font>* <font color="#0000FF">50</font>%) + (<font color="#0000FF">0 </font>* (<font color="#0000FF">100</font>% - <font color="#0000FF">50</font>%)) = <font color="#0000FF">0</font></code></p>
<p align="left"><b>- Optimização x Precisão -</b></p>
<p align="left">&nbsp;&nbsp;&nbsp; Um dos maiores problemas no processamento de imagens é que precisamos utilizar muita matemática (no exemplo acima, por exemplo, utilizamos diversas vezes multiplicações e divisões com números decimais! Isto leva muito tempo), por isso que muitas vezes é melhor utilizar algo veloz, mas que chegue perto da precisão (não precisa ser 100%). No caso do<i>alpha blending</i> essa situação é razoável, já que o valor das cores varia de 0 a 255 (byte).</p>
<p align="left">&nbsp;&nbsp;&nbsp; Não entendeu o porquê do fato do valor das cores ser compatível com o formato byte (0..255) influenciar na performance? Simples! A base de todos os dados no computador são números binários (0 e 1), certo? Então quando temos valores divisíveis por 2 podemos, ao invés da divisão e multiplicação, utilizar simples (e rápidas) operações com bits.</p>
<p align="left"><i>&nbsp;&nbsp;&nbsp; E como utilizar estas operações?!</i></p>
<p align="left">&nbsp;&nbsp;&nbsp; Em<b> Object Pascal</b> nós temos os operadores<b> shr</b> e <b>shl<i> </i></b>(&quot;&gt;&gt;&quot; e &quot;&lt;&lt;&quot;, respectivamente em C/C++) que podem ser utilizados em uma operação aritmética (assim como os operadores <b>not, and, or</b> e<b> xor</b>). Esses operadores servem para alterar diretamente os bits dos dados. A operação <b>x shr y</b> ou <b>x shl y</b>, por exemplo, moveria <b>x</b> para a direita ou para a esquerda por <b>y</b> bits. Isso significa que se <b>x</b> for o número binário 1000 (8, em decimais) executarmos a operação<b> x shr 2</b> retornaria o número binário 10 (2, em decimais) e uma operação <b>x shl 2</b> retornaria o número binário 100000 (32, em decimais). Note que no primeiro caso nós tiramos os dois últimos bits de <b>x</b>, e no segundo caso nós colocamos 2 bist no final do número!</p>
<p align="left">&nbsp;&nbsp;&nbsp; Vamos então partir da nossa equação anterior, mas agora ao invés de números decimais vamos utilizar números inteiros. Note que a transparência aqui também deve ser um byte, ou seja, deve estar entre 0 e 255:</p>
<p><code>cor final = ((cor <font color="#0000FF">2 </font>* transparência)/<font color="#0000FF">255</font>) + (cor <font color="#0000FF">1 </font>* (<font color="#0000FF">255 </font>- transparência)) / <font color="#0000FF">255</font>)</code></p>
<p align="left">&nbsp;&nbsp;&nbsp; Não parece muito bom, não é. Acabamos de adicionar mais multiplicações e divisões. Mas essa equação ainda é 100% precisa. Vamos mexer nela um pouquinho.</p>
<p><code>cor final = ((cor <font color="#0000FF">2 </font>* transparência) <b><font color="#000080">shr</b></font> <font color="#0000FF">8</font>) + ((cor <font color="#0000FF">1 </font>* (<font color="#0000FF">256 </font>- transparência)) <b><font color="#000080">shr</b></font> <font color="#0000FF">9</font>) <b><font color="#000080">shl</b></font> <font color="#0000FF">1</font></code></p>
<p align="left">&nbsp;&nbsp;&nbsp; Trocamos as divisões por simples mudanças de bits, mas a precisão caiu um pouquinho. Se executarmos essa equação para as cores do primeiro exemplo a cor retornada seria (R: 126, G: 128, B: 0).</p>
<p align="left"><b>- Tabela de Transparência -</b></p>
<p align="left">&nbsp;&nbsp;&nbsp; Alternativamente você pode usar tabelas de transparências. Essas nada mais são do que valores de transparência pré-calculados e armazenados na memória. Como esses valores já estarão no formato byte, você não terá que fazer conversões ou testes, portanto a execução será mais rápida. Claro que tudo isso ao custo de um pouco de espaço na memória (vamos alocar uma matriz bi-dimensional de bytes).</p>
<p align="left">&nbsp;&nbsp;&nbsp; Bem, vamos começar definindo nossa matriz global:</p>
<p><code><b><font color="#000080">var</b></font><br />
&nbsp;&nbsp;AlphaTable: <b><font color="#000080">array</b></font> [<font color="#0000FF">0</font>..<font color="#0000FF">255</font>,<font color="#0000FF">0</font>..<font color="#0000FF">255</font>] <b><font color="#000080">of</b></font> Byte;</code></p>
<p align="left">&nbsp;&nbsp;&nbsp; Em seguida temos que inicializá-la, então vamos criar uma função para isso:</p>
<p><code><b><font color="#000080">procedure</b></font> InitAlphaTable;<br />
<b><font color="#000080">var</b></font> x, y: Integer;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font> y:= <font color="#0000FF">0 </font><b><font color="#000080">to</b></font> <font color="#0000FF">255 </font><b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">for</b></font> x:= <font color="#0000FF">0 </font><b><font color="#000080">to</b></font> <font color="#0000FF">255 </font><b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AlphaTable[y,x]:= Trunc(y * (x/<font color="#0000FF">255</font>));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p align="left">&nbsp;&nbsp;&nbsp; Agora, antes de qualquer referência à tabela de transparência nós precisamos chamar a função para inicializá-la. Isso pode ser feito no início do programa.</p>
<p align="left"><b>- Exemplo -</b></p>
<p align="left">&nbsp;&nbsp;&nbsp; Segue um pequeno exemplo de como combinar dois bitmaps utilizando a técnica de Alpha Blending. O código está em <b>Object Pascal</b>.</p>
<p><code><b><font color="#000080">const</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>{&nbsp;Máximo de pixels em uma array de cores &nbsp;}</font></i><br />
&nbsp;&nbsp;MaxPixels = <font color="#0000FF">32768</font>;<br />
&nbsp;<br />
<b><font color="#000080">type</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>{&nbsp;Array de cores para Bitmap &nbsp;}</font></i><br />
&nbsp;&nbsp;TRGBTripleArray = <b><font color="#000080">array</b></font> [<font color="#0000FF">0</font>..MaxPixels-<font color="#0000FF">1</font>] <b><font color="#000080">of</b></font> TRGBTriple;<br />
&nbsp;&nbsp;pRGBTripleArray = ^TRGBTripleArray;<br />
&nbsp;<br />
<b><font color="#000080">function</b></font> MergeBMP(bmp1, bmp2: TBitmap; alpha: Byte; x, y: Integer): TBitmap;<br />
<b><font color="#000080">var</b></font> p, p2, p3: pRGBTripleArray;<br />
&nbsp;&nbsp;&nbsp;&nbsp;w, h: Integer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;c, l: Integer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp: TBitmap;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ai: Byte;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//Cria o bitmap de destino...</font></i><br />
&nbsp;&nbsp;tmp:= TBitmap.Create;<br />
&nbsp;&nbsp;<font color="#008000"><i>//Todos os bitmaps devem ser 24bit</font></i><br />
&nbsp;&nbsp;tmp.pixelFormat:= pf24bit;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> bmp1.PixelFormat  pf24bit <b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;bmp1.PixelFormat:= pf24bit;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> bmp2.PixelFormat  pf24bit <b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;bmp2.PixelFormat:= pf24bit;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//Assigna ao bitmap base (bmp1)</font></i><br />
&nbsp;&nbsp;tmp.Assign(bmp1);<br />
&nbsp;<br />
&nbsp;&nbsp;w:= bmp2.Width;<br />
&nbsp;&nbsp;h:= bmp2.Height;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//verificação de posição e tamanho</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> x &lt; <font color="#0000FF">0 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;x:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> y &lt; <font color="#0000FF">0 </font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;y:= <font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> x + w &gt; bmp1.width <b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;w:= bmp1.width;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font> y + h &gt; bmp1.height <b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;h:= bmp1.height;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//Inverso da transparência</font></i><br />
&nbsp;&nbsp;ai:= <font color="#0000FF">255 </font>- alpha;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//percorre os pixels e seta a transparência...</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font> l:= y <b><font color="#000080">to</b></font> h-<font color="#0000FF">1 </font><b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//pega a scanline dos bitmaps</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;p:= tmp.ScanLine[l];<br />
&nbsp;&nbsp;&nbsp;&nbsp;p2:= bmp1.ScanLine[l];<br />
&nbsp;&nbsp;&nbsp;&nbsp;p3:= bmp2.ScanLine[l];<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">for</b></font> c:= x <b><font color="#000080">to</b></font> w-<font color="#0000FF">1 </font><b><font color="#000080">do</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//azul...</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p^[c].rgbtBlue := AlphaTable[p3^[c].rgbtBlue, alpha] + AlphaTable[p2^[c].rgbtBlue, ai];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//verde</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p^[c].rgbtGreen := AlphaTable[p3^[c].rgbtGreen, alpha] + AlphaTable[p2^[c].rgbtGreen, ai];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//vermelho</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p^[c].rgbtRed := AlphaTable[p3^[c].rgbtRed, alpha] + AlphaTable[p2^[c].rgbtRed, ai];<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//Retorna o bitmap temporário</font></i><br />
&nbsp;&nbsp;Result:= tmp;<br />
<b><font color="#000080">end</b></font>;</code></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/undercode.wordpress.com/28/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/undercode.wordpress.com/28/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=28&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2008/07/19/alpha-blending/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>

		<media:content url="http://undercode.files.wordpress.com/2008/07/pixel.gif" medium="image" />
	</item>
		<item>
		<title>O que você está jogando atualmente?</title>
		<link>http://undercode.wordpress.com/2008/07/18/o-que-voce-esta-jogando-atualmente/</link>
		<comments>http://undercode.wordpress.com/2008/07/18/o-que-voce-esta-jogando-atualmente/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 00:18:30 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Off]]></category>
		<category><![CDATA[jogos]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=24</guid>
		<description><![CDATA[Como o Rodrigo perguntou isso aqui eu resolvi fazer um post sobre isso também (eu respondi nos comentários os jogos que estou jogando). Eu não sou um jogador muito hardcore, na verdade eu até prefiro jogos 2D mais antigos e minha paixão mesmo é o RPG (ultimamente tenho jogado algumas visual novels também, mas o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=24&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Como o Rodrigo perguntou isso <a href="http://www.rodrigoflausino.com/blog/o-que-voce-esta-jogando-atualmente/">aqui</a> eu resolvi fazer um post sobre isso também (eu respondi nos comentários os jogos que estou jogando). Eu não sou um jogador muito hardcore, na verdade eu até prefiro jogos 2D mais antigos e minha paixão mesmo é o RPG (ultimamente tenho jogado algumas visual novels também, mas o problema é que a maioria é eroge e eu realmente não gosto disso em um jogo).</p>
<p>Respondendo a pergunta, atualmente estou jogando esses joguinhos:</p>
<p><strong>- Phoenix Wright Ace Attorney: Justice for All (ds) -</strong></p>
<p style="text-align:center;"><a href="http://undercode.files.wordpress.com/2008/07/phoenix-wright-3.jpg"><img class="aligncenter size-medium wp-image-25" src="http://undercode.files.wordpress.com/2008/07/phoenix-wright-3.jpg?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<p>Esse jogo foi o responsável por minha paixão pelas visual novels. Nesse jogo você joga com Phoenix Wright (Ohhh!), um advogado de defesa, e deve investigar, juntar pistas e pensar para poder defender seus clientes. Eu estou no segundo caso ainda, mas devo terminar em breve.</p>
<p><strong>- Legend Of Mana (psx) -</strong></p>
<p>Ok, eu já zerei esse jogo xyz³³³ vezes, mas eu estou tentando completar todas as quests (o que eu não consegui ainda) e pegar uma succubus *-*. Fora isso eu AMO jogos com cenários 2D pintados à mão, e Legend of Mana tem um dos mais belos que eu já vi, recomendo (apesar do jogo ser realmente bem fácil).</p>
<p><strong>- Sword Of Mana (gba) -</strong></p>
<p>Outro jogo da série Seiken Densentsu. Apesar de não ter os maravilhosos cenários 2D pintados à mão eu gostei dele.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/undercode.wordpress.com/24/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/undercode.wordpress.com/24/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/24/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=24&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2008/07/18/o-que-voce-esta-jogando-atualmente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9c280863bd9c210358b04e6e98d82fb?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">.killdream</media:title>
		</media:content>

		<media:content url="http://undercode.files.wordpress.com/2008/07/phoenix-wright-3.jpg?w=300" medium="image" />
	</item>
	</channel>
</rss>