<?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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>UnderCode &#187; imagens</title>
	<atom:link href="http://undercode.wordpress.com/tag/imagens/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 &#187; imagens</title>
		<link>http://undercode.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://undercode.wordpress.com/osd.xml" title="UnderCode" />
		<item>
		<title>Criando jogos em Delphi &#8211; Parte II</title>
		<link>http://undercode.wordpress.com/2008/06/25/criando-jogos-em-delphi-parte-ii/</link>
		<comments>http://undercode.wordpress.com/2008/06/25/criando-jogos-em-delphi-parte-ii/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 17:04:38 +0000</pubDate>
		<dc:creator>KillDream</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[desenvolvimento de jogos]]></category>
		<category><![CDATA[imagens]]></category>
		<category><![CDATA[pascal]]></category>
		<category><![CDATA[pong]]></category>
		<category><![CDATA[windows GDI]]></category>

		<guid isPermaLink="false">http://undercode.wordpress.com/?p=17</guid>
		<description><![CDATA[- Imagens -
&#160;&#160;&#160; No primeiro tutorial eu expliquei um pouco sobre como usar as funções da GDI para desenvolver um pequeno &#34;jogo&#34;. Agora vou explicar como usar imagens nos seus jogos. Desenhar imagens com a GDI do windows é muito mais rápido do que usar as funções de desenho, já que não é preciso nenhum [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=17&subd=undercode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><b>- Imagens -</b></p>
<p>&nbsp;&nbsp;&nbsp; No primeiro tutorial eu expliquei um pouco sobre como usar as funções da GDI para desenvolver um pequeno &quot;jogo&quot;. Agora vou explicar como usar imagens nos seus jogos. Desenhar imagens com a GDI do windows é muito mais rápido do que usar as funções de desenho, já que não é preciso nenhum cálculo, basta copiar os pixels para a tela.</p>
<p>&nbsp;&nbsp;&nbsp; Vamos usar para este exemplo imagens no formato bitmap padrão do windows. Exceto pelo fato de não serem comprimidas, elas são a melhor opção para jogos usando a GDI (imagens no formato JPEG podem ser usadas para fundos, mas nunca para sprites).</p>
<p><a href="http://mottaweb.com.br/files/delphi/pong_gfx.zip">&raquo; Baixe aqui o arquivo com as imagens</a></p>
<p><b>- Considerações sobre resolução e número de cores -</b></p>
<p>&nbsp;&nbsp;&nbsp; Desenhar bitmaps de 640 x 480 pixels com 256 cores é mais rápido do que desenhar um bitmap de 800 x 600 com o mesmo número de cores. Assim como desenhar um bitmap de 640 x 480 pixels com 256 cores é mais rápido do que desenhar um bitmap do mesmo tamanho com 24 ou 32 bits de cores. Além disso, o número de cores do backbuffer (o bitmap em que desenhamos antes de enviar para a tela) tem que ter o mesmo número de cores que os bitmaps que serão desenhados nele (do contrário será preciso converter os bitmaps a se desenhar antes, o que pode demorar um pouco). Um backbuffer de 16 bits é uma boa escolha (mesmo para bitmaps de 256 cores, que tem 8 bits). Jogos para computadores antigos precisam ter uma resolução e um número de cores menor (no máximo 256). A resolução do computador atual também afeta o desempenho do jogo. Quanto maior, mais coisas para desenhar, portanto um jogo em fullscreen será mais rápido do que um jogo rodado em janela.</p>
<p><b>- Carregando as imagens -</b></p>
<p>&nbsp;&nbsp;&nbsp; Antes de usar as imagens precisamos carregá-las para a memória. O motivo? O acesso à memória é muuuito mais rápido do que o acesso ao disco. Mesmo assim temos que tomar cuidado para não carregar coisas demais para a memória. Como esse será um jogo bem simples e vamos usar apenas algumas imagens iremos carregá-las todas de uma vez para a memória, mas em um jogo maior é melhor carregar as imagens correspondentes à cada parte apenas quando for necessário (ex.: ao iniciar uma fase, ao começar um novo mapa, etc.)</p>
<p>&nbsp;&nbsp;&nbsp; Antes de encher a página de códigos (nem são tantos assim) vou explicar um pouco sobre as diferentes maneiras de carregar e gerenciar imagens na memória.</p>
<p><b>- Utilizando TImages -</b></p>
<p>&nbsp;&nbsp;&nbsp; A forma mais simples de carregar imagens para a memória no Delphi (mas não tão boa ou flexível) é usar TImages. Quando você adiciona um TImage ao formulário e coloca uma imagem nele o Delphi salva essa imagem em um arquivo de recurso (.RES) e carrega a imagem para a memória assim que o formulário é criado. Esse arquivo .RES é embutido no final do arquivo .EXE, então tudo o que você precisa fazer é distribuir um único .EXE e usar a propriedade <b>Graphic</b> do <b>TPicture</b> para desenhar a imagem. A vantagem desse método é que você não precisa se preocupar em carregar ou liberar a imagem da memória, o Delphi fará isso para você, além disso fica mais difícil um usuário comum copiar as imagens do seu jogo (embora tenha vários editores de resources por aí). A desvantagem é não poder usar esta técnica para muitas imagens ou imagens muito pesadas.</p>
<p align="center"><img border="0" src="http://i262.photobucket.com/albums/ii120/killdream/img_1.jpg" width="400" height="317"><br />
<i>Usando TImages para carregar as imagens.</i></p>
<p align="left"><b>- Carregando imagens do disco -</b></p>
<p align="left">&nbsp;&nbsp;&nbsp; Essa é a técnica mais utilizada pelos jogos (e a que vamos usar neste tutorial). Consiste em manter algumas variáveis e carregar as imagens do disco para estas variáveis quando for preciso utilizá-las. Aqui vamos usar uma matriz de bitmaps para armazenar todas as imagens na memória (não se esqueça de deixar todas as imagens na mesma pasta do programa).</p>
<p align="left">&nbsp;&nbsp;&nbsp; Além dessas duas técnicas existem outras, que utilizam arquivos de recursos dinâmicos, dlls ou mesmo um grande arquivo com todas as imagens nele, mas eu não vou falar deles aqui.</p>
<p align="left"><b>- Um pequeno exemplo -</b></p>
<p align="left">&nbsp;&nbsp;&nbsp; Vamos construir um pequeno joguinho de <b>pong</b> bem simples. Crie um formulário e deixe a <b>ClientWidth </b>em 640 e a <b>ClientHeight</b> em 480 (a ClientWidth e ClientHeight se referem apenas à área útil do formulário, sem contar as bordas ou a barra de título), essa será a resolução do nosso joguinho. Declare as seguintes variáveis globais:</p>
<p><code><b><font color="#000080">var</b></font><br />
&nbsp;&nbsp;Form1:&nbsp;TForm1;<br />
&nbsp;&nbsp;<font color="#008000"><i>//backbuffer</font></i><br />
&nbsp;&nbsp;bbuffer:&nbsp;TBitmap;<br />
&nbsp;&nbsp;<font color="#008000"><i>//matriz&nbsp;de&nbsp;bitmaps&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;bitmaps:&nbsp;<b><font color="#000080">array</b></font>&nbsp;<b><font color="#000080">of</b></font>&nbsp;TBitmap;</code></p>
<p align="left">&nbsp;&nbsp;&nbsp; Declaramos uma matriz de bitmaps para carregar todas as imagens do jogo para a memória, agora precisamos carregar estes gráficos. Lembre-se que temos que inicializar os bitmaps antes de carregar as imagens e liberá-los da memória quando não precisarmos mais deles.</p>
<p><code><font color="#008000"><i>//função&nbsp;que&nbsp;carrega&nbsp;uma&nbsp;nova&nbsp;imagem&nbsp;na&nbsp;matriz</font></i><br />
<b><font color="#000080">procedure</b></font>&nbsp;loadImage(imagem:&nbsp;<b><font color="#000080">string</b></font>);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//aloca&nbsp;um&nbsp;novo&nbsp;espaço&nbsp;na&nbsp;memória&nbsp;para&nbsp;a&nbsp;imagem</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//como&nbsp;aqui&nbsp;estamos&nbsp;usando&nbsp;matrizes&nbsp;dinâmicas</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//fica&nbsp;bem&nbsp;fácil&nbsp;fazer&nbsp;isso.</font></i><br />
&nbsp;&nbsp;SetLength(bitmaps,&nbsp;Length(bitmaps)&nbsp;+&nbsp;<font color="#0000FF">1</font>);<br />
&nbsp;&nbsp;<font color="#008000"><i>//cria&nbsp;e&nbsp;carrega&nbsp;a&nbsp;imagem</font></i><br />
&nbsp;&nbsp;bitmaps[high(bitmaps)]:=&nbsp;TBitmap.Create;<br />
&nbsp;&nbsp;<b><font color="#000080">with</b></font>&nbsp;bitmaps[high(bitmaps)]&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>//carrega&nbsp;do&nbsp;arquivo&nbsp;no&nbsp;disco&nbsp;para&nbsp;a&nbsp;memória</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;LoadFromFile(imagem);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//adiciona&nbsp;a&nbsp;transparência</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Transparent:=&nbsp;true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//modifica&nbsp;a&nbsp;cor&nbsp;de&nbsp;transparência&nbsp;para&nbsp;magenta</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;TransparentColor:=&nbsp;clFuchsia;<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>//função&nbsp;que&nbsp;libera&nbsp;todos&nbsp;os&nbsp;bitmaps&nbsp;da&nbsp;matriz</font></i><br />
<b><font color="#000080">procedure</b></font>&nbsp;freeBitmaps;<br />
<b><font color="#000080">var</b></font>&nbsp;i:&nbsp;Integer;&nbsp;<font color="#008000"><i>//variável&nbsp;de&nbsp;controle&nbsp;do&nbsp;laço</font></i><br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//percorre&nbsp;toda&nbsp;a&nbsp;matriz...</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font>&nbsp;i:=&nbsp;<font color="#0000FF">0&nbsp;</font><b><font color="#000080">to</b></font>&nbsp;High(bitmaps)&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>//libera&nbsp;o&nbsp;bitmap&nbsp;da&nbsp;memória..</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(bitmaps[i]);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//libera&nbsp;o&nbsp;espaço&nbsp;alocado&nbsp;para&nbsp;a&nbsp;matriz</font></i><br />
&nbsp;&nbsp;bitmaps:=&nbsp;<b><font color="#000080">nil</b></font>;<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<b><font color="#000080">procedure</b></font>&nbsp;LoadGameGraphics;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//carrega&nbsp;todas&nbsp;as&nbsp;imagens&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'0.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'1.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'2.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'3.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'4.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'5.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'6.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'7.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'8.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'9.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'ball.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'bar.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'cpu.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'cts_text.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'field.bmp'</font>);<br />
&nbsp;&nbsp;LoadImage(<font color="#0000FF">'player.bmp'</font>);<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<b><font color="#000080">procedure</b></font>&nbsp;TForm1.FormCreate(Sender:&nbsp;TObject);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//quando&nbsp;o&nbsp;form&nbsp;for&nbsp;criado&nbsp;carregamos&nbsp;as&nbsp;imagens</font></i><br />
&nbsp;&nbsp;LoadGameGraphics;<br />
<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<b><font color="#000080">procedure</b></font>&nbsp;TForm1.FormDestroy(Sender:&nbsp;TObject);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//quando&nbsp;o&nbsp;form&nbsp;for&nbsp;destruído,&nbsp;liberamos&nbsp;as&nbsp;imagens</font></i><br />
&nbsp;&nbsp;freeBitmaps;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p align="left">&nbsp;&nbsp;&nbsp; Acho que vocês viram como a coisa funciona. Temos uma função que carrega as imagens na matriz, e chamamos ela quando precisamos carregar alguma imagem, no caso do nosso joguinho, assim que o formulário for criado.</p>
<p align="left">&nbsp;&nbsp;&nbsp; Vamos colocar agora algumas variáveis para controlar os objetos do nosso jogo.</p>
<p><code><b><font color="#000080">type</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//objeto&nbsp;com&nbsp;as&nbsp;informações&nbsp;sobre&nbsp;a&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;TBall&nbsp;=&nbsp;<b><font color="#000080">record</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//posição&nbsp;no&nbsp;plano&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;X,&nbsp;Y:&nbsp;Single;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//largura&nbsp;e&nbsp;altura&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;W,&nbsp;H:&nbsp;Integer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//velocidade&nbsp;horizontal&nbsp;e&nbsp;vertical&nbsp;(determina&nbsp;a</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//direção&nbsp;(ângulo)&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Vx,&nbsp;Vy:&nbsp;Single;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//velocidade&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Speed:&nbsp;Single;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//objeto&nbsp;com&nbsp;as&nbsp;informações&nbsp;da&nbsp;barrinha&nbsp;da&nbsp;AI</font></i><br />
&nbsp;&nbsp;TCPUBar&nbsp;=&nbsp;<b><font color="#000080">record</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//posição&nbsp;da&nbsp;barrinha&nbsp;no&nbsp;plano&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;X,&nbsp;Y:&nbsp;Single;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//largura&nbsp;e&nbsp;altura</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;W,&nbsp;H:&nbsp;Integer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//velocidade&nbsp;máxima&nbsp;da&nbsp;barrinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Speed:&nbsp;Single;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//objeto&nbsp;com&nbsp;as&nbsp;informações&nbsp;da&nbsp;barrinha&nbsp;do&nbsp;jogador</font></i><br />
&nbsp;&nbsp;TPlayerBar&nbsp;=&nbsp;<b><font color="#000080">record</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//posição&nbsp;da&nbsp;barrinha&nbsp;no&nbsp;plano&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;X,&nbsp;Y:&nbsp;Single;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//largura&nbsp;e&nbsp;altura</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;W,&nbsp;H:&nbsp;Integer;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
<font color="#008000"><i>//precisamos&nbsp;criar&nbsp;algumas&nbsp;variáveis&nbsp;para&nbsp;manipular</font></i><br />
<font color="#008000"><i>//esses&nbsp;tipos&nbsp;e&nbsp;outras&nbsp;coisas&nbsp;no&nbsp;jogo</font></i><br />
&nbsp;<br />
<b><font color="#000080">var</b></font><br />
&nbsp;&nbsp;Form1:&nbsp;TForm1;<br />
&nbsp;<br />
&nbsp;&nbsp;ball:&nbsp;TBall;<br />
&nbsp;&nbsp;bar_cp:&nbsp;TCPUBar;<br />
&nbsp;&nbsp;bar_p1:&nbsp;TPlayerBar;&nbsp;&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//indica&nbsp;se&nbsp;o&nbsp;jogo&nbsp;está&nbsp;pausado&nbsp;ou&nbsp;não</font></i><br />
&nbsp;&nbsp;paused:&nbsp;Boolean&nbsp;=&nbsp;true;<br />
&nbsp;&nbsp;<font color="#008000"><i>//pontos&nbsp;do&nbsp;jogador</font></i><br />
&nbsp;&nbsp;score_p1:&nbsp;Integer&nbsp;=&nbsp;<font color="#0000FF">0</font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//pontos&nbsp;da&nbsp;AI</font></i><br />
&nbsp;&nbsp;score_cp:&nbsp;Integer&nbsp;=&nbsp;<font color="#0000FF">0</font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//buffer&nbsp;de&nbsp;desenho&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;bbuffer:&nbsp;TBitmap;<br />
&nbsp;&nbsp;<font color="#008000"><i>//bitmaps&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;bitmaps:&nbsp;<b><font color="#000080">array</b></font>&nbsp;[<font color="#0000FF">0</font>..<font color="#0000FF">15</font>]&nbsp;<b><font color="#000080">of</b></font>&nbsp;TBitmap;</code></p>
<p align="left">&nbsp;&nbsp;&nbsp; Adicione um <b>TTimer</b> no formulário, assim como fizemos da última vez. É esse Timer que vai controlar o loop principal do jogo até ele terminar. O nosso jogo irá terminar apenas quando o usuário fechar a janela. No evento onTimer precisamos fazer algumas coisas:</p>
<ul>
<li>
<p align="left">Analisar as informações do jogo e mover os objetos</li>
<li>
<p align="left">Verificar as entradas do usuário e processá-las no jogo (mover<br />
  a barrinha)</li>
<li>
<p align="left">Verificar colisões com a barrinha ou o cenário</li>
<li>
<p align="left">Desenhar os objetos no backbuffer</li>
<li>
<p align="left">Desenhar o backbuffer na tela</li>
</ul>
<p align="left">&nbsp;&nbsp;&nbsp; Poderíamos colocar todas essas funções dentro do evento OnTimer, mas ao invés disso vamos usar algumas pequenas funções para cada uma dessas funcionalidades e chamá-las dentro do evento OnTimer. Assim o código fica mais organizado e menos repetitivo. Veja abaixo o código do evento OnTimer.</p>
<p><code><b><font color="#000080">procedure</b></font>&nbsp;TForm1.Timer1Timer(Sender:&nbsp;TObject);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//se&nbsp;o&nbsp;jogo&nbsp;não&nbsp;estiver&nbsp;parado</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;<b><font color="#000080">not</b></font>&nbsp;paused&nbsp;<b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;colisões&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball_check_collision;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;a&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball_move;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//controla&nbsp;a&nbsp;AI&nbsp;da&nbsp;barrinha&nbsp;do&nbsp;computador</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;bar_cp_handle;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//limpa&nbsp;a&nbsp;tela&nbsp;anterior&nbsp;para&nbsp;desenharmos&nbsp;a&nbsp;nova&nbsp;tela</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&nbsp;o&nbsp;fundo&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;bbuffer.Canvas.Draw(<font color="#0000FF">37</font>,&nbsp;<font color="#0000FF">77</font>,&nbsp;bitmaps[<font color="#0000FF">14</font>]);<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//pontuação&nbsp;do&nbsp;jogador&nbsp;(texto)</font></i><br />
&nbsp;&nbsp;bbuffer.Canvas.Draw(<font color="#0000FF">37</font>,&nbsp;<font color="#0000FF">10</font>,&nbsp;bitmaps[<font color="#0000FF">15</font>]);<br />
&nbsp;&nbsp;<font color="#008000"><i>//chama&nbsp;a&nbsp;função&nbsp;que&nbsp;cria&nbsp;a&nbsp;imagem&nbsp;da&nbsp;pontuação</font></i><br />
&nbsp;&nbsp;CreateScore(<font color="#0000FF">191</font>,&nbsp;<font color="#0000FF">17</font>,&nbsp;score_p1);<br />
&nbsp;&nbsp;<font color="#008000"><i>//pontuação&nbsp;da&nbsp;AI&nbsp;(texto)</font></i><br />
&nbsp;&nbsp;bbuffer.Canvas.Draw(<font color="#0000FF">424</font>,&nbsp;<font color="#0000FF">10</font>,&nbsp;bitmaps[<font color="#0000FF">12</font>]);<br />
&nbsp;&nbsp;<font color="#008000"><i>//chama&nbsp;a&nbsp;função&nbsp;que&nbsp;cria&nbsp;a&nbsp;imagem&nbsp;da&nbsp;pontuação</font></i><br />
&nbsp;&nbsp;CreateScore(<font color="#0000FF">507</font>,&nbsp;<font color="#0000FF">17</font>,&nbsp;score_cp);<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//Desenha&nbsp;a&nbsp;barrinha&nbsp;do&nbsp;jogador</font></i><br />
&nbsp;&nbsp;bbuffer.Canvas.Draw(Round(bar_p1.x),&nbsp;Round(bar_p1.y),&nbsp;bitmaps[<font color="#0000FF">11</font>]);<br />
&nbsp;&nbsp;<font color="#008000"><i>//Desenha&nbsp;a&nbsp;barrinha&nbsp;da&nbsp;AI</font></i><br />
&nbsp;&nbsp;bbuffer.Canvas.Draw(Round(bar_cp.x),&nbsp;Round(bar_cp.y),&nbsp;bitmaps[<font color="#0000FF">11</font>]);<br />
&nbsp;&nbsp;<font color="#008000"><i>//Desenha&nbsp;a&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;bbuffer.Canvas.Draw(Round(ball.x),&nbsp;Round(ball.y),&nbsp;bitmaps[<font color="#0000FF">10</font>]);<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//temos&nbsp;uma&nbsp;imagem&nbsp;para&nbsp;indicar&nbsp;que&nbsp;o&nbsp;jogo&nbsp;está</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//parado,&nbsp;então,&nbsp;caso&nbsp;esteja&nbsp;desenhamos&nbsp;a&nbsp;imagem</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;paused&nbsp;<b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;bbuffer.Canvas.Draw(<font color="#0000FF">156</font>,&nbsp;<font color="#0000FF">240</font>,&nbsp;bitmaps[<font color="#0000FF">13</font>]);<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//finalmente&nbsp;envia&nbsp;tudo&nbsp;isso&nbsp;para&nbsp;a&nbsp;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>Função que checa se a bolinha colidiu com alguma coisa</p>
<p><code><font color="#008000"><i>//Função&nbsp;que&nbsp;verifica&nbsp;as&nbsp;colisões&nbsp;da&nbsp;bolinha</font></i><br />
<b><font color="#000080">procedure</b></font>&nbsp;ball_check_collision;<br />
<b><font color="#000080">var</b></font>&nbsp;bt:&nbsp;Single;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//distância&nbsp;da&nbsp;bolinha&nbsp;até&nbsp;o&nbsp;topo&nbsp;do&nbsp;cenário</font></i><br />
&nbsp;&nbsp;bt:=&nbsp;<font color="#0000FF">77&nbsp;</font>+&nbsp;(ball.H&nbsp;/&nbsp;<font color="#0000FF">2</font>);<br />
&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;se&nbsp;a&nbsp;bolinha&nbsp;colidiu&nbsp;com&nbsp;o&nbsp;topo&nbsp;do&nbsp;cenário</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;ball.Y&nbsp;&lt;&nbsp;bt&nbsp;<b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//reflete&nbsp;a&nbsp;bolinha&nbsp;com&nbsp;o&nbsp;mesmo&nbsp;ângulo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.Vy:=&nbsp;-ball.Vy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;um&nbsp;pouco&nbsp;a&nbsp;bolinha&nbsp;para&nbsp;evitar&nbsp;outras&nbsp;colisões</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.Y:=&nbsp;bt&nbsp;+&nbsp;(bt&nbsp;-&nbsp;ball.Y);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//distância&nbsp;da&nbsp;bolinha&nbsp;até&nbsp;o&nbsp;fundo&nbsp;do&nbsp;cenário</font></i><br />
&nbsp;&nbsp;bt:=&nbsp;<font color="#0000FF">77&nbsp;</font>+&nbsp;<font color="#0000FF">366&nbsp;</font>-&nbsp;ball.H&nbsp;-&nbsp;<font color="#0000FF">6</font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;se&nbsp;a&nbsp;bolinha&nbsp;colidiu&nbsp;com&nbsp;o&nbsp;fundo&nbsp;do&nbsp;cenário</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;ball.y&nbsp;&gt;&nbsp;bt&nbsp;<b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//reflete&nbsp;a&nbsp;bolinha&nbsp;com&nbsp;o&nbsp;mesmo&nbsp;ângulo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.Vy:=&nbsp;-ball.Vy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;um&nbsp;pouco&nbsp;a&nbsp;bolinha&nbsp;para&nbsp;evitar&nbsp;outras&nbsp;colisões</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.y:=&nbsp;bt&nbsp;-&nbsp;(ball.y&nbsp;-&nbsp;bt);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//distância&nbsp;da&nbsp;bolinha&nbsp;até&nbsp;a&nbsp;barrinha&nbsp;do&nbsp;jogador</font></i><br />
&nbsp;&nbsp;bt:=&nbsp;bar_p1.X&nbsp;+&nbsp;bar_p1.w&nbsp;-&nbsp;(ball.W&nbsp;/&nbsp;<font color="#0000FF">2</font>);<br />
&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;se&nbsp;a&nbsp;bolinha&nbsp;colidiu&nbsp;com&nbsp;a&nbsp;barrinha&nbsp;do&nbsp;jogador</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;(ball.x&nbsp;&lt;&nbsp;bt)&nbsp;<b><font color="#000080">and</b></font>&nbsp;((ball.y&nbsp;&gt;=&nbsp;bar_p1.Y)&nbsp;<b><font color="#000080">and</b></font>&nbsp;(ball.y&nbsp;+&nbsp;ball.h&nbsp;&lt;&nbsp;bar_p1.Y&nbsp;+&nbsp;bar_p1.h))&nbsp;<b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//reflete&nbsp;a&nbsp;bolinha&nbsp;com&nbsp;o&nbsp;mesmo&nbsp;ângulo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.Vx:=&nbsp;-ball.Vx;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//aumenta&nbsp;a&nbsp;velocidade&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.Speed:=&nbsp;ball.Speed&nbsp;+&nbsp;<font color="#0000FF">0</font>.<font color="#0000FF">5</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;um&nbsp;pouco&nbsp;a&nbsp;bolinha&nbsp;para&nbsp;evitar&nbsp;colisões</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.X:=&nbsp;bt&nbsp;+&nbsp;(bt&nbsp;-&nbsp;ball.x);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//distância&nbsp;da&nbsp;bolinha&nbsp;até&nbsp;a&nbsp;barrinha&nbsp;da&nbsp;AI</font></i><br />
&nbsp;&nbsp;bt:=&nbsp;bar_cp.X&nbsp;-&nbsp;ball.w&nbsp;+&nbsp;(ball.w&nbsp;/&nbsp;<font color="#0000FF">2</font>);<br />
&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;se&nbsp;a&nbsp;bolinha&nbsp;colidiu&nbsp;com&nbsp;a&nbsp;barrinha&nbsp;da&nbsp;AI</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;(ball.x&nbsp;&gt;&nbsp;bt)&nbsp;<b><font color="#000080">and</b></font>&nbsp;((ball.y&nbsp;&gt;=&nbsp;bar_cp.y)&nbsp;<b><font color="#000080">and</b></font>&nbsp;(ball.y&nbsp;+&nbsp;ball.h&nbsp;&lt;&nbsp;bar_cp.Y&nbsp;+&nbsp;bar_cp.h))&nbsp;<b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//reflete&nbsp;a&nbsp;bolinha&nbsp;com&nbsp;o&nbsp;mesmo&nbsp;ângulo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.Vx:=&nbsp;-ball.Vx;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//aumenta&nbsp;a&nbsp;velocidade&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.Speed:=&nbsp;ball.Speed&nbsp;+&nbsp;<font color="#0000FF">0</font>.<font color="#0000FF">5</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;um&nbsp;pouco&nbsp;a&nbsp;bolinha&nbsp;para&nbsp;evitar&nbsp;colisões</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;ball.x:=&nbsp;bt&nbsp;-&nbsp;(ball.x&nbsp;-&nbsp;bt);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;se&nbsp;a&nbsp;bolinha&nbsp;saiu&nbsp;à&nbsp;esquerda</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;ball.x&nbsp;&lt;&nbsp;<font color="#0000FF">37&nbsp;</font>+&nbsp;<font color="#0000FF">6&nbsp;</font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//ponto&nbsp;da&nbsp;AI</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Inc(score_cp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//reinicia&nbsp;o&nbsp;jogo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;InitGame;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;se&nbsp;a&nbsp;bolinha&nbsp;saiu&nbsp;à&nbsp;direita</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;ball.X&nbsp;+&nbsp;ball.w&nbsp;&gt;&nbsp;<font color="#0000FF">37&nbsp;</font>+&nbsp;<font color="#0000FF">566&nbsp;</font>-&nbsp;<font color="#0000FF">6&nbsp;</font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//ponto&nbsp;do&nbsp;jogador</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Inc(score_p1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//reinicia&nbsp;o&nbsp;jogo</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;InitGame;<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>Função que move a bolinha</p>
<p><code><font color="#008000"><i>//função&nbsp;que&nbsp;move&nbsp;a&nbsp;bolinha&nbsp;de&nbsp;acordo&nbsp;com&nbsp;o&nbsp;ângulo&nbsp;e</font></i><br />
<font color="#008000"><i>//a&nbsp;velocidade</font></i><br />
<b><font color="#000080">procedure</b></font>&nbsp;ball_move;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;a&nbsp;bolinha&nbsp;no&nbsp;eixo&nbsp;x&nbsp;(horizontal)</font></i><br />
&nbsp;&nbsp;ball.x&nbsp;:=&nbsp;ball.x&nbsp;+&nbsp;ball.Vx*ball.speed;<br />
&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;a&nbsp;bolinha&nbsp;no&nbsp;eixo&nbsp;y&nbsp;(vertical)</font></i><br />
&nbsp;&nbsp;ball.y&nbsp;:=&nbsp;ball.y&nbsp;+&nbsp;ball.Vy*ball.speed;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>Função que controla a AI</p>
<p><code><font color="#008000"><i>//função&nbsp;que&nbsp;controla&nbsp;a&nbsp;AI&nbsp;do&nbsp;jogo</font></i><br />
<b><font color="#000080">procedure</b></font>&nbsp;bar_cp_handle;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//se&nbsp;for&nbsp;possível&nbsp;chegar&nbsp;à&nbsp;bolinha&nbsp;nesse&nbsp;frame</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;abs(ball.y&nbsp;-&nbsp;bar_cp.y)&nbsp;&lt;=&nbsp;bar_cp.Speed&nbsp;<b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;a&nbsp;barrinha&nbsp;para&nbsp;a&nbsp;posição&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;bar_cp.y:=&nbsp;ball.y<br />
&nbsp;&nbsp;<b><font color="#000080">else</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//do&nbsp;contrário&nbsp;move&nbsp;a&nbsp;barrinha&nbsp;na&nbsp;direção&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//mas&nbsp;apenas&nbsp;o&nbsp;que&nbsp;a&nbsp;velocidade&nbsp;permite&nbsp;nesse&nbsp;frame</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;bar_cp.y:=&nbsp;bar_cp.y&nbsp;+&nbsp;(bar_cp.speed&nbsp;*&nbsp;(ball.y&nbsp;-&nbsp;bar_cp.y))&nbsp;/&nbsp;abs(ball.y&nbsp;-&nbsp;bar_cp.y);<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;se&nbsp;a&nbsp;barrinha&nbsp;da&nbsp;AI&nbsp;passou&nbsp;dos&nbsp;limites&nbsp;do&nbsp;cenário</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//e&nbsp;coloca&nbsp;ela&nbsp;de&nbsp;volta&nbsp;nos&nbsp;limites&nbsp;do&nbsp;cenário</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;bar_cp.Y&nbsp;+&nbsp;bar_cp.h&nbsp;&gt;&nbsp;<font color="#0000FF">77&nbsp;</font>+&nbsp;<font color="#0000FF">366&nbsp;</font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;bar_cp.y:=&nbsp;<font color="#0000FF">77&nbsp;</font>+&nbsp;<font color="#0000FF">366&nbsp;</font>-&nbsp;bar_cp.H;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;bar_cp.Y&nbsp;&lt;&nbsp;<font color="#0000FF">77&nbsp;</font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;bar_cp.y:=&nbsp;<font color="#0000FF">77</font>;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>Função que desenha os pontos dos jogadores usando as imagens dos números do jogo</p>
<p><code><font color="#008000"><i>//função&nbsp;que&nbsp;desenha&nbsp;os&nbsp;pontos&nbsp;dos&nbsp;jogadores&nbsp;usando</font></i><br />
<font color="#008000"><i>//as&nbsp;imagens&nbsp;dos&nbsp;números&nbsp;do&nbsp;jogo</font></i><br />
<b><font color="#000080">procedure</b></font>&nbsp;CreateScore(x,&nbsp;y,&nbsp;score:&nbsp;Integer);<br />
<b><font color="#000080">var</b></font>&nbsp;i,&nbsp;d:&nbsp;Integer;&nbsp;<font color="#008000"><i>//variáveis&nbsp;de&nbsp;controle&nbsp;do&nbsp;laço</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;s:&nbsp;<b><font color="#000080">string</b></font>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//string&nbsp;com&nbsp;a&nbsp;pontuação&nbsp;a&nbsp;desenhar</font></i><br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//transforma&nbsp;a&nbsp;pontuação&nbsp;em&nbsp;string&nbsp;(para&nbsp;percorrer&nbsp;os&nbsp;caracteres)</font></i><br />
&nbsp;&nbsp;s:=&nbsp;IntToStr(score);<br />
&nbsp;&nbsp;<font color="#008000"><i>//o&nbsp;máximo&nbsp;de&nbsp;pontos&nbsp;é&nbsp;9999&nbsp;(4&nbsp;caracteres),&nbsp;se&nbsp;a&nbsp;string&nbsp;com&nbsp;os</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//pontos&nbsp;tiver&nbsp;menos&nbsp;de&nbsp;4&nbsp;caracteres&nbsp;preenche&nbsp;o&nbsp;resto&nbsp;com&nbsp;0</font></i><br />
&nbsp;&nbsp;d:=&nbsp;<font color="#0000FF">4&nbsp;</font>-&nbsp;Length(s);<br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font>&nbsp;i&nbsp;:=&nbsp;<font color="#0000FF">0&nbsp;</font><b><font color="#000080">to</b></font>&nbsp;d&nbsp;-&nbsp;<font color="#0000FF">1&nbsp;</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>//desenha&nbsp;a&nbsp;imagem&nbsp;do&nbsp;0&nbsp;no&nbsp;backbuffer</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;bbuffer.Canvas.Draw(x,&nbsp;y,&nbsp;bitmaps[<font color="#0000FF">0</font>]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//aumenta&nbsp;a&nbsp;posição&nbsp;x&nbsp;para&nbsp;o&nbsp;próximo&nbsp;caractere</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Inc(x,&nbsp;<font color="#0000FF">24</font>);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//desenha&nbsp;os&nbsp;caracteres&nbsp;na&nbsp;string&nbsp;dos&nbsp;pontos</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">for</b></font>&nbsp;I&nbsp;:=&nbsp;<font color="#0000FF">1&nbsp;</font><b><font color="#000080">to</b></font>&nbsp;Length(s)&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>//desenha&nbsp;o&nbsp;caractere&nbsp;no&nbsp;backbuffer</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;bbuffer.Canvas.Draw(x,&nbsp;y,&nbsp;bitmaps[StrToInt(s[i])]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"><i>//aumenta&nbsp;a&nbsp;posição&nbsp;x&nbsp;para&nbsp;o&nbsp;próximo&nbsp;caractere</font></i><br />
&nbsp;&nbsp;&nbsp;&nbsp;Inc(x,&nbsp;<font color="#0000FF">24</font>);<br />
&nbsp;&nbsp;<b><font color="#000080">end</b></font>;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>Função que inicia as variáveis do jogo</p>
<p><code><font color="#008000"><i>//Função&nbsp;que&nbsp;inicia&nbsp;o&nbsp;jogo&nbsp;e&nbsp;reseta&nbsp;as&nbsp;variáveis</font></i><br />
<b><font color="#000080">procedure</b></font>&nbsp;InitGame;<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//pausa&nbsp;o&nbsp;jogo</font></i><br />
&nbsp;&nbsp;paused:=&nbsp;true;<br />
&nbsp;&nbsp;<font color="#008000"><i>//reseta&nbsp;a&nbsp;posição&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;Ball.X:=&nbsp;<font color="#0000FF">37&nbsp;</font>+&nbsp;((<font color="#0000FF">566&nbsp;</font>-&nbsp;Ball.W)&nbsp;/&nbsp;<font color="#0000FF">2</font>);<br />
&nbsp;&nbsp;Ball.Y:=&nbsp;<font color="#0000FF">77&nbsp;</font>+&nbsp;((<font color="#0000FF">366&nbsp;</font>-&nbsp;Ball.H)&nbsp;/&nbsp;<font color="#0000FF">2</font>);<br />
&nbsp;&nbsp;<font color="#008000"><i>//reseta&nbsp;a&nbsp;velocidade&nbsp;e&nbsp;direção&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;Ball.Speed:=&nbsp;<font color="#0000FF">8</font>;<br />
&nbsp;&nbsp;Ball.Vx:=&nbsp;<font color="#0000FF">0</font>.<font color="#0000FF">5</font>;<br />
&nbsp;&nbsp;Ball.Vy:=&nbsp;<font color="#0000FF">0</font>.<font color="#0000FF">5</font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//reseta&nbsp;a&nbsp;posição&nbsp;da&nbsp;barrinha&nbsp;do&nbsp;jogador</font></i><br />
&nbsp;&nbsp;Bar_p1.X:=&nbsp;<font color="#0000FF">57</font>;<br />
&nbsp;&nbsp;Bar_p1.Y:=&nbsp;<font color="#0000FF">77&nbsp;</font>+&nbsp;((<font color="#0000FF">366&nbsp;</font>-&nbsp;bar_p1.H)&nbsp;/&nbsp;<font color="#0000FF">2</font>);<br />
&nbsp;&nbsp;<font color="#008000"><i>//reseta&nbsp;a&nbsp;posição&nbsp;da&nbsp;barrinha&nbsp;da&nbsp;AI</font></i><br />
&nbsp;&nbsp;Bar_cp.X:=&nbsp;<font color="#0000FF">577</font>;<br />
&nbsp;&nbsp;Bar_cp.Y:=&nbsp;bar_p1.Y;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Bem, precisamos mudar um pouco nossa rotina de criação do jogo (evento Form.OnCreate), pois atualmente tudo o que ela faz é carregar os bitmaps para a memória. Temos que criar o backbuffer e iniciar o jogo também. Então segue abaixo o código completo do OnCreate do form.</p>
<p><code><b><font color="#000080">procedure</b></font>&nbsp;TForm1.FormCreate(Sender:&nbsp;TObject);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//quando&nbsp;o&nbsp;form&nbsp;for&nbsp;criado&nbsp;carregamos&nbsp;as&nbsp;imagens</font></i><br />
&nbsp;&nbsp;LoadGameGraphics;<br />
&nbsp;&nbsp;<font color="#008000"><i>//cria&nbsp;e&nbsp;inicializa&nbsp;o&nbsp;backbuffer</font></i><br />
&nbsp;&nbsp;bbuffer:=&nbsp;TBitmap.Create;<br />
&nbsp;&nbsp;bbuffer.Width:=&nbsp;<font color="#0000FF">640</font>;<br />
&nbsp;&nbsp;bbuffer.Height:=&nbsp;<font color="#0000FF">480</font>;<br />
&nbsp;&nbsp;bbuffer.Canvas.Brush.Color:=&nbsp;clBlack;<br />
&nbsp;&nbsp;<font color="#008000"><i>//inicializa&nbsp;algumas&nbsp;variáveis&nbsp;da&nbsp;bolinha</font></i><br />
&nbsp;&nbsp;Ball.W:=&nbsp;<font color="#0000FF">15</font>;<br />
&nbsp;&nbsp;Ball.H:=&nbsp;<font color="#0000FF">15</font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//inicializa&nbsp;algumas&nbsp;variáveis&nbsp;da&nbsp;barrinha&nbsp;do&nbsp;jogador</font></i><br />
&nbsp;&nbsp;Bar_p1.W:=&nbsp;<font color="#0000FF">10</font>;<br />
&nbsp;&nbsp;Bar_p1.H:=&nbsp;<font color="#0000FF">80</font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//inicializa&nbsp;algumas&nbsp;variáveis&nbsp;da&nbsp;barrinha&nbsp;da&nbsp;AI</font></i><br />
&nbsp;&nbsp;Bar_cp.W:=&nbsp;<font color="#0000FF">10</font>;<br />
&nbsp;&nbsp;Bar_cp.H:=&nbsp;<font color="#0000FF">80</font>;<br />
&nbsp;&nbsp;Bar_cp.Speed:=&nbsp;<font color="#0000FF">15</font>;<br />
&nbsp;&nbsp;<font color="#008000"><i>//inicia&nbsp;o&nbsp;jogo</font></i><br />
&nbsp;&nbsp;InitGame;<br />
&nbsp;&nbsp;<font color="#008000"><i>//habilita&nbsp;o&nbsp;timer&nbsp;do&nbsp;jogo</font></i><br />
&nbsp;&nbsp;Timer1.Enabled:=&nbsp;true;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Você pode rodar o jogo agora e ver como está ficando. Se fizer isso você deverá ver as imagens desenhadas e um texto escrito &#8220;click to start&#8221;. Acontece que se você clicar não vai acontecer nada. Simplesmente porque nós não colocamos a rotina para pausar e continuar o jogo. Vamos então implementá-la agora. Para isso vamos usar o evento <strong>OnClick</strong> do formulário.</p>
<p><code><font color="#008000"><i>//quando&nbsp;o&nbsp;jogador&nbsp;clicar&nbsp;no&nbsp;formulário</font></i><br />
<font color="#008000"><i>//pausa&nbsp;ou&nbsp;continua&nbsp;o&nbsp;jogo</font></i><br />
<b><font color="#000080">procedure</b></font>&nbsp;TForm1.FormClick(Sender:&nbsp;TObject);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;paused:=&nbsp;<b><font color="#000080">not</b></font>&nbsp;paused;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Simples não? Ao invés de usar uma estrutura <b>if&#8230;else</b> nós colocamos tudo isso em uma linha usando o operador <b>not</b> para retornar o oposto do valor da variável <b>paused</b>. Agora o jogo inicia direitinho, mas&#8230; não é possível jogar porque não implementamos a função com os comandos do jogador. Bem, já que usamos o mouse para controlar o jogo até agora, vamos usálo de novo. Coloque esse código no evento OnMouseMove do formulário.</p>
<p><code><b><font color="#000080">procedure</b></font>&nbsp;TForm1.FormMouseMove(Sender:&nbsp;TObject;&nbsp;Shift:&nbsp;TShiftState;&nbsp;X,<br />
&nbsp;&nbsp;Y:&nbsp;Integer);<br />
<b><font color="#000080">begin</b></font><br />
&nbsp;&nbsp;<font color="#008000"><i>//move&nbsp;a&nbsp;barrinha&nbsp;do&nbsp;jogador&nbsp;para&nbsp;a&nbsp;posição&nbsp;do&nbsp;mouse</font></i><br />
&nbsp;&nbsp;bar_p1.Y:=&nbsp;y;<br />
&nbsp;<br />
&nbsp;&nbsp;<font color="#008000"><i>//verifica&nbsp;se&nbsp;a&nbsp;barrinha&nbsp;do&nbsp;jogador&nbsp;passou&nbsp;dos&nbsp;limites&nbsp;do&nbsp;cenário</font></i><br />
&nbsp;&nbsp;<font color="#008000"><i>//e&nbsp;coloca&nbsp;ela&nbsp;de&nbsp;volta&nbsp;nos&nbsp;limites&nbsp;do&nbsp;cenário</font></i><br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;bar_p1.Y&nbsp;+&nbsp;bar_p1.h&nbsp;&gt;&nbsp;<font color="#0000FF">77&nbsp;</font>+&nbsp;<font color="#0000FF">366&nbsp;</font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;bar_p1.y:=&nbsp;<font color="#0000FF">77&nbsp;</font>+&nbsp;<font color="#0000FF">366&nbsp;</font>-&nbsp;bar_p1.H;<br />
&nbsp;&nbsp;<b><font color="#000080">if</b></font>&nbsp;bar_p1.Y&nbsp;&lt;&nbsp;<font color="#0000FF">77&nbsp;</font><b><font color="#000080">then</b></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;bar_p1.y:=&nbsp;<font color="#0000FF">77</font>;<br />
<b><font color="#000080">end</b></font>;</code></p>
<p>&nbsp;&nbsp;&nbsp; Agora o jogo está prontinho. Experimente jogar e ver se consegue vencer a AI do jogo. Se achar que o jogo está muito difícil você pode diminuir um pouco o valor da variável <b>bar_cp.speed</b>. Ou aumentá-la ainda mais para tornar a AI imbatível.</p>
<p><a href="http://mottaweb.com.br/files/delphi/delphi_parte_2.zip">&raquo; baixe aqui o código fonte completo</a></p>
<p>&nbsp;&nbsp;&nbsp; Bastante códigos hoje ne? No próximo tutorial eu vou explicar um pouco sobre o uso de sons para melhorar os ambientes nos jogos, sem usar bibliotecas externas. Então até lá.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/undercode.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/undercode.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/undercode.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/undercode.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/undercode.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/undercode.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/undercode.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/undercode.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/undercode.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/undercode.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/undercode.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/undercode.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=undercode.wordpress.com&blog=3870490&post=17&subd=undercode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://undercode.wordpress.com/2008/06/25/criando-jogos-em-delphi-parte-ii/feed/</wfw:commentRss>
		<slash:comments>2</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://i262.photobucket.com/albums/ii120/killdream/img_1.jpg" medium="image" />
	</item>
	</channel>
</rss>