Você
é bom de mira? Então que tal testar o seu desempenho
num painel igual a este aí em baixo?. Ao "Iniciar" uma
partida, uma barra irá subir, bem devagar, no canto esquerdo
do painel. Quando ela estiver no mesmo nível que o alvo
(à direita) clique no botão "Alvo". É só
isso. Se acertar bem no meio do dito cujo, um ponto. Se passar
perto, ou apenas "raspar"... Dançou.
Mas
aí você vai dizer: "pô, esse jogo é
muito simples... qualquer um faz...". Será que faz mesmo?
Bem, o propósito aqui é mostrar passo-a-passo como
fazer um joguinho bem simplezinho. Tente acertar o alvo algumas
vezes e em pouco tempo você irá perceber que, até
que para um jogo simples, ele está conseguindo prender
a sua atenção.
E
se você é daqueles que não acerta muito, então
depois de um tempo já estará começando a
se sentir "desafiado" pela máquina e querendo provar o
quanto é melhor que ela. Lembre-se: nosso jogo não
tem nenhum mistério. Tudo está na cabeça
do jogador.
Vamos
ao jogo propriamente dito. Para montá-lo, via Delphi, não
há necessidade de nenhum elemento gráfico.
O
primeiro passo é criar um TPaintBox (System) mais
ou menos do tamanho do formulário. Uns 300 x 200 pixels
já é de bom tamanho. Chamei esse objeto de 'Area',
pois será a área onde a barra irá se deslocar.
TPaintBox:
Height:= 200
Left:= 100
Name:= Area
Top:= 10
Width:= 300
A
seguir, crie um TTimer (System). Coloque a propriedade
Enabled em False. É esse Timer quem
irá comandar a parte central do jogo. Crie dois TSpeedButton
(Additional), um chamado btAlvo e o outro btInic.
Crie também dois TLabels (Standard), um chamado
Placar e outro Mensag. E finalmente crie um TLabel
chamado Alvo e coloque como:
TTimer:
Enabled:= False
Interval:= 10
TSpeedButton:
Caption:= Alvo
Height:= 16
Left:= 5
Name:= btAlvo
Top:= 190
Width:= 40
TSpeedButton:
Caption:= Inic
Height:= 16
Left:= 50
Name:= btInic
Top:= 190
Width:= 40
TLabel:
Left:= 100
Name:= Mensag
Top:= 220
TLabel:
Left:= 100
Name:= Placar
Top:= 245
TLabel:
Caption:= ]
Left:= 390
Name:= Alvo
Top:= 95
O
próximo passo é criar as variáveis globais
que serão usadas pelo sistema:
|
var
Form1: TForm1;
JPx,JPy: integer; {Coordenadas
da barra preta}
Status: byte;
{Status de funcionamento}
Contador: integer;
{Conta as partidas}
Acertou: integer;
{Quantas vezes acertou}
|
Vamos
criar uma procedure para inicializar a partida e começar
a impressão da barra.
|
procedure PreparaJogo;
begin
with Form1 do begin
JPx:= 0; {Coluna
0}
JPy:= Area.Height-2; {Última
linha da Area de jogo}
Status:= 0; {0
= O jogo pode começar}
Timer1.Enabled:=
True; {Ativa
o Timer}
Area.Canvas.Pen.Color:=
clSilver; {Cor
da tinta}
Area.Canvas.Brush.Color:=
clSilver; {Cor do
papel}
{Apaga
toda a área do jogo}
Area.Canvas.Rectangle(0,0,Area.Width,Area.Height);
Area.Canvas.Pen.Color:= clBlack;
Area.Canvas.Brush.Color:= clBlack;
{Imprime o
primeiro ponto da barra (4 x 4 pixels)}
Area.Canvas.Rectangle(JPx,JPy,JPx+4,JPy+2);
{Sorteia uma
posição aleatória para o Alvo}
Alvo.Top:=
20 + Random(Area.Height - 40);
Mensag.Caption:= 'Subindo...'; {Começando...}
inc(Contador);
{Mais uma jogada}
end;
end;
|
Agora
é só colocar o evento OnClick no botão btInic
O
botão btAlvo também tem um evento OnClick. Ele serve
para avisar ao sistema que o jogador "disparou" a barra:
|
begin
Status:= 1; {Ok,
disparou}
end;
|
Só
falta criar o controle principal do jogo, que estará no
evento OnTimer do Timer1:
|
begin
if Status = 2 then begin {Se
acabou o disparo...}
if (JPy < Alvo.Top-Area.Top+4)
{Se
a barra estiver acima do alvo}
or (JPy > Alvo.Top-Area.Top+8) then
{ou
se ela estiver abaixo, então...}
Mensag.Caption:= 'Errrroooouuuuu!!!!!!'
else
begin;
{caso
contrário}
Mensag.Caption:= 'Na mosca!';
inc(Acertou); {Mais
um acerto}
end;
Placar.Caption:= 'De '+IntToStr(Contador)+
', acertou
'+IntToStr(Acertou);
{Monta
o placar}
Timer1.Enabled:= False; end; {Desliga
o Timer}
if
Status = 0 then JPy:= JPy - 2;
{Se está
subindo, suba mais 2 pixels}
if
Status = 1 then JPx:= JPx + 6;
{Se indo em
direção ao alvo ande mais 6 pixels}
if
Status <> 2 then begin
{Se não
estiver parado, faça um ponto da barra}
Area.Canvas.Brush.Color:= clBlack;
Area.Canvas.Rectangle(JPx,JPy,JPx+6,JPy+6);
end;
if JPx > Area.Width - 8 then
Status:= 2;
{Se chegou
no canto da área, acabou a partida}
end;
|
Viu
só como é simples? Agora basta testar para ver se
não há nenhum erro de digitação. Partindo
deste ponto, voce poderá criar implementos, como sons,
cores e, quem sabe até, sofisticar mais o jogo com elementos
gráficos e mensagens diferentes. A imaginação
é seu único limite. |