A tecnologia do proto 1 e 2

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.

 

Download...
Clique nos links para fazer o download dos arquivos. O download desses arquivos é exclusivo para os assinantes do club TILT. Se ainda não é assinante, clique aqui e saiba como assinar.

Fontes do primeiro protótipo
Fontes do segundo protótipo
 
online