Jump to content
joao_o grande

Mover caracter / personagem pela tela do ecrã - Pascal

Recommended Posts

joao_o grande

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]

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
joao_o grande

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

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
joao_o grande

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.