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