projetos e jogos abertos
 
 
Recebendo um fax do comando
Como processar as mensagens que o programa gera
 

Uma das características do nosso jogo é que todos os comunicados entre o sistema e o jogador são feitos pelo Fax. E é este recurso que iremos implementar agora, assim você poderá criar mensagens para todas as operações que desejar informar ao jogador.

O funcionamento do fax se baseia em duas TImages que representam a área impressa do papel. Uma delas é visível, mas a outra fica invisível. Na TImage invisível escrevemos o texto desejado, usando para isso uma função (function SendFax).

Em primeiro lugar, a função limpa a área do papel e depois imprime a mensagem. A transferência de conteúdo é feita da TImage invisível para a visível linha a linha, provocando antes um scroll vertical, para baixo, do conteúdo da TImage destino. Assim, conseguimos o efeito de animação do fax sendo recebido. Providenciamos até uma luz que fica piscando enquanto o sistema está recebendo a mensagem.

As mensagens que serão recebidas precisam obedecer aos seguintes critérios: ter poucas palavras por linha e no máximo sete linhas de texto. Veja o exemplo de uma mensagem normal:

         SendFax('ATENÇÃO: sistema de',
                 'vigia detectou o',
                 'lançamento de mísseis',
                 'Scud.',
                 '','','');

Esta mensagem foi colocada no evento OnTimer1, quando ocorre a decisão de lançamento de um Scud (no telefone tem a versão compilada do jogo, até aqui). Note que as sete linhas precisam estar definidas, senão algum lixo acabará sendo impresso.

Outro exemplo foi colocado no momento em que um Scud é abatido por um míssil Patriot, na procedure Teleguiado:

         SendFax('Scud foi abatido.',
                 '',
                 'Total abatido: '+IntToStr(Abatidos),
                 '','','','');

As mensagens serão de grande utilidade quando tivermos que reportar o resultado dos ataques dos Scuds às nossas bases e os nossos ataques às bases de lançamento dos Scuds. Mas, independente disto, em outros momentos também podemos fazer uso do sistema, como por exemplo para informar sobre os aviões AWACs (pouso e decolagem), para reportar de tempos em tempos a situação da guerra, das bases, etc. Clique aqui e baixe o pacote zip com os fontes do jogo até esta etapa.

{---------- Início do programa / comentário --------------}

SEXTA PARTE

Crie duas TImages:

AutoSize = False
Height = 93
Left = 502
Name = Fax
Picture (None)
Top = 339
Visible = True
Width = 115

AutoSize = False
Height = 93
Left = 507
Name = FaxBak
Picture (None)
Top = 344
Visible = False
Width = 115

Para avisar que está chegando um
fax, crie um TPanel:

BevelInner = bvNone
BevelOuter = bvNone
BorderStyle = bsSingle
Caption = ''
Color = clGray
Height = 6
Left = 510
Name = LuzFax
Top = 315
Width = 12

Crie mais um TTimer:

Interval = 20
Name = CtrFax

O evento OnTimer está logo abaixo.
Defina agora, na área de constantes
globais, a seguinte variável:

   StFax: integer = 0;

Só falta transferir o código a seguir:

{--- Envia um fax, desde que seja possível ---}
function SendFax(L1,L2,L3,L4,L5,L6,L7: string): bool;
begin
   if StFax = 0 then begin
   Form1.FaxBak.Canvas.Pen.Color:= clWhite;
   Form1.FaxBak.Canvas.Brush.Color:= clWhite;
   Form1.FaxBak.Canvas.Rectangle(0,0,114,92);
   Form1.FaxBak.Canvas.Font.Name:= 'arial';
   Form1.FaxBak.Canvas.Font.Size:= 8;
   Form1.FaxBak.Canvas.Pen.Color:= clBlack;
   Form1.FaxBak.Canvas.TextOut
                        (0,-8,'----------------------------');
   Form1.FaxBak.Canvas.TextOut(0,2,L1);
   Form1.FaxBak.Canvas.TextOut(0,15,L2);
   Form1.FaxBak.Canvas.TextOut(0,28,L3);
   Form1.FaxBak.Canvas.TextOut(0,41,L4);
   Form1.FaxBak.Canvas.TextOut(0,54,L5);
   Form1.FaxBak.Canvas.TextOut(0,67,L6);
   Form1.FaxBak.Canvas.TextOut(0,80,L7);
   StFax:= 93;
   end;
end;

procedure TForm1.CtrFaxTimer(Sender: TObject);
var
   Fax1,Fax2: HBitmap;
begin
   if StFax <> 0 then begin
      dec(StFax);
      if (StFax mod 2) = 0 then LuzFax.Color:= clGray else
         LuzFax.Color:= clRed;
      Fax1:= Fax.Canvas.Handle;
      Fax2:= FaxBak.Canvas.Handle;
      BitBlt(Fax1,0,1,115,92,Fax1,0,0,SRCCOPY);
      BitBlt(Fax1,0,0,115,1,Fax2,0,StFax,SRCCOPY);
      Fax.Repaint;
   end;
end;
{------------ Fim do programa / comentário ---------------}

  online