Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LeonardoPR2096 en 13 Agosto 2021, 04:42 am



Título: Salto de un personaje en c++
Publicado por: LeonardoPR2096 en 13 Agosto 2021, 04:42 am
Hola necesito ayuda con esto. estoy tratando de programar el salto de un personaje (en este caso un simple '*' ) pero me pasa algo raro cuando salto y el '*' esta en el aire presiono otra vez la tecla de saltar y al momento de llegar abajo vuelve a saltar. osea el kbhit() esta leyendo y guardando?? la tecla presionada. y de hecho solo quiero que se compruebe si se presiono una tecla cuando estoy en el suelo otra vez.
este es el codigo.

#include <iostream>
#include <conio.h>
#include <windows.h>

using namespace std;

int x=10, y=34;
int dy=1;
char tecla=0;

void dibujar()
{
   gotoxy(x,y); cout<<"*";
}

void borrar()
{
   gotoxy(x,y); cout<<" ";
}

void salto()
{   
   if(y==34){ //la condicion es para que solo compruebe si se presiona una tecla cuando el personaje esta en el suelo. pero por alguna razon lee la tecla                         //aunque ''y'' no sea 34.
   if(kbhit())
   {
   
       tecla=getch();

   }
}

   if(tecla=='w' )
   {
      borrar();
      y-=dy;
      dibujar();
      
      if(y<=25)
      {
         dy=-dy;
      }
      if(y==34)
                {
                   tecla=0;
         dy=-dy;
      }
   }   
}

int main()
{   
        dibujar();
   while(1)
   {
      salto();
      Sleep(80);
   }
   return 0;
}


Título: Re: Salto de un personaje en c++
Publicado por: MAFUS en 14 Agosto 2021, 15:10 pm
El sistema guarda las pulsaciones del teclado en un buffer. kbhit, getch, getchar, scanf, etc. lo que hacen es leer desde ese búffer. Esto es porque es muy improbable que un usuario pulse una tecla en el momento preciso que tu la pides.

Por tanto debes encontrar una forma de descartar esas pulsaciones mientras estés en el aire (por ejemplo que cuando toques el suelo primero se vacíe el búffer del teclado (una única vez) y a partir de después ver si pulsa la tecla de salto.

Otra idea sería que mientras estás en el aire puedas recibir las pulsaciones de teclado del usuario pero no hacer nada ante ellas.