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 --------------------}
|