projetos e jogos abertos
 
 
A tela principal
As funções do painel principal e os aviões awacs
 

Bem, aqui estamos nós. Chegar até este ponto foi muito fácil e acreditem, não vai piorar tanto assim. Basta seguir as informações da bula.

Mas antes de começar, preciso fazer um correção: a tela base do jogo está errada. Na hora de montar o pacote zip peguei uma versão anterior e uns pequenos detalhes não ficaram como deveriam (principalmente com relação às medidas finais da imagem). No pacote desta página incluí a tela correta. Faça a substituição e sigamos em frente.

Nesta parte vamos montar o sistema de controle dos aviões Awacs. O radar funciona ao ativar uma das bases, mas só mostra efetivamente o que está acontecendo se houver um avião Awac em vôo. A tela é dividida horizontalmente em quatro setores e cada um é coberto por um avião, ou seja, se por alguma razão não tem um avião sobrevoando um setor, o radar não captará os mísseis que estiverem naquela região.

Cada volta do avião corresponde a um saco de dinheiro e podem ser "contratadas" até 10 voltas. O ideal é ir ativando aos poucos os aviões, na medida em que os recursos vão sendo liberados. Mas nunca deixe de manter um avião em vôo.

Nota: nesta primeira versão do jogo, os mísseis não poderão abater os Awacs. Quem sabe numa próxima versão...

Nesta parte também montaremos o relógio do jogo, que comandará a liberação de recursos financeiros e controlará basicamente os horários mais importantes dos ataques dos Scuds (alguém aí se lembra em qual horário aconteciam os piores bombardeios?). Clique aqui e baixe o pacote zip com os fontes até esta etapa do jogo..

 

{--------- Início do programa / comentário -----------------}

SEGUNDA PARTE

Decididamente não podemos fazer nada sem grana,
portanto...

O primeiro passo é criar duas TImages, como fizemos com
os mísseis do arsenal. A primeira delas será usada como
matriz do saco de dinheiro e deve ser colocada num canto
da tela que não atrapalhe:

        AutoSize = True
        Height = 23
        Left = 540
        Name = Saco
        Picture = (carregue o arquivo SACO.BMP)
        Top = 235
        Visible:= False
        Width = 17

A segunda será usada para mostrar quantos sacos de
dinheiro o jogador possui, até um máximo de 21.
Na verdade o jogador pode dispor de até 255 sacos,
mas apenas 21 serão mostrados.

        AutoSize = False
        Height = 23
        Left = 30
        Name = Dinheiro
        Top = 367
        Visible:= True
        Width = 420

Precisaremos de uma procedure para mostrar os sacos de
dinheiro do jogador. Aqui está ela:

procedure MostraDin;
var
  Fonte,Destino: HBitmap;
  Loc: byte;
begin
  //Apague o que já houver de dinheiro
  Form1.Dinheiro.Canvas.Brush.Color:= $00B5C2C9;
  Form1.Dinheiro.Canvas.Pen.Color:= $00B5C2C9;
  Fonte:= Form1.Saco.Canvas.Handle;
  Destino:= Form1.Dinheiro.Canvas.Handle;
  Rectangle(Destino,0,0,420,23);
  //Define o limite máximo, para mostrar, 21 sacos
  Loc:= TotDin; if TotDin > 21 then Loc:= 21;
  while Loc > 0 do begin
    //Cada um dos sacos de dinheiro, até 21
    BitBlt(Destino,(Loc-1)*20,0,17,23,Fonte,0,0,SRCCOPY);
    dec(Loc); end;
  Form1.Dinheiro.Repaint;
end;

Aproveitamos o embalo e criamos uma procedure para aumentar
nossos recur$$$o$ financeiro$$$:

procedure MaisDinheiro;
begin
  //No máximo 255 sacolas de dinheiro - dá e sobra
  if TotDin <> 255 then begin
    inc(TotDin); MostraDin;
  end;
end;

Claro, está faltando a variável TotDin, que deve ser
definida na área de constantes globais. O jogador começa
com 7 sacos (ou quantos você desejar).

const
  TotDin: byte = 7;

Se você colocar uma chamada à procedure MostraDin,
no evento FormActivate do Form1, então veremos as sacolas
tão logo o jogo seja executado. Quer tentar? Compile o que
já foi feito até aqui que eu espero.

begin
  MostraDin;
end;

Uél, agora vamos ligar os aviões Awacs na tela do Radar.
Aqui seria interessante prestar bastante atenção, pois o
que virá depois (os mísseis) é basicamente a mesma coisa,
só que com uns componentes prá lá de inusitados.

Começamos criando quatro SpeedButtons com as seguintes
características (eles dão a ordem de vôo aos aviões):

        Caption = 1
        Height = 13
        Left = 495
        Name = Awac1
        Top = 109
        Width = 16

        Caption = 2
        Height = 13
        Left = 495
        Name = Awac2
        Top = 124
        Width = 16

        Caption = 3
        Height = 13
        Left = 495
        Name = Awac3
        Top = 139
        Width = 16

        Caption = 4
        Height = 13
        Left = 495
        Name = Awac4
        Top = 154
        Width = 16

Lembre-se de colocar o som de 'clic' no evento
OnMouseDown de cada tecla, conforme foi feito na
primeira parte deste jogo. Sinta-se à vontade, aqui
também, para alterar o tamanho das letras da
propriedade FONT. Uma boa opção é a fonte Arial,
tamanho (corpo) 8 e estilo bold.

Agora criamos as barras de visualização das missões.
São quatro TGauge:

        BackColor = clBlack
        BorderStyle = bsSingle
        Color = clBlack
        ForeColor = $000080FF
        Height = 9
        Kind = gkHorizontalBar
        Left = 515
        MaxValue = 10
        MinValue = 0
        Name = Aviao1
        Progress = 0
        ShowText = False
        Top = 111
        Width = 106

Crie a primeira, copie para o Clipboard e "paste-a" mais
três vezes. Depois basta mudar os seguintes atributos:

        Name = Aviao2
        Top = 126

        Name = Aviao3
        Top = 141

        Name = Aviao4
        Top = 156


O próximo passo é "ligar" um avião na tela do Radar,
o que é feito pelo evento OnClick, dos botões dos
Awacs. Vamos definir a ordem de decolagem ou a ordem
de mais um sobrevôo.

begin
  if (Aviao1.Progress < 10) and (TotDin > 0 ) and
    (Base <> 0) then begin
    //Apenas 10 ordens de sobrevôo por avião e cada
    //ordem custa um saco de dinheiro
    dec(TotDin); MostraDin;
    Aviao1.Progress:= Aviao1.Progress+1;
    if AvRad1 = 1000 then begin
      //Se o avião ainda não estiver em vôo...
      TelRad:= Radar.Canvas.Handle;
      SkRad1:= GetPixel(TelRad,453,40);
      //Pega o pixel que está nas coordenadas do
      //avião e salva temporariamente na variável
      //SkRad?
      SetPixel(TelRad,453,40,clYellow);
      //453 é o canto direito do radar e 40 a linha
      //Agora plota o avião, um pixel amarelo
      AvRad1:= 453;
      //Esta é a variável que indica a coluna da
      //coordenada do Awac
    end;
  end;
end;

O mesmo evento se repete para os outros botões com algumas
modificações nos parâmetros. Aqui estão eles para você não
ter que digitar nada (que moleza, heim?).

begin
  if (Aviao2.Progress < 10) and (TotDin > 0 ) and
    (Base <> 0) then begin
    dec(TotDin); MostraDin;
    Aviao2.Progress:= Aviao2.Progress+1;
    if AvRad2 = 1000 then begin
      TelRad:= Radar.Canvas.Handle;
      SkRad2:= GetPixel(TelRad,453,120);
      SetPixel(TelRad,453,120,clYellow);
      AvRad2:= 453;
    end;
  end;
end;

begin
  if (Aviao3.Progress < 10) and (TotDin > 0 ) and
    (Base <> 0) then begin
    dec(TotDin); MostraDin;
    Aviao3.Progress:= Aviao3.Progress+1;
    if AvRad3 = 1000 then begin
      TelRad:= Radar.Canvas.Handle;
      SkRad3:= GetPixel(TelRad,453,202);
      SetPixel(TelRad,453,202,clYellow);
      AvRad3:= 453;
    end;
  end;
end;

begin
  if (Aviao4.Progress < 10) and (TotDin > 0 ) and
     Base <> 0) then begin
    dec(TotDin); MostraDin;
    Aviao4.Progress:= Aviao4.Progress+1;
    if AvRad4 = 1000 then begin
      TelRad:= Radar.Canvas.Handle;
      SkRad4:= GetPixel(TelRad,453,282);
      SetPixel(TelRad,453,282,clYellow);
      AvRad4:= 453;
    end;
  end;
end;

Agora vamos para a animação dos aviões Awacs. Para
isso temos que criar um TTimer:

        Enabled = True
        Interval = 85
        Name = Awacs

No evento OnTimer, o código de animação é extremamente
simples. Basta acompanhar os comentários:

var
  TelRad: HBitmap;
begin
  TelRad:= Radar.Canvas.Handle;
  if Base <> 0 then begin
    {Se as bases estiverem operante...}
    if AvRad1 <> 1000 then begin
      {Se o avião 1 estiver voando...}
      SetPixel(TelRad,AvRad1,40,SkRad1);
      {Recupera o que estava antes na coordenada}
      dec(AvRad1);
      {Move o avião para a esquerda um pixel}
      if AvRad1 = 0 then begin
        {Se já deu uma volta completa...}
        Aviao1.Progress:= Aviao1.Progress-1;
        {Diminui a barra}
        if Aviao1.Progress = 0 then AvRad1:= 1000 else
          AvRad1:= 453;
        {Se cumpriu a missão, pousa o avião, ou então
        recoloca-o no canto direito}
      end;
      SkRad1:= GetPixel(TelRad,AvRad1,40);
      {Salva o conteúdo original da posição}
      SetPixel(TelRad,AvRad1,40,clYellou);
      {Plota o avião}
    end;

    if AvRad2 <> 1000 then begin
      SetPixel(TelRad,AvRad2,120,SkRad2);
      dec(AvRad2); if AvRad2 = 0 then begin
        Aviao2.Progress:= Aviao2.Progress-1;
        if Aviao2.Progress = 0 then AvRad2:= 1000 else
        AvRad2:= 453;
      end;
      SkRad2:= GetPixel(TelRad,AvRad2,120);
      SetPixel(TelRad,AvRad2,120,clYellow);
    end;

    if AvRad3 <> 1000 then begin
      SetPixel(TelRad,AvRad3,202,SkRad3);
        dec(AvRad3); if AvRad3 = 0 then begin
        Aviao3.Progress:= Aviao3.Progress-1;
        if Aviao3.Progress = 0 then AvRad3:= 1000 else
           AvRad3:= 453;
      end;
      SkRad3:= GetPixel(TelRad,AvRad3,202);
      SetPixel(TelRad,AvRad3,202,clYellow);
    end;

    if AvRad4 <> 1000 then begin
      SetPixel(TelRad,AvRad4,282,SkRad4);
      dec(AvRad4); if AvRad4 = 0 then begin
        Aviao4.Progress:= Aviao4.Progress-1;
        if Aviao4.Progress = 0 then AvRad4:= 1000 else
           AvRad4:= 453;
      end;
      SkRad4:= GetPixel(TelRad,AvRad4,282);
      SetPixel(TelRad,AvRad4,282,clYellow);
    end;

    Radar.Repaint;
  end;
end;

Falta apenas definir as novas variáveis, como constantes
globais:

const
   AvRad1: word = 1000;
   AvRad2: word = 1000;
   AvRad3: word = 1000;
   AvRad4: word = 1000;
   SkRad1: longint = 0;
   SkRad2: longint = 0;
   SkRad3: longint = 0;
   SkRad4: longint = 0;

E uma variável tido handle de imagem, para uso geral,
(também uma var global).

var
  TelRad: HBitmap;

Agora estamos prontos para ligar o relógio do jogo e,
é claro, disponibilizar os recur$$o$ financeiro$.

Primeiro criamos três TLabels, de acordo com as
propriedades a seguir. Escolha uma fonte e um tamanho
de letra que dê uma boa visualização aos números.

        Caption = Jan
        Height = 15
        Left = 503
        Name = NomMes
        Top = 37
        Transparent = True
        Width = 25

        Caption = 16
        Height = 15
        Left = 537
        Name = Calend
        Top = 37
        Transparent = True
        Width = 15

        Caption = 03
        Height = 32
        Left = 577
        Name = Relog
        Top = 23
        Transparent = True
        Width = 35

A seguir criamos mais um TTimer:

        Enabled = True
        Interval = 200
        Name = Timer1

No evento OnTimer colocamos o seguinte código:

begin
  if Base <> 0 then begin
    {Se as bases estiverem ativas...}
    inc(Minuto);
    if (Minuto = 15) or (Minuto = 45) then MaisDinheiro;
    {Libera 2 sacolas de dinheiro a cada hora do jogo}
    if Minuto = 60 then begin
      {Passou uma hora?}
      Minuto:= 0; inc(Hora); if Hora < 10 then
        Relog.Caption:= '0'+IntToStr(Hora) else
        Relog.Caption:= IntToStr(Hora);
      if Hora = 24 then begin
      {Passou um dia?}
        Hora:= 0; inc(Dia); Calend.Caption:= IntToStr(Dia);
        if ((Dia = 30) and ((Mes mod 2) = 0)) or
           ((Dia = 31) and ((Mes mod 2) = 1)) then begin
           Dia:= 1; inc(Mes); NomMes.Caption:= Meses[Mes];
           {Passou um mes?}
        end;
      end;
    end;
  end;
end;

Finalmente acrescentamos as constantes globais:

const
  Meses: array[1..12] of string = ('Jan','Fev','Mar',
                                   'Abr','Mai','Jun',
                                   'Jul','Ago','Set',
                                   'Out','Nov','Dez');
  Minuto: byte = 0;
  Hora: byte = 3;
  Dia: byte = 16;
  Mes: byte = 1;

Só falta compilar e ver o resultado.

{------------ Fim do programa / comentário -----------------}

  online