Normalmente as pessoas começam a criação de um jogo, olhando para a programação. Mas vamos fazer de modo diferente aqui: começar olhando para os elementos visuais ou "gráficos", como a comunidade gosta de chamá-los. Imagine que em nosso jogo teremos um cenário visto de cima, onde um avião caça/bombardeiro bimotor deve, ao mesmo tempo, destruir as instalações do inimigo e abater caças ou bombardeiros que tentarem fazer o mesmo com seu aeroporto de partida. Estrutura mais simples que essa, só jogo de baralho...

Comece com uma folha de papel A4 em branco e desenhe nela o seu cenário. Pense apenas no básico: o terreno onde a missão irá ocorrer. Se quiser ou preferir, pode pegar nosso rascunho clicando aqui, e seguir passo-a-passo o que vamos fazer. Veja como ficou bacaninha nosso terreno: temos o aeroporto de partida do nosso bombardeiro (1) uma área de água separando o campo inimigo (2); um porto (destruir navios também vale) com dois diques secos (4); algumas montanhas, praias (3) e um terreno mais ou menos plano (5) onde iremos depois ter as pistas, hangares, armazéns fábricas, ferrovias, etc, do inimigo.

Após desenhar o esboço em uma folha de papel, passe-a pelo scanner e teremos uma imagem digital (foto) do nosso cenário. Claro que muita coisa vai estar deslocada e fora de eixo, mas a fase de elaborar ou "dar polimento" aos gráficos vem depois. O importante aqui é estabelecer o funcionamento do jogo e testar se o esquema funcional proposto tem possibilidades de resultar em algo interessante.

Passado do papel para o micro, o fundamental é ter um arquivo do tipo bitmap (.bmp), para facilitar e agilizar ao máximo o trabalho de processamento, durante o jogo. No caso, o arquivo chama-se mapa.bmp e as dimensões do dito cujo são: 3290 pixels de largura por 2260 pixels de altura. Guarde bem esses números, porque eles aparecerão em uma série de locais.

Então, crie um form novo, com as seguintes dimensões internas:

ClientHeight = 226
ClientWidth = 329

Curiosamente (coincidência, não?) essas medidas represetam 1/10 da imagem do cenário. Crie a seguir uma variável global do tipo TBitmap para receber a foto do cenário:

implementation
{$R *.DFM}
var
  Mapa: TBitmap;

e a seguir defina o load do arquivo, no evento OnCreate do Form1:

procedure TForm1.FormCreate(Sender: TObject);
begin
Mapa:= TBitmap.Create;
Mapa.LoadFromFile('mapa.bmp');
end;

Aproveite o momento (senão depois a gente esquece de fazer) e libere a memória usada para esse objeto, quando o usuário encerrar o jogo:

procedure TForm1.FormDestroy(Sender: TObject);
begin
Mapa.Free;
end;

Neste ponto temos então o mapa carregado na memória e pronto para uso. A mecânica do jogo é bem simples: como não podemos "ver" o mapa todo de uma única vez (ele é muito grande), criamos uma espécie de "janela" de visão. Vemos portanto uma fração da imagem.

Como o avião ficará no centro da imagem, a sensação de movimento é dada pela posição em que colocamos a janela. Ou melhor, de que posição capturamos ou copiamos o conteúdo, para mostrar ao jogador. Controlamos a posição da janela através de duas varíaveis (Mx e My).

Variando Mx e My, temos portanto a simulação de movimento do avião (que na verdade fica parado, sempre na mesma posição). Se somarmos valores a Mx, por exemplo, o avião "voará" para o leste e se subtrairmos, para o oeste. Da mesma forma, se somarmos valores a My, o avião voará para o sul e se subtrairmos, para o norte. Para facilitar a programação, ao invés de somarmos diretamente esses valores e criar uma enorme quantidade de linhas If... then... usamos mais duas variávels (Dx, Dy) para conter o valor de deslocamento.

Com isso podemos implementar também mais quatro movimentos, sem aumentar a programação: noroeste, nordeste, sudeste e sudoeste (a 45 graus dos movimentos normais). Criamos então as devidas variáveis globais:

var
  Mapa: TBitmap;
  Mx,My,Dx,Dy: integer;

No evento OnCreate, do Form1, fazemos a inicialização delas:

  Mapa.LoadFromFile('mapa.bmp');
  Mx:= 0; My:= 1710; Dx:= 0; Dy:= -2;

O deslocamento do avião será de 2 em 2 pixels. Aí o leitor pergunta: mas que raio de valor 1710 é aquele? Bem, é uma posição que coloca a janela de visão exatamente sobre a cabeceira da pista de decolagem do avião do jogador. Um bom local para se começar a missão, não é?

Para fazer o movimento, usamos um componente TTimer (alça System), calibrado para um Interval de 80 (milissegundos). A primeira providência é fazer o movimento:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Mx:= Mx + Dx; My:= My + Dy;

verificamos se essa nova posição é possivel, ou seja, se não saimos do campo de visão real do mapa do cenário:

  if (Mx > 2960) or (Mx < 0) then Dx:= Dx * -1;
if (My > 2033) or (My < 0) then Dy:= Dy * -1;

Neste caso, estamos apenas fazendo o avião "quicar" e inverter a direção do vôo. Depois isso deve ser melhorado. Em seguida transferimos a imagem sob a janela, para o canvas do Form1:

Form1.Canvas.CopyRect(bounds(0,0,329,226),
                      Mapa.Canvas,bounds(Mx,My,329,226));

Pronto. Já temos o cenário, o avião voando e a programação que usamos até aqui foi nível jardim da infância. É óbvio que estamos muito longe que algo que possa ser tratado como um jogo comercial, concorrente da última versão do Flight Simulator, mas quer saber de uma coisa: não gastamos nem uma hora de trabalho e a sensação de ver o "avião imaginário", que fizemos deslocar-se pelo cenário, foi incrível.

Agora, aproveite o que foi mostrado aqui e faça experiências com a programação. Estude como as modificações influenciam o vôo. Mude a taxa de deslocamento (Dx, Dy).

Quando tiver acabado, implemento o comando de controle de vôo, no evento OnKeyDown do Form1:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if
Key = vk_right then begin
if (Dx = 0) and (Dy = -2) then begin Dx:= 2; exit; end;
if (Dx = 2) and (Dy = -2) then begin Dy:= 0; exit; end;
if (Dx = 2) and (Dy = 0) then begin Dy:= 2; exit; end;
if (Dx = 2) and (Dy = 2) then begin Dx:= 0; exit; end;
if (Dx = 0) and (Dy = 2) then begin Dx:= -2; exit; end;
if (Dx = -2) and (Dy = 2) then begin Dy:= 0; exit; end;
if (Dx = -2) and (Dy = 0) then begin Dy:= -2; exit; end;
if (Dx = -2) and (Dy = -2) then begin Dx:= 0; exit; end;
end;
if Key = vk_left then begin
if (Dx = 0) and (Dy = -2) then begin Dx:= -2; exit; end;
if (Dx = -2) and (Dy = -2) then begin Dy:= 0; exit; end;
if (Dx = -2) and (Dy = 0) then begin Dy:= 2; exit; end;
if (Dx = -2) and (Dy = 2) then begin Dx:= 0; exit; end;
if (Dx = 0) and (Dy = 2) then begin Dx:= 2; exit; end;
if (Dx = 2) and (Dy = 2) then begin Dy:= 0; exit; end;
if (Dx = 2) and (Dy = 0) then begin Dy:= -2; exit; end;
if (Dx = 2) and (Dy = -2) then begin Dx:= 0; exit; end;
end;
end;

Ou seja, as teclas seta para direita e esquerda controlam o giro direcional do avião. Mais experiências o aguardam, até a próxima parte. Divirta-se...


online