DUDA: Como saber si en bash han pulsado las flechas de dirección

Holiii muy buenas tardes ^^, me gustaria comentaros un problema para saber si alguien que sepa sobre bash encuentra la solución

estoy haciendo un juego simple, le quiero llamar Indie Go-Yons (un poco de humor sibre Indiana Jones XD) y el objetivo que quiero hacer es el de buscar monedas, que las vaya contando y demás, y que luego vayan apareciendo enemigos y se muevan aleatoriamente, pero esto será en una versión final, ya que por el momento estoy testeando que vaya en un tablero de 10x10 todo correcto, y por el momento va bien

Imagen


Pero tengo un problema que no se solucionar, ya que no puedo sacar el fallo si un jugador usa las teclas direccionales para movese, ya que el tput que es el comando que uso para mover el personaje, parece que deja moverse con el teclado de esa manera, por lo que no se si hay alguna forma de poder evitar eso, ya que de hecho, en ocasiones, me salta el mensaje de que solo pulse W,A,S,D para moverse, por lo que lo reconoce

Imagen


El caso es que uso un case para comprobar si usa W A S D, por lo que deberia cazar si esta pulsando la tecla direccional, pero no lo hace

    read -n 1 -s mov
    mensaje="                                                  "
    #Para borrar la posición actual del personaje, y moverlo a otra posición
    tput cup $xJ1 $yJ1
    echo " "
    #Comprueba que se le ha dado a W, A, S o D, si no suelta un mensaje que se imprimirá en pantalla
    case $mov in
        [Ww])
            xJ1=$(( $xJ1 - 1 ))
            ;;
        [Ss])
            xJ1=$(( $xJ1 + 1 ))
            ;;
        [Aa])
            yJ1=$(( $yJ1 - 1 ))
            ;;
        [Dd]) yJ1=$(( $yJ1 + 1 ))
            ;;
           *)
            mensaje="Pulsa W, D, A o S para mover al Indi Go-Yons."
            ;;
    esac


¿Alguien sabe como puede arreglarse?, ¡¡muchas gracias!! ^^

Un saludo :3 [bye]
Las teclas direccionales, si no me equivoco, suelen ser tratadas como secuencias ANSI por los terminales, y en este caso, son secuencias multibyte.

`read` , con el -n 1, está capturando el primero de los bytes, pero el segundo no.


Mira:

Imagen


Las teclas s y w las captura bien, pero las flechas up y down captura el primer byte (el mismo en ambos casos, 0x1b), y el segundo byte, que es el que realmente es diferente, como escrito en el terminal (esos [A y [B, que por cierto, para que apareciesen en la imagen simplemente he pulsado enter, por eso el "command not found")


Parece que ir caracter a caracter no es suficiente. O mejoras/haces más compleja esa detección de teclas tu mismo, o quizá podrías echarle un ojo a la librería ncurses o alguna otra, que te resolvería el problema.


PS: Quizá sea posible configurar el terminal de alguna manera concreta que te ayude al arrancar el juego, pero eso no lo tengo controlado. Pero si lo haces acuérdate de volver a restaurar la configuración al salir ;)
jorchube escribió:Las teclas direccionales, si no me equivoco, suelen ser tratadas como secuencias ANSI por los terminales, y en este caso, son secuencias multibyte.

`read` , con el -n 1, está capturando el primero de los bytes, pero el segundo no.


Mira:

Imagen


Las teclas s y w las captura bien, pero las flechas up y down captura el primer byte (el mismo en ambos casos, 0x1b), y el segundo byte, que es el que realmente es diferente, como escrito en el terminal (esos [A y [B, que por cierto, para que apareciesen en la imagen simplemente he pulsado enter, por eso el "command not found")


Parece que ir caracter a caracter no es suficiente. O mejoras/haces más compleja esa detección de teclas tu mismo, o quizá podrías echarle un ojo a la librería ncurses o alguna otra, que te resolvería el problema.


PS: Quizá sea posible configurar el terminal de alguna manera concreta que te ayude al arrancar el juego, pero eso no lo tengo controlado. Pero si lo haces acuérdate de volver a restaurar la configuración al salir ;)


He intentado poder comprobarlo con un read, lo meta en una variable que luego hago echo para ver su información y luego intento hacerle un grep, pero en el grep se pierde, por lo que no podría comprobarlo con la idea que tengo, yo es que con bash llevare poco tiempo y este es el segundo juego que hago como tal, siendo este más complejo (ya que es la primera vez que uso el tput xD) el otro era un bingo que hice mediante if, while y esas cosas ^^

como va lo de las librerias, solamente es instalarla y comprobar, o tengo que hacer algun paso para implementarlo al proyecto?, así le echo un ojo, y compruebo si funciona ^^

Gracias y saludos!! [bye]
2 respuestas