2015-04-24 2 views
0

Я пытаюсь принимать непрерывный ввод от пользователя и делать что-то на этом основании. Я пытаюсь использовать функцию key.get_pressed() в модуле pygame. Но я не могу заставить его работать. Я просмотрел все другие подобные вопросы, но ни одно из этих решений не работает.pygame.key.get_pressed() не работает

import pygame, RCcarFunctions, time 
pygame.init() 
keypressed = pygame.key.get_pressed() 
try: 
    while True: 
    if keypressed == "pygame.K_w": 
     RCcarFunctions.forward() 
    elif keypressed == "pygame.K_a": 
     RCcarFunctions.spinleft() 
    elif keypressed == "pygame.K_s": 
     RCcarFunctions.reverse() 
    elif keypressed == "pygame.K_d": 
     RCcarFunctions.spinright() 
    elif keypressed == "pygame.K_ESCAPE": 
     RCcarFunctions.stop() 
    pygame.event.pump() 
except KeyboardInterrupt: 
    RCcarFunctions.cleanup() 

ответ

0

Я нашел решение! Используйте очередь событий и опросите состояние требуемых ключей. Если они «опущены», переключите bool на True, если они «вверх» переключат bool на false (отдельный bool для каждой клавиши). Затем вне очереди событий проверяют состояние каждого bool, основываясь на том, что делают что угодно.

Основная проблема, с которой я столкнулся, заключалась в том, что у меня не было инициализированного отображения, я совершенно не знал, что для работы pygame вам нужно будет отобразить экран. После инициализации дисплея я получил его на работу.

pygame.init() 
size = (640,480) 
pygame.display.setmode((640,480)) 
while True: 
    for event in pygame.event.get(): 
    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_w: 
     forward = True 
     elif event.key == pygame.K_a: 
     left = True 
     elif event.key == pygame.K_s: 
     reverse = True 
     elif event.key == pygame.K_d: 
     right = True 
    elif event.type == pygame.KEYUP: 
     if event.key == pygame.K_w: 
     forward = False 
     elif event.key == pygame.K_a: 
     left = False 
     elif event.key == pygame.K_s: 
     reverse = False 
     elif event.key == pygame.K_d: 
     right = False 
    if forward & right: 
    RCcarFunctions.right() 
    elif forward & left: 
    RCcarFunctions.left() 
    elif forward: 
    RCcarFunctions.forward() 
    elif left: 
    RCcarFunctions.spinleft() 
    elif reverse: 
    RCcarFunctions.reverse() 
    elif right: 
    RCcarFunctions.spinright() 
    else: 
    RCcarFunctions.stop() 
except KeyboardInterrupt: 
    print ("\ncleaning up") 
    RCcarFunctions.cleanup() 
0

Перемещайте pygame.key.get_pressed() вызов внутри while True петли следующим образом:

import pygame, RCcarFunctions, time 
pygame.init() 
try: 
    while True: 
    keypressed = pygame.key.get_pressed() 
    if keypressed == "pygame.K_w": 
     RCcarFunctions.forward() 
    elif keypressed == "pygame.K_a": 
     RCcarFunctions.spinleft() 
    elif keypressed == "pygame.K_s": 
     RCcarFunctions.reverse() 
    elif keypressed == "pygame.K_d": 
     RCcarFunctions.spinright() 
    elif keypressed == "pygame.K_ESCAPE": 
     RCcarFunctions.stop() 
    pygame.event.pump() 
except KeyboardInterrupt: 
    RCcarFunctions.cleanup() 
+0

Это не сработало. Я знаю, что проблема не в моей библиотеке RCcarFunctions, потому что каждая из этих функций работает нормально, когда вызывается индивидуально. – Fazer

0

Вы должны переместить код get_pressed() внутри цикла.

Также вам нужно проверить, что он возвращает: список индексов bools, индексированных константами. https://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed

import pygame, RCcarFunctions, time 
pygame.init() 

try: 
    while True: 
    #get_pressed() returns a list of bools ? 
    keypressed = pygame.key.get_pressed() 
    if keypressed[pygame.K_w]: 
     RCcarFunctions.forward() 
    elif keypressed[pygame.K_a]: 
     RCcarFunctions.spinleft() 
    elif keypressed[pygame.K_s]: 
     RCcarFunctions.reverse() 
    elif keypressed[pygame.K_d]: 
     RCcarFunctions.spinright() 
    elif keypressed[pygame.K_ESCAPE]: 
     RCcarFunctions.stop() 
    pygame.event.pump() 
except KeyboardInterrupt: 
    RCcarFunctions.cleanup() 
+0

Как проверить, возвращает ли он список логических элементов? И почему он должен вернуть что-нибудь еще? – Fazer

+0

@Fazer вы должны прочитать документацию о функции. Я включил ссылку на нее. Ниже описание - это ссылка на примеры, которые следует соблюдать. – corn3lius

Смежные вопросы