Jump to content

Mover caracter / personagem pela tela do ecrã - Pascal


joao_o grande

Recommended Posts

ola,

Eu estou a tentar fazer um pequeno jogo no qual eu clico nas setas e um caracter move-se. No entanto, isto está dificil e há qualquer coisa de errado. O meu 1º objetivo é fazer mover o personagem. Podem dar uma olhadela pelo programa e ver o que está errado?? Daria mesmo muito jeito.

O que acontece, independentemente das teclas em que eu clico é isto:

(não consigo colar um print screen do meu ecra aqui. Alguém me ajuda??)

Para quem não quiser analisar as duas primeiras procedures:

1 - Na primeira procedure escreve-se as coordenadas do texto, escrevemos o texto que queremos e indicamos se queremos Writeln(True) ou Write(False) através de uma variável boolean.

2 - Na segunda procedure ele desenha simplesmente o caracter a ser movido nas coordenadas indicadas pelo programador.

P.S.: Não usei clrscr pq apaga a tela toda e eu não quero. Só quero apagar a posição anterior do boneco (por isso usei o [ESPAÇO])

Aqui vai o codigo.


Program Jogo;
var Jogador:Record X,Y:integer;
end;
ch:char;


Procedure Escrever(Escreve_x,Escreve_y:integer; texto:string; novaln: Boolean);
Begin
If novaln=True then
Begin
Gotoxy(Escreve_x,Escreve_y);
Writeln(texto);
End
else
Begin
Gotoxy(Escreve_x,Escreve_y);
Write(texto);
End;
End;

Procedure Desenha_jogador(Desenha_Jogador_X,Desenha_Jogador_Y:integer);
Begin
Gotoxy(Desenha_Jogador_X,Desenha_Jogador_Y);
Writeln(#178);
End;

Procedure Movimenta_personagem;
var Jogador:Record X,Y:integer;
end;
ch:char;

Begin
repeat
ch:=readkey;
Case ch of
#0:begin
ch:=readkey;
Case ch of
#75:begin //left
Escrever(Jogador.X,Jogador.Y,' ',False);
Jogador.X:=Jogador.X-1;
Desenha_Jogador(Jogador.X,Jogador.Y);
end;
#77:begin //right
Escrever(Jogador.X,Jogador.Y,' ',False);
Jogador.X:=Jogador.X+1;
Desenha_Jogador(Jogador.X,Jogador.Y);
end;

#80:begin //up
Escrever(Jogador.X,Jogador.Y,' ',False);
Jogador.Y:=Jogador.Y+1;
Desenha_Jogador(Jogador.X,Jogador.Y);
end;
#72:begin //down
Escrever(Jogador.X,Jogador.Y,' ',False);
Jogador.Y:=Jogador.Y-1;
Desenha_Jogador(Jogador.X,Jogador.Y);
end;
#27:Exit;
end;
end;
end;
until ch=#27;
End;

BEGIN
Jogador.X:=40;
Jogador.Y:=12;
Desenha_jogador(Jogador.X,Jogador.Y);
Movimenta_personagem;
END.
[/Code]
Link to comment
Share on other sites

O teu problema principal está no Procedure Movimenta_personagem.

Declaras uma variável local Jogador, e é esse que está a ser alterado pelo case controlado pelas teclas das setas, mas na hora de desenhar o jogador, está a ser usada a variável global Jogador, que nunca chega a ser movimentada excepto na inicialização da app.

Remove a variável local Jogador, e essa parte já trabalha bem.

Depois, é só veres o resto se funciona como queres. 😉

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Espetáculo!!! Já funciona. Obrigado nuno, O 1º objetivo está cumprido. Agora vou para o segundo..

Eu apaguei a variável global e as tres primeiras linhas do programa principal passei-as para a procedure.

Para quem precisar aqui vai o programa feito e funcional.

Program Jogo;
var ch:char;

Procedure Escrever(Escreve_x,Escreve_y:integer; texto:string; novaln: Boolean);
Begin
 If novaln=True then
 Begin
   Gotoxy(Escreve_x,Escreve_y);
   Writeln(texto);
 End
 else
 Begin
   Gotoxy(Escreve_x,Escreve_y);
   Write(texto);
 End;
End;

Procedure Desenha_jogador(Desenha_Jogador_X,Desenha_Jogador_Y:integer);
Begin
 Gotoxy(Desenha_Jogador_X,Desenha_Jogador_Y);
 Writeln(#178);
End;

//Procedure Inimigos_Aleatorio

Procedure Movimenta_personagem;
var Jogador:Record X,Y:integer;
end;
ch:char;

Begin
Jogador.X:=40;
Jogador.Y:=12;
Desenha_jogador(Jogador.X,Jogador.Y);
 repeat
   ch:=readkey;
   Case ch of
     #0:begin
       ch:=readkey;
       Case ch of
         #75:begin  //left
           Escrever(Jogador.X,Jogador.Y,' ',False);
           Jogador.X:=Jogador.X-1;
           Desenha_Jogador(Jogador.X,Jogador.Y);
         end;
         #77:begin  //right
           Escrever(Jogador.X,Jogador.Y,' ',False);
           Jogador.X:=Jogador.X+1;
           Desenha_Jogador(Jogador.X,Jogador.Y);
         end;

         #80:begin  //up
           Escrever(Jogador.X,Jogador.Y,' ',False);
           Jogador.Y:=Jogador.Y+1;
           Desenha_Jogador(Jogador.X,Jogador.Y);
         end;
         #72:begin  //down
           Escrever(Jogador.X,Jogador.Y,' ',False);
           Jogador.Y:=Jogador.Y-1;
           Desenha_Jogador(Jogador.X,Jogador.Y);
         end;
       end;
     end;
     #27:Exit;
   end;
 until ch=#27;
End;

BEGIN
   clrscr;
   cursoroff;

 Movimenta_personagem;
END.
Edited by joao_o grande
Link to comment
Share on other sites

Não te esqueças de validar os valores que atribuis à posição do jogador. Se tentares movê-lo para cima do Y = 1 ou para a esquerda do X = 1, tens erro.

E se tentares movê-lo para baixo ou para a direita do limite da janela, também terás problemas visuais.

😉

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Sugestão:

const
  MAX_X = 80;
  MAX_Y = 25;
  MIN_X = 1;
  MIN_Y = MIN_X;

procedure MudaPosJogador(var jog : TJogador; const ch : char);
// Definir tipo "TJogador"
begin
  case ch of
     #75 : // left
           jog.X := jog.X-1;
     #77 : //right
           jog.X := jog.X+1;
     #80 : //up
           jog.Y := jog.Y+1;
     #72 : //down
           jog.Y := jog.Y-1;
  end;

  if jog.Y > MAX_Y then
     jog.Y := MIN_Y
  else if jog.Y < MIN_Y then
     jog.Y := MAX_Y;

  if jog.X > MAX_X then
     jog.X := MIN_X
  else if jog.X < MIN_X then
     jog.X := MAX_X;
end;

// usar
MudaPosJogador(jogador, ReadKey);

Knowledge is free!

Link to comment
Share on other sites

Não te esqueças de validar os valores que atribuis à posição do jogador. Se tentares movê-lo para cima do Y = 1 ou para a esquerda do X = 1, tens erro.

E se tentares movê-lo para baixo ou para a direita do limite da janela, também terás problemas visuais.

😉

Eu sei que faltava isso, mas não queria avançar sem primeiro conseguir fazer mover o personagem. Obrigado aos dois.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.