Pregunta

He asumido la aventura de crear un juego de rol de línea de comandos relativamente pequeño para flexionar mis nuevos músculos de pitón, pero ya me he encontrado con un enigma. Estoy usando esta implementación de GetCh ():

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    key = sys.stdin.read(3)
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

tengo key Establecer para leer en 3 caracteres para capturar las teclas de flecha. Arriba, por ejemplo, se lee en ESC[A; Con este método, puedo usar key[2] Para determinar si se presionó una tecla de flecha y cuál. Todo bien, excepto que también me gustaría capturar todo tipo de otras llaves; q para el registro de misiones, wasd Para el movimiento (presionar las flechas en varios órdenes será el método de ataque), y muchas otras. El problema está claro instantáneamente; si getch() Solo devuelve un solo carácter, la funcionalidad de flecha se pierde por completo.

Estoy contemplando repensar el sistema de flecha por completo si no hay una solución simple, pero estoy casi seguro de que debe haber. Es cierto que sé poco de lo que está pasando dentro tty, pero leí en alguna parte que si solo lees en 1 personaje, los personajes excesivos de una prensa de flecha se conservan en el búfer. ¿Cómo podría acceder a dicho búfer? Alternativamente, ¿hay alguna forma inteligente de decir? stdin ¿Esperar la entrada de longitud variable?

Gracias de antemano por cualquier ayuda.

¿Fue útil?

Solución

No leas tres personajes. Leer uno.

Si el único personaje que acabas de leer es ESC, lea otro personaje o dos para ver si era una llave de flecha o lo que sea. Si fuera un q, haz la cosa por eso y luego comienza de nuevo.

Otros consejos

Si considera desarrollar un juego completo, PyGame También podría ser útil (eventualmente ncurses).

los getch() El fragmento se puede actualizar para leer la tecla de flecha, pero cómo marcar la diferencia entre el primer char de una llave de flecha y la ESC ¿llave? Si el usuario presiona ESC, la solución descrita probablemente esperará la siguiente tecla Presione.

No encontré ninguna solución para manejar este último caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top