Ir ao conteúdo

Posts recomendados

  • Membro VIP
Postado
11 horas atrás, AnonymousLPH disse:

Vi um jogo feito quase por inteiro de GotoXY e n entendi muito sobre

 

A tela do Pascal (assim como um "computador" de modo geral...) é tratada como uma matriz. Assim como o notebook que estou utilizando tem 1366 x 768 pixel de resolução, uma tela do Pascal pode ter, sei lá, 80x45... só que em vez de pixels ("pontos"), são por "caracteres", ou seja: cada linha cabem 80 caracteres e tem 45 linhas. Assim como só é possível ter "uma cor" por pixel ao mesmo tempo, só é possível ter apenas um "símbolo" por coordenada no Pascal.

 

A tela do Pascal funciona como uma máquina de escrever antiga. O curso onde sai as letras iniciam na posição 1x1... A medida que vai "escrevendo", vai indo da esquerda para direita... (pode usar o Word como referência também). Quando chega ao fim da linha (80x1), automaticamente volta para a primeira coluna da próxima linha (1x2). Se chegar no fim da tela e ocorre mais um fim de linha, toda a tela é redesenhada uma linha a cima... seria como "rolasse" o scroll do mouse para a página subir no Word... entende? todo o conteúdo da linha 2 vai fica na "matriz" na linha 1. A 3 para 2.. etc.... e a linha 45 ficando vazia.

 

Então, o GotoXY() serve para reposicionar o cursor (onde sai os caracteres) em determinada coordenada desejada... Seria como rolar o papel para cima ou para baixa e alinhar a coluna para esquerda e direita na máquina de escrever para determinada parte do papel... (ou clicar com o mouse em determinada parte do texto no Word. obs.: com o "Insert" ativado, rs), fazendo assim "letra" sair ali onde está o cursor.

 

RESUMINDO:

O GotoXY() simplesmente reposicionará o cursor onde sai a letra lá na tela.

 

Dê uma olhada também no comando WhereX() e WhereY(). Estes retornam o valor de coordenada atual onde está cursor.

 

 

Qualquer coisa é só perguntar...

adicionado 12 minutos depois

Exemplo:

program ExemploGotoXY;
uses
  CRT;
var
  nome  :string;
  idade :integer;
begin
writeln('Nome : ');
writeln('Idade: ');
writeln('O cursor está na coordenada (', WhereX, ',', WhereY, ')');
//vai aparecer que está em (1,3), pois está na coluna 1 da linha 3 (na linha de baixo)
GotoXY(8, 1); //daí vai posicionar na coluna 8 da linha 1 (onde eu quero)
readln(nome); //vai ler de lá
GotoXY(8, 2); //idem...
readln(idade);
end.

 

Desta forma vai exibir os textos na tela antes de começar a ler... fica parecendo um formulário... só após vai posicionar ao lado do "Nome :" e depois para a idade...

 

Em relação ao exemplo com os "Wheres", veja que o texto vai ficar fixo... pois simplesmente estará escrito na tela (não vai ficar atualizando). Os comandos simplesmente pegam o valor atual no momento que foi utilizado.

 

  • Membro VIP
Postado

@KXSY, valeu. Bacana essa lógica!

 

Oh! pesquisei aqui e vi que a CRT tem uma procedure que oculta o cursor do mouse :D.

 

var
  X,Y :integer;
  tecla :char;
  a:integer;
begin
CursorOff;
(* Posições iniciais *)
X:=10;
Y:=X;

Obs.: a ativação ou não do cursor pode ser feita em qualquer momento da execução. A depender, esse recurso poderia ser até útil em outros contextos.

 

 

Outro ponto:

 

14 horas atrás, KXSY disse:

        clrscr;             (*Apaga a tela*)
        gotoxy(X,Y);        (*Posiciona o cursor do console na posição X Y*)
        write('0');         (*Coloca o caractere na posição*)
        delay(200);         (*Espera 200 ms *)

 

Como o "desenho" é fixo, não seria melhor colocar dentro do if ? do jeito que está, a cada 200 milissegundos está apagando e escrevendo tela.

  • Membro VIP
Postado
3 horas atrás, KXSY disse:

Como assim? Seria em cada condição ou na condição de checagem da tecla pressionada?

 

Dentro do if.. após o case, ou seja: "se uma tecla foi pressionada, verifica qual tecla foi pressionada e redesenha na tela. Nesse caso ainda vai redesenhar independente da tecla, mas já seria menos custoso que o "tempo todo".

 

3 horas atrás, KXSY disse:

Como assim? Seria em cada condição ou na condição de checagem da tecla pressionada?

Eu fiz desse jeito porque e meio que uma regra da programação de jogos para mostrar os frames do jogo.

 

Provavelmente lá é mostrado um valor novo a cada ciclo, daí faz sentido ficar atualizado a tela o tempo todo. Já no caso do exemplo, só precisaria atualizar quando uma nova tecla é pressionada.

 

Outra forma de atualizar seria posicionando para apagar na coordenada atual e após posicionar para escrever no novo local. Desta forma também não precisaria apagar a tela toda. (talvez isso não é tão relevante na prática, apenas me referindo a lógica mesmo).

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...