Começar um projeto novo é sempre um parto. Por onde
iniciamos a programação? Como definir os parâmetros
e limites do jogo? Como saber quais são as melhores opções?
Não
tem receita pronta, então a gente tem que tatear no escuro.
A regra aqui é fazer e ver como fica. Então tirar
conlcusões e ir melhorando o que não ficar bom.
Comecei o primeiro protótipo com duas figuras, uma para
usar como fundo quadriculado e marcar as posições
e a outra com a imagem do tanque de guerra.
Tomei
como padrão, quadros de 32 x 32 pixels usando o
mais puro e científico processo de chutar um valor qualquer.
Me pareceu que daria certo. Não deu e quem rodou o proto
1 percebeu bem como a imagem do tanque é pequena. Mas a
técnica não é de todo ruim, então
vejamos: como foi estabelecido que o jogo tomaria toda a tela,
no OnCreate do Form1 eu defini o buffer de imagem.
|
begin Buf:= TBitmap.Create; Buf.Width:= ClientWidth; Buf.Height:= ClientHeight; Buf.PixelFormat:= pfDevice; Tx:= 320; Ty:= 320; Td:= 0; Tv:= 1;
|
Tx
e Ty correspondem à posição do tanque
na tela; Td indica a direção e portanto o
frame da imagem do tanque a ser usada e Tv a velocidade
de deslocamento. Para cuidar do processamento, foi criado um Timer,
cujo valor do Interval foi definido como 33.
O
evento OnTimer portanto cuida de deslocar o tanque e montar
o buffer, que posteriormente será enviado à tela.
|
if Td = 0 then Ty:= Ty - Tv; if Td = 1 then Tx:= Tx + Tv; if Td = 2 then Ty:= Ty + Tv; if Td = 3 then Tx:= Tx - Tv; MontaTela; end;... |
MontaTela é
uma procedure que apenas monta a imagem do buffer.
|
procedure TForm1.MontaTela; var Tl,Tc,Tm: integer; begin for Tl:= 0 to Buf.Width div 32 do for Tc:= 0 to Buf.Width div 32 do begin BitBlt(Buf.Canvas.Handle,Tc*32,Tl*32,32,32, Fundo.Canvas.Handle,0,0,srccopy); end;
BitBlt(Buf.Canvas.Handle,Tx,Ty,32,32, Tank.Canvas.Handle,Td*32,0,srccopy);
for Tm:= 0 to 6 do begin if Tz[Tm*5+4] > 0 then begin BitBlt(Buf.Canvas.Handle,Tz[Tm*5],Tz[Tm*5+1],2,2, Tiro.Canvas.Handle,0,0,srccopy); Tz[Tm*5]:= Tz[Tm*5] + Tz[Tm*5+2]; Tz[Tm*5+1]:= Tz[Tm*5+1] + Tz[Tm*5+3]; Tz[Tm*5+4]:= Tz[Tm*5+4]-1; end; end; Canvas.Draw(0,0,Buf); end;
|
Tz
é um array criado para conter até 7 tiros
disparados pelo jogador. Cada tiro possui 5 parâmetros,
na seguinte ordem: coordenadas X,Y do tiro, incrementos
em X e Y e "combustível", ou seja,
o quanto o tiro ainda deve se mover, até perder o seu impulso.
Portanto, o parâmetro de índice 4 indica se existe
ou não um tiro "ativo".
|
Tz: array[0..34] of integer = ( 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0); |
No
início do evento OnTimer checamos as possíveis
teclas pressionadas e processamos os controles executados pelo
jogador:
|
begin if getkeystate(vk_Left) < 0 then begin if Tlf = false then Td:= Td - 1; if Td = 255 then Td:= 3; Tlf:= true; end else Tlf:= false;
if getkeystate(vk_Right) < 0 then begin if Trg = false then Td:= Td + 1; if Td = 4 then Td:= 0; Trg:= true; end else Trg:= false;
if getkeystate(vk_Up) < 0 then begin if Tup = false then Tv:= Tv + 1; if Tv = 2 then Tv:= 1; Tup:= true; end else Tup:= false;
if getkeystate(vk_Down) < 0 then begin if Tdw = false then Tv:= Tv - 1; if Tv = -2 then Tv:= -1; Tdw:= true; end else Tdw:= false;
if getkeystate(vk_Space) < 0 then begin if Tbr = false then begin for Tm:= 0 to 6 do if Tz[Tm*5+4] = 0 then begin Tz[Tm*5+0]:= Tx + 15; Tz[Tm*5+1]:= Ty + 15; case Td of 0: begin Tz[Tm*5+0]:= Tx + 15; Tz[Tm*5+1]:= Ty; Tz[Tm*5+2]:= 0; Tz[Tm*5+3]:= -2; end; 1: begin Tz[Tm*5+0]:= Tx + 32; Tz[Tm*5+1]:= Ty + 15; Tz[Tm*5+2]:= 2; Tz[Tm*5+3]:= 0; end; 2: begin Tz[Tm*5+0]:= Tx + 15; Tz[Tm*5+1]:= Ty + 32; Tz[Tm*5+2]:= 0; Tz[Tm*5+3]:= 2; end; 3: begin Tz[Tm*5+0]:= Tx; Tz[Tm*5+1]:= Ty + 15; Tz[Tm*5+2]:= -2; Tz[Tm*5+3]:= 0; end; end; Tz[Tm*5+4]:= 100; break; end; end; Tbr:= true; end else Tbr:= false; |
Vou
deixar assim mesmo, sem maiores explicações para
que o leitor tente entender sozinho como foi feita a decisão
de tiro e os ajustes dos parâmetros das balas. Para os mais
"acomodados" o link para download do fonte completo
do proto 1 está no final desta página.
Ok,
de cara fica evidente que o tanque é pequeno e que será
preciso aumentar os espaços, então criei o segundo
protótipo usando como base as medidas 64 x 64 pixels para
o tanque.
O
processamento é praticamente idêntico ao anterior
acrescentanto apenas uma procedure para considerar a transparância
das figuras. O fonte desse segundo proto pode ser baixado do club
TILT.
O
que fica evidente é que, aumentando o tamanho do tanque,
a área para o combate ficou pequena. É isso (e umas
cositas mais) que iremos tentar solucionar daqui em diante.
|