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