quinta-feira, 22 de novembro de 2012

Procedure instrucoes


A tela de Instruções do Mina 2 é a mais simples de todas. Ela apenas exibe um texto para o usuário e aguarda que seja pressionada a tecla ENTER.

Evitei usar acentuação no texto de Instruções porque haviam muitos PCs da época que não estavam configurados corretamente e acabavam mostrando caracteres estranhos.

O código completo da procedure instrucoes é o seguinte:
procedure instrucoes;
 var tecla_res:integer;
 begin
   apagatela;
   textcolor(14);
   textbackground(0);
   gotoxy(1,2);
   writeln('                            INSTRUCOES  ');
   writeln('    MINA 2 eh um jogo para um ou dois jogadores. O seu objetivo eh pegar ');
   writeln('  o maximo de objetos que aparecem na tela em um tempo limitado. Voce pode');
   writeln('  alterar a velocidade, o n§ de bolas e a fase onde quer jogar. No campo');
   writeln('  do jogo existem 5 minas escondidas. Se encontrar uma mina, bater na');
   writeln('  parede ou ser atingido por uma bola, voce morre e perde 5 pontos. ');
   writeln('    A cada 5 unidades de tempo as minas mudam de posicao.');
   writeln('  Cada vez que pegar um objeto ganhara pontos de acordo com a seguinte');
   writeln('  formula : pontos = (n§ da velocidade) + (n§ de bolas).');
   writeln('    Por isso quanto maior for a velocidade e o n§ de bolas , mais pontos');
   writeln('  voce podera ganhar. Se estiver no modo de 2 jogadores, o jogador da');
   writeln('  direita pega o objeto ',chr(4),' e o da esquerda pega o ',chr(6),' .');
   writeln('  Controles do jogo:  P - pausa/despausa    ESC - encerra uma partida');
   writeln('                      1§ jogador: usa as setas p/ se movimentar.');
   writeln('                      2§ jogador:      W');
   writeln('                                     A S D');
   writeln('  OBS: Voce nao precisa segurar a tecla para mover o personagem. Basta');
   writeln('  da um toque na direcao desejada que ele ira.');
   writeln('  Ass: Marcos Romero G. de Almeida. E-mail: maromero@zaz.com.br');
   writeln('                    PRESSIONE ENTER P/ CONTINUAR');
   repeat
    enfeite;
    tecla_res:=ord(readkey);
    if tecla_res=0 then tecla_res:=ord(readkey)+255;
   until tecla_res=ENT;
 end;

A procedure auxiliar apagatela foi feita para limpar a tela devagar e é utilizada em várias partes do Mina 2 para fazer a transição entre telas.

O texto é escrito a partir da 2ª linha da tela usando a cor amarela (valor 14) e o fundo preto (valor 0).

A procedure writeln(texto) escreve um texto e depois coloca o cursor no início da próxima linha.

No código fonte, onde aparece o símbolo § deveria aparecer º. Na execução do programa o símbolo º aparece corretamente.

Para escrever os símbolos ♦ (ASCII = 4) e ♠ (ASCII = 6), utilizei a função chr() na seguinte linha:
writeln('  direita pega o objeto ',chr(4),' e o da esquerda pega o ',chr(6),' .');

Para fazer a leitura das teclas pressionadas no Mina 2, utilizo as seguintes funções do Pascal:
  • keypressed: Esta função retorna True caso alguma tecla tenha sido pressionada.
  • readkey: Esta função retorna o caractere associado a tecla que foi pressionada.  
  • ord(char): Esta função retorna o código ASCII de um caractere.

Uma observação sobre a função readkey. Algumas teclas especiais como as de funções (F1, F2...) e as Setas do teclado possuem dois Bytes. Por isso a primeira leitura do readkey retornará 0 (zero), sendo necessário chamar o readkey de novo para pegar o valor desta tecla especial. Para diferenciar as teclas especiais das teclas normais, eu adiciono o valor 255 quando identifico que é uma tecla especial.

Esta lógica está no código abaixo:
tecla_res := ord(readkey);
if tecla_res = 0 then tecla_res := ord(readkey) + 255;

A procedure enfeite, que se encontra dentro do bloco repeat / until, é usada para fazer a animação da borda da tela até que uma tecla seja pressionada. Dentro dela está a chamada para a função keypressed. A procedure enfeite será analisada no próximo artigo.

Se a tecla pressionada for o ENTER, cujo código ASCII está armazenado na constante ENT, então a procedure instrucoes encerrará e o programa voltará para o menu.