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()