funciones similares a kbhit y getch en c++ gnu/linux

Iniciado por etcheverrypablol, 8 Enero 2016, 08:52 AM

0 Miembros y 2 Visitantes están viendo este tema.

etcheverrypablol

Hola, estoy haciendo un programa en c++, de un avión que tiene que esquivar a meteoritos que vienen cayendo. El avión se debería mover con las teclas de izquierda y derecha. Preciso de alguna función que al momento de presionar algunas de estas dos teclas, almacene un valor en una variable, para de esta forma saber para dónde el juegador quiere mover el avión. Estuve averiguando en interntet, y sólo encuentro que dicen que hay que incluir la libería conio.h y que hay que usar las funciones kbhit y getch. Pero mi compilador no me recnonce ni la librería ni las funciones debido a, creo, que esas se deben usar cuando estás en windows. Y yo uso gnu/linux. Estoy uando el sistema operativo Manjaro, y compilanto en el terminal. Con el siguiente comando:
$ g++ space.cpp -o space

Alguno sabe qué funciones alternativas tengo a las ya nombradas. Desde ya muchas gracias.



Mod: No escribir los títulos en mayúsculas

MAFUS

Esto lo puedes hacer con ncurses, es una librería para manejar la consola.

Stakewinner00

Haciendo una búsqueda rápida puedes encontrar cosas como http://stackoverflow.com/a/16361724  que ya podrían servir para substituir a la función getch de la librería conio.h

JavierScars

No se si tiene mucho que ver el hecho de que estas en linux para esa libreria... Pero si recuerdo que algunas tienen que ser especificadas con "-l" o álgo asi. en otras palabras prueba a ver si tienes que linkearla.
Usa lo malo de la vida a tu favor, escala montañas de problemas para deslizarte sobre soluciones, derrumba muros de decepciones para encontrar la libertar de la felicidad,  y quema la leña del fracaso para calentarte con el éxito. Recuerda que sin la oscuridad la luz no brillaría tanto.

etcheverrypablol

#4
No puedo creer lo dificil que se me está haciendo esto, de encontrar una respuesta en interntet, cuando considero que debería ser algo ya re sabido por muchos y fácil. Lo que necesito es una forma de hacer lo siguiente:
   Si (el usuario presiona una tecla){  // Tecla izquierda o derecha
      hacer tal cosa
  }
En esa condición lógica, ¿qué tendría que colocar? Porque solo se debería ejecutar la sentencia del bloque "Si" sólo si se presiona una tecla. De esta forma, no se frena el programa, esperando que el usuario presione una.
He visto que muchos utilizan la función kbhit, de la librería conio. Pero yo necesito otra alternativa, ya que no puedo usar esa en linux. Alguno sabe cuál es la solución a este problema? Gracias.

furby86

Puedes probar a asignar a una variable el valor de una tecla.

como el siguiente código escrito y probado en ubuntu.


#include <stdio.h>
#include <ctype.h>

void main(){
char tecla=getchar();
printf("La tecla es %d",tecla);
}


Es una idea.

etcheverrypablol

#6
Hola furby86, gracias por responder. Me parece que eso no es precisamente lo que necesito, porque eso frenaría el programa hasta que se lea una tecla. Yo preciso que se siga ejecutanto el programa, y si(se presiona una tecla) entonces hacer tal cosa.




Cita de: JavierScars en  8 Enero 2016, 18:10 PM
No se si tiene mucho que ver el hecho de que estas en linux para esa libreria... Pero si recuerdo que algunas tienen que ser especificadas con "-l" o álgo asi. en otras palabras prueba a ver si tienes que linkearla.

Hola JavierScars, gracias, lo voy a tener en cuenta. Saludos.




Cita de: MAFUS en  8 Enero 2016, 10:39 AM
Esto lo puedes hacer con ncurses, es una librería para manejar la consola.

Hola MAFUS, estuve averiguando sobre esa librería, parece ser que es la que reemplaza a la conio.h. Me va a ser de utilidad parece ser, pero aún no encuentro la solcuión al problema. Muchas gracias por responder. Saludos.


Stakewinner00

Código (cpp) [Seleccionar]

#include <unistd.h>
#include <termios.h>
#include <cstdio>

char getch(){
   /*#include <unistd.h>   //_getch*/
   /*#include <termios.h>  //_getch*/
   char buf=0;
   struct termios old={0};
   fflush(stdout);
   if(tcgetattr(0, &old)<0)
       perror("tcsetattr()");
   old.c_lflag&=~ICANON;
   old.c_lflag&=~ECHO;
   old.c_cc[VMIN]=1;
   old.c_cc[VTIME]=0;
   if(tcsetattr(0, TCSANOW, &old)<0)
       perror("tcsetattr ICANON");
   if(read(0,&buf,1)<0)
       perror("read()");
   old.c_lflag|=ICANON;
   old.c_lflag|=ECHO;
   if(tcsetattr(0, TCSADRAIN, &old)<0)
       perror ("tcsetattr ~ICANON");
   printf("%c\n",buf);
   return buf;
}

int main() {
 if(getch() == 'X') {
     //hacer lo que sea
 }
}


etcheverrypablol