Acerte o Label, digo, o alvo:

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).



online