Pygame непрерывного и одновременного ввода клавиш

Я застрял снова и не могу найти какие-либо действительные решения в Интернете. Я пытаюсь использовать Pygame и его ключевые входы для управления различными вещами. Теперь мне нужно использовать несколько клавиш одновременно. Мой код выглядит следующим образом:

pygame.key.set_reapeat(50,50)
bProgramLoop = True
while (bProgramLoop == True):

    for event in pygame.event.get():
        if (event.type == pygame.QUIT):
            bProgramLoop = False
        if (pygame.key.get_pressed()[pygame.K_LEFT]):
            EXECUTE_FUNCTION1()
            print "left"
        if (pygame.key.get_pressed()[pygame.K_RIGHT]):
            EXECUTE_FUNCTION2()
            print "right"

Теперь проблема, которая у меня есть: когда я удерживаю "ВЛЕВО ВПРАВО", он правильно и постоянно регистрирует, что я нажимал влево / вправо. НО, когда я удерживаю "ВЛЕВО" и просто нажимаю "ВПРАВО", он регистрирует, что левые и правые были нажаты, но затем останавливается, чтобы зарегистрировать, что "ВЛЕВО" все еще нажимается.

Любые идеи кто-нибудь? Любая помощь будет принята с благодарностью. Миша

3 ответа

Решение

В моем коде "повтор" написан правильно.

Я нашел решение моей проблемы. Приведенный выше код необходимо изменить.

pygame.key.set_repeat(50,50)
bProgramLoop = True
while (bProgramLoop == True):

    for event in pygame.event.get():
        if (event.type == pygame.QUIT):
            bProgramLoop = False
        if (event.type == pyame.KEYDOWN):
            if (event.key == pygame.K_a)   # if A is pressed
                bKeyA = True               # set the Boolean True
            if (event.key == pygame.K_s)   
                bKeyS = True
        if (event.type == pyame.KEYDOWN):
            if (event.key == pygame.K_a)   # if A is released
                bKeyA = False# set the Boolean False
            if (event.key == pygame.K_s)   
                bKeyS = False

    if (bKeyA == True):
        Execute_function1()
    if (bKeyB == True):
        Execute_function2()

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

Таким образом, решение состоит в том, чтобы установить переменную true, пока ключ не будет поднят, и, таким образом, переменная установлена ​​в false.

Вы ошиблись в повторении в pygame.key.repeat(). Я исправил это, и это сработало для меня.

def main():
    while Running:
        check_events()
        update()
        clock.tick(FPS) 

def check_events():
    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            sys.exit()

            if key == pygame.K_q:
                Running = False
                return

        if (pygame.key.get_pressed()[pygame.K_LEFT]):
            #EXECUTE_FUNCTION1()
            print "left"
        if (pygame.key.get_pressed()[pygame.K_RIGHT]):
            #EXECUTE_FUNCTION2()
            print "right"

Если вы хотите использовать непрерывный ввод, попробуйте это, это мой код.

      import pygame as py
import time
sc = py.display.set_mode((800, 600))
x = 350
y = 300
blue = (0, 0, 255)
last = 0
while True:
  key = py.key.get_pressed()
  for event in py.event.get():
    if event.type == py.KEYDOWN:
      last = event.key
    else:
      last = 0
  if last == py.K_UP:
    y -= 0.1
  if last == py.K_DOWN:
    y += 0.1
  if last == py.K_LEFT:
    x -= 0.1
  if last == py.K_RIGHT:
    x += 0.1
  sc.fill((0,255,0))
  py.draw.rect(sc, blue, (x,y,50,50))
  py.display.flip()

Если хотите использовать одновременный ввод, то вот:

      import pygame as py
import time
sc = py.display.set_mode((800, 600))
x = 350
y = 300
blue = (0, 0, 255)
last = 0
def move(times, yspeed, xspeed):
  for i in range(times):
    global x, y
    x += (xspeed / times)
    y += (yspeed / times)
    time.sleep((xspeed / times / 10) + (yspeed / times / 10))
while True:
  key = py.key.get_pressed()
  for event in py.event.get():
    if event.type == py.KEYDOWN:
      last = event.key
    else:
      last = 0
    if event.key == py.K_UP and event.key == py.K_l:
      y -= 0.1
  sc.fill((0,255,0))
  py.draw.rect(sc, blue, (x,y,50,50))
  py.display.flip()
Другие вопросы по тегам