A procedure enfeite é usada para fazer a animação da borda da tela de uma forma semelhante aqueles antigos placares eletrônicos. Esta procedure é usada em várias telas do Mina 2. O código fonte da procedure está abaixo.
procedure enfeite;
var asteriscos:string;
a,b,c:integer;
begin
asteriscos:='* * * * * * * * * * * * * * * * * ';
textcolor(11);
textbackground(0);
repeat
for a:=1 to 5 do
begin
gotoxy(1,1);
write(copy(asteriscos,a,80));
gotoxy(1,22);
write(copy(asteriscos,6-a,80));
escondecursor;
textcolor(11);
textbackground(0);
delay(60);
for b:=2 to 21 do
begin
c:=(a+b) mod 5;
if c = 1 then
begin
gotoxy(80,b);
write('*');
gotoxy(1,23-b);
write('*');
end
else
begin
gotoxy(80,b);
write(' ');
gotoxy(1,23-b);
write(' ');
end;
end;
end;
until keypressed;
end;
Antes de explicar a lógica utilizada nesta procedure, vou comentar sobre algumas procedures que aparecem neste código:
- copy(string,inicio,tamanho): A função copy() retorna uma parte de uma string especificada pelos parâmetros inicio e tamanho.
- delay(tempo): Esta procedure é usada para fazer uma pausa na execução do programa que dure o tempo especificado em milisegundos.
- escondecursor: Esta é uma procedure utilitária que fiz para esconder o cursor durante a execução do Mina 2. Ela define a cor de frente e de fundo como preto em uma posição da tela e coloca o cursor lá. No tempo do DOS essa solução funcionava corretamente, mas quando o Mina 2 é executado em uma janela do Windows é possível ver o cursor aparecendo em várias partes da tela.
A animação das bordas é feita de duas formas, sendo uma para as bordas horizontais e a outra para as bordas verticais.
Para as bordas horizontais, criei uma longa string que contém todos os asteriscos que devem ser exibidos na parte superior e inferior da borda. Entre os asteriscos existem 4 espaços em branco.
Utilizando a função copy() eu desloco a string com asteriscos para a esquerda na borda superior e para a direita na borda inferior. O trecho de código relacionado está abaixo:
for a:=1 to 5 do
begin
gotoxy(1,1); {borda superior}
write(copy(asteriscos,a,80));
gotoxy(1,22); {borda inferior}
write(copy(asteriscos,6-a,80));
...
Para as bordas verticais, um asterisco é desenhado a cada 5 posições levando em conta a posição atual das bordas horizontais. Nas outras posições é colocado um espaço em branco para apagar os asteriscos antigos.
Quando uma tecla for pressionada a procedure enfeite é encerrada e o fluxo do programa volta para a procedure anterior que chamou a procedure enfeite.
Quando uma tecla for pressionada a procedure enfeite é encerrada e o fluxo do programa volta para a procedure anterior que chamou a procedure enfeite.