Como é o jogo
Como é, como jogar e as novidades desta versão

 

O jogo Guerra no Golfo se baseia no bloqueio aos ataques dos mísseis Scuds, empreendidos pelo Iraque, às bases dos aliados: Riad, Dhahran, Telaviv, Haifa e Holon. Ou seja, num primeiro momento é preciso localizar os mísseis Scud e abatê-los com os mísseis Patriot

Num segundo momento, o jogador terá que localizar as bases móveis de lançamento dos Scuds e bombardeá-las com mísseis Tomahawk ou mísseis Cruise. Tudo é controlado numa tela de radar que, para informar as localizações corretas dos mísseis, precisa do apoio dos aviões AWACs (aqueles aviões com panelões nas costas).

No club TILT disponibilizamos também a primeira versão desse jogo, em CGA, para que você possa acompanhar melhor a evolução de um projeto. Vale lembrar que a primeira versão foi totalmente escrita em Assembler.

O jogo, tanto como a vida real, é movido a recursos financeiros. Ao longo do tempo os recursos vão sendo liberados para que o jogador equipe as suas bases com os mísseis adequados às missões.

Se uma base é atingida por um míssil Scud, parte dos recursos são automaticamente desviados para reparos e para a reestruturação da mesma. Nesta versão não incluí coisas sofisticadas como super faturamente, comi$$ões, desvios e maracutaias (coisas que conhecemos muito bem). 

As informações são passadas para o jogador através de um fax, que fica ligado o tempo todo. É por ele que serão dados os resultados dos ataques de ambos os lados. 

Como disse no começo, iremos construir o jogo passo-a-passo e isto não vai dar para ser feito numa única página. Mas fique tranqüilo, pois todos os elementos necessários, como telas, sons, etc, serão fornecidos. Você não terá trabalho nenhum para montar o sistema, basta seguir algumas instruções. 

E por falar nelas, optei por mostrar as etapas usando o esquema que foi usado para o jogo Aeroporto, ou seja, numa listagem corrida estarão as instruções de criação e modificação dos objetos e componentes do jogo bem como os trechos de programação, procedures e functions

Você pode acompanhar o projeto de montagem de duas formas: com o navegador web aberto e repassando o código para o Delphi via Cut & Paste ou baixar o pacote golfo1.zip:

  • Abra o arquivo golfo1.txt com o notepad.exe ou outro editor de textos;
  • Selecione a listagem e coloque-a no Clipboard (Ctrl + C);
  • Entre no Delphi, crie um novo formulário e insira a listagem após a última instrução end (Ctrl + V). 

Depois, basta ir seguindo o texto e transferindo as alterações e códigos para os seus devidos locais. Fácil, rápido e sem mistérios. Quando terminar, compile o programa e veja os resultados. Lembre-se de transferir o arquivo click.wav para o diretório onde estará seu jogo. 

No arquivo golfo1.zip você encontrará ainda os arquivos gráficos necessários para montar esta primeira parte.

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

PRIMEIRA PARTE

Vamos iniciar a construção do jogo passando direto pelas
partes mais simples e fáceis. Deixaremos de lado, por
enquanto, a abertura, apresentações, créditos, instruções,
etc. Primeiro vamos fazer o jogo funcionar.

Começamos com  tela básica do jogo, onde estarão os
elementos principais do sistema, como a tela do radar, o
fax, o visualizador operacional dos aviões AWACs, o
relógio e os botões de controle.

Entre no Delphi, com um formulário novo. As principais
características (o que deve ser mudado) deste Form1 são:

        ClientHeight = 453
        ClientWidth = 640
        Color = clBlack

NOTA: apresentarei, daqui para frente, as propriedades dos
objetos que devem ser alteradas, quando da sua criação.
Sinta-se à vontade para fazer outras modificações que
desejar, como escolher uma fonte menor para o texto, mudar
as cores dos textos dos botões, etc.

Crie uma TImage, para ser usada como a tela principal do
jogo:

        AutoSize = True
        Height = 453
        Left = 0
        Name = Tela
        Picture = (carregue o arquivo TELA.BMP)
        Top = 0
        Width = 640

Sim, eu sei que se a propriedade AutoSize for True, a
largura e a altura da imagem serão ajustadas
automaticamente pelo tamanho do arquivo BMP. Coloquei os
valores aqui apenas para verificar se tudo está nos
trinques.

Crie agora seis SpeedButtons, com as seguintes
características:

        Caption = Fim
        Height = 19
        Left = 23
        Name = Fim
        Top = 427
        Width = 33

        Caption = Haifa
        Height = 19
        Left = 161
        Name = Base1
        Top = 427
        Width = 57

        Caption = Telaviv
        Height = 19
        Left = 221
        Name = Base2
        Top = 427
        Width = 57

        Caption = Holon
        Height = 19
        Left = 281
        Name = Base3
        Top = 427
        Width = 57

        Caption = Riad
        Height = 19
        Left = 341
        Name = Base4
        Top = 427
        Width = 57

        Caption = Dhahran
        Height = 19
        Left = 401
        Name = Base5
        Top = 427
        Width = 57

Coloque, no evento OnClick da tecla Fim, o código de
encerramento da partida:

OnClick:
begin
  Close;
end;

Agora crie a TImage que será usada como Radar:

        AutoSize = True
        Height = 324
        Left = 14
        Name = Radar
        Picture = (carregue o arquivo RADAR.BMP)
        Top = 13
        Visible = False
        Width = 454

Já temos, em nosso jogo, a tela básica, o radar, o botão
de encerramento da partida e os botões que ativam /
selecionam cada uma das cinco bases dos aliados. O jogo
só começa mesmo quando o radar é ligado - notou que
a propriedade Visible, da TImage Radar está setada para
False?

E o radar é ligado assim que a primeira base for
selecionada, clicando o botão correspondente. Ao fazer
isso, nosso jogo deverá informar se a base está
desativada (não possui nenhum míssil) ou se está ativa.
Neste caso, com que tipo de míssil ela está operando e
quantos mísseis ela possui.

Cada base opera com um tipo de míssil de cada vez. Para
trocar de tipo é necessário "gastar" todos os mísseis
e aí "comprar" do modelo novo.

Ainda, como função dos botões de ativação
das bases, temos a plotagem no radar, numa cor diferenciada
(o radar é verde) da base atual. Para isso teremos que
estabelecer as coordenadas de cada uma das bases. É da base
selecionada que irá partir o ataque às bases de lançamento
dos Scuds, ou o ataque aos próprios Scuds.

Mas, antes de irmos direto ao ponto, vamos implementar
uma pequena sofisticação. Como estamos trabalhando num
equipamento ultra sofisticado, nada mais justo que, ao
clicar nos botões, possamos ouvir um "click" diferente.

Crie um TMediaPlayer para ser usado como instrumento de
tocar Waves:

        AutoOpen = False
        DeviceTipe = dtWaveAudio
        Name = Soner
        Visible = False

Eu costumo, nestes casos, "sumir" com todos os botões do
painel deste objeto e deixá-lo no menor tamanho possível,
para que ele não fique atrapalhando a visão do formulário.

O som do click é feito no evento OnMouseDown de todos os
botões que criarmos no jogo. Basta fazer em um botão e
nos outros, apontar o evento para o mesmo local onde foi
criado o primeiro evento.

OnMouseDown:
begin
  Form1.Soner.FileName:= 'click.wav';
  Form1.Soner.Open;
  Form1.Soner.Play;
end;

Voltando ao caso das Bases, crie uma TImage para servir
como display do arsenal de mísseis da base e outra, para
reter a "imagem" de um míssil:

        AutoSize = False
        Height = 20
        Left = 210
        Name = Arsenal
        Top = 395
        Width = 240

        AutoSize = True
        Picture = (carregue o arquivo MISSIL.BMP)
        Visible:= False

Coloque esta TImagem num local onde ela não atrapalhe a
visão do formulário. Ela não será visível durante o jogo.

Crie um TLabel para mostrar o nome da base e seu tipo de
míssil:

        Caption = ''
        Height = 15
        Left = 30
        Name = BaseAtiva
        Top = 400
        Transparent = True

O próximo passo é definir algumas constantes globais:

const
  Base: byte = 0;
  ParBase: array[0..9] of byte = (1,10,0,0,0,0,0,0,0,0);
  BasCord: array[0..9] of word =
                      (24,54,8,80,2,84,402,314,452,304);
  NomBas: string = '';

A constante Base indica (0) quando o jogo está parado.
Quando seu valor é diferente de zero, ela indica qual base
está ativa.

ParBase é uma matriz que contém o tipo de míssil e
sua quantidade, em cada uma das cinco bases e BasCord é uma
matriz que contém as coordenadas de linha e coluna de
cada base.

Os Mísseis são identificados da seguinte forma:

        0 = nenhum tipo de míssil selecionado
        1 = mísseis Patriots
        2 = mísseis Cruise
        3 = mísseis Tomahawk

Para ativar uma determinada base, crie um evento OnClick
com o seguinte código:

OnClick:
begin
  Radar.Visible:= True;
  NomBas:= 'Haifa';
  AtivarBase(1);
end;

Este trecho de programa ativa, por exemplo, a base 1
(Haifa). Para ativar as outras, basta repetir esse trecho
em cada um dos botões, fazendo as alterações de nome
e número da Base. Deixo isso por sua conta.

AtivarBase(x) é uma função que deve ser digitada conforme
o código a seguir:

function AtivarBase(QueBase: byte):bool;
var
  Lin,Col: word;   {Coordenadas de posição da base}
  Loc: byte;
  Local: HBitmap;  {Handles de áreas gráficas}
  Fonte,Destino: HBitmap;
begin
  Local:= Form1.Radar.Canvas.Handle;   //Handle do radar
  if Base <> 0 then begin
    //Pintar de verde base anterior, se houver uma ativada
    Col:= BasCord[(Base-1)*2]; Lin:= BasCord[(Base*2)-1];
    SetPixel(Local,Col,Lin,clLime);
    SetPixel(Local,Col+1,Lin,clLime);
    SetPixel(Local,Col,Lin+1,clLime);
    SetPixel(Local,Col+1,Lin+1,clLime);
  end;

  Base:= QueBase;   //Base atual
  Col:= BasCord[(Base-1)*2]; Lin:= BasCord[(Base*2)-1];

  //Pinta a base de branco
  SetPixel(Local,Col,Lin,clWhite);
  SetPixel(Local,Col+1,Lin,clWhite);
  SetPixel(Local,Col,Lin+1,clWhite);
  SetPixel(Local,Col+1,Lin+1,clWhite);
  Form1.Radar.Repaint;

  //Verifica o tipo de míssil que a base possui
  if ParBase[(Base - 1) * 2] = 0 then
     Form1.BaseAtiva.Caption:= NomBas+': DESATIVADA';
  if ParBase[(Base - 1) * 2] = 1 then
     Form1.BaseAtiva.Caption:= NomBas+': PATRIOT';
  if ParBase[(Base - 1) * 2] = 2 then
     Form1.BaseAtiva.Caption:= NomBas+': CRUISE';
  if ParBase[(Base - 1) * 2] = 3 then
     Form1.BaseAtiva.Caption:= NomBas+': TOMAHAWK';
  Form1.Arsenal.Canvas.Brush.Color:= $00B5C2C9;
  Form1.Arsenal.Canvas.Pen.Color:= $00B5C2C9;

  //Handle do míssil
  Fonte:= Form1.Missil.Canvas.Handle;

  //Handle do display
  Destino:= Form1.Arsenal.Canvas.Handle;

  //Limpa o display
  Rectangle(Destino,0,0,420,23);
  Loc:= ParBase[Base * 2 - 1]; if Loc > 30 then Loc:= 30;

  //Loc indica quantos mísseis serão mostrados - o display
  //só mostra os primeiros trinta mísseis
  if ParBase[(Base - 1) * 2] <> 0 then begin
    //Se tiver míssil na base, então mostre-os no display
    while Loc > 0 do begin
    BitBlt(Destino,(Loc-1)*8,0,7,20,Fonte,0,0,SRCCOPY);
    dec(Loc); end;
  end;

  Form1.Arsenal.Repaint;
end;

Pronto. Com isso nosso sistema de base já está operante.
Na próxima página tem mais. Até lá, familiaríze-se
com o local das bases, pois disso dependerá a sua performance
durante uma partida.

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

 
online