Модуль curses
имеет метод getch
, который вы можете использовать для этой цели.Пользователи Windows должны устанавливать проклятия.
Сначала введите stdscr.nodelay(1)
, чтобы метод getch
не блокировал, затем используйте его в главном цикле while, чтобы получить нажатую клавишу и объединить ее со строковой переменной (здесь она называется command
) и используйте stdscr.addstr
для его отображения.
Когда пользователь нажимает ввод, проверьте, равна ли введенная команда 'move left'
или 'move right'
, и переместите игровой объект в соответствующем направлении.
import curses
import pygame as pg
def main(stdscr):
stdscr.nodelay(1) # Makes the `getch` method non-blocking.
# Use `addstr` instead of `print`.
stdscr.addstr('Press "Esc" to exit...\n')
command = '' # Add the entered characters to this string.
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
rect = pg.Rect(300, 100, 30, 50)
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
return
inpt = stdscr.getch() # Here we get the pressed key.
if inpt == 27: # Esc
return
elif inpt in (ord('\n'), ord('\r')): # Enter pressed.
# Check which command was entered and move the rect.
if command == 'move right':
rect.x += 20
elif command == 'move left':
rect.x -= 20
command = '' # Reset the command string.
stdscr.addstr(2, 0, '{}\n'.format(command)) # Write in the second line.
elif inpt == 8: # Backspace
command = command[:-1]
stdscr.addstr(2, 0, '{}\n'.format(command))
elif inpt not in (-1, 0): # ValueErrors if inpt is -1 or 0.
command += chr(inpt) # Concatenate the strings.
stdscr.addstr(2, 0, '{}\n'.format(command))
screen.fill((30, 30, 30))
pg.draw.rect(screen, (0, 120, 250), rect)
pg.display.flip()
clock.tick(30)
if __name__ == '__main__':
pg.init()
# Use the curses.wrapper to start the program. It handles
# exceptions and resets the terminal after the game ends.
curses.wrapper(main)
pg.quit()
Я неИмею большой опыт работы с проклятиями, поэтому нет гарантий, что все работает правильно.
Модуль msvcrt
(Windows) также имеет функцию getch, и я думаю, что termios
можно использовать для Linux и MacOS.Это кроссплатформенное решение, кажется, работает, но я никогда не проверял его: https://stackoverflow.com/a/510364/6220679