A melhor forma de aprender sobre
como fazer jogos em Delphi é fazendo-os. Mas fazer um jogo
não quer dizer necessariamente começar definindo como meta
um jogo no padrão comercial de alto nível, como é
o mercado de jogos hoje em dia. Antes temos que aprender as coisas básicas
da programação e os truques da linguagem. Aos poucos vamos
evoluindo em nosso aprendizado. Ninguém começa no topo.
Proponho então fazer
aqui um jogo dos mais simples. Não usa mais do que meia dúzia
de TLabels e dois TTimers.
Algo que fará você pensar "nossa, como é fácil"
e ao mesmo tempo será um exemplo de como um jogo tão simples
pode ser instigante.
O
conceito é o seguinte: uma barra escura, deslocada alguns pontos
da lateral esquerda do formulário, vai descer da parte superior
para a parte inferior. Ao mesmo tempo aparecerá uma pequena barra
vermelha na lateral direita do formulário.
Quando o jogador achar que ambas
estão no mesmo nível, clica em qualquer ponto do formulário
e a barra descendente interrompe sua trajetória e se dirije, em
linha reta, para a barra vermelha. Se acertar, o jogador ganha um ponto.
Se errar, apenas contabiliza mais uma tentativa.Parece bem simples, não
é?

Em primeiro lugar, crie um novo
projeto (formulário) com as seguintes medidas internas:
ClientHeight = 230
ClientWidth = 450
Crie um TLabel
com as seguintes propriedades: ele fará o papel da barra que desce:
AutoSize = false
Caption = ''
Color = clBlack
Height = 10
Left = 110
Name = Label1
Top = 0
Width = 5
Crie outro TLabel
com as mesmas características deste primeiro, porém alterando
as seguintes propriedades:
Height = 5
Name = Label2
Visible = false
Width = 10
Ele será a barra horizontal,
que deverá acertar o alvo.

Precisamos fazer a barra descer, alterando o tamanho (height) do
Label1 e isso de forma contínua. Crie um TTimer
(alça System). Altere a propriedade Inverval para
100 e crie (duplo clique no reloginho) o evento OnTimer:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Height:= Label1.Height + 5;
end;
Isso fará com que a barra
cresça para baixo, dando a ilusão do movimento. Se ela chegar
ao limite mais baixo, contabilizamos uma tentativa e reiniciamos uma nova
descida. Para isso precisaremos de uma variável global que chamaremos
de Vezes:
Const
Vezes: integer = 0;
Assim, usamos no evento OnTimer
uma estrutura If.. then..
Como já vimos, esta estutura faz exatamente o que diz: se "alguma"
comparada com "outra coisa" for verdade, então faça
o que se segue. Se não for, ignore. No caso, criamos um bloco de
programação para quando a barra atingir o chão e
de quebra avisamos ao jogador que o total de tentativas aumentou (crie
um TLabel em algum lugar, desde que
não fique no caminho das barras):
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Height:= Label1.Height + 5;
if Label1.Height >= Form1.ClientHeight then begin
Label1.Height:= 10;
Vezes:= Vezes + 1;
Label3.Caption:= 'Total: '+IntToStr(Vezes);
end;
end;
Se o jogador clicar em algum
lugar do formulário, a barra vertical para de descer e passa a se
movimentar na horizontal. Na programação orientada a objeto
nós não verificamos se o jogador clicou, mas criamos um evento
"para quando ele clicar".
Criamos outro TTimer,
com a propriedade Interval em 50 e a propriedade Enabled
em false. Usaremos essa propriedade para "ligar" e "desligar"
os dois timers. Selecione o Form1, mude a alça do Object
Inspector para Events e dê um duplo clique em
OnMouseDown:
procedure TForm1.FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift:
TShiftState; X,Y: Integer);
begin
Timer1.Enabled:= false;
Label2.Top:= Label1.Height;
Label2.Visible:= true;
Timer2.Enabled:= true;
end;
Agora computamos a largura da
barra horizontal, até que ela toque a lateral direita do Form1
(criamos um evento OnTimer para o
Timer2):
O passo seguinte é criar
o alvo - mais um TLabel (Label4):
AutoSize = false
Caption = ''
Color = clRed
Height = 20
Left = 440
Name = Label4
Top = 80
Width = 5
Criamos uma constante global
para contar os acertos e verificamos, no evento OnTimer
do Timer2 se o jogador acertou ou não (criando mais um TLabel
para informar a quantidade de acertos - Label5):
const
Vezes: integer = 0;
Acertos: integer = 0;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Label2.Width:= Label2.Width + 10;
if Label2.Width+110 >= Form1.ClientWidth then begin
Timer2.Enabled:= false;
Label2.Visible:= false;
Label2.Width:= 10;
Label1.Height:= 10;
Vezes:= Vezes + 1;
if (Label2.Top >= Label4.Top) and
(Label2.Top + 5 <= Label4.Top + 20) then begin
//Acertou no alvo
Acertos:= Acertos + 1;
Label5.Caption:= 'Acertos: '+IntToStr(Acertos);
end;
Label3.Caption:= 'Total: '+IntToStr(Vezes);
Timer1.Enabled:= true;
//Recoloca o alvo em uma posição aleatória
Label4.Top:= Random(210);
end;
end;
Viu só como é
simples fazer um jogo? Até parece que é fácil acertar
o alvo, mas veja quantas tentativas serão necessárias até
que você "pegue" o jeito.
Em seguida, estude que modificações
você faria para melhorar o desempenho do jogo, melhorar o visual,
etc. No diretório delphi você contra a listagem completa
deste jogo (project1).