简体   繁体   中英

pygame continuous and simultaneous key inputs

I am stuck again and cannot find any valid solutions online. I am trying to use pygame and its key inputs to control various things. Now I need to use several keys simultaneously. My code is as follows:

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"

Now the problem that I have is: When I hold down "LEFT of RIGHT" it correctly and continuously registers that I pressed left/right. BUT when I hold in "LEFT" and just tap "RIGHT", it registers that left and right were pressed but it then stops to register that "LEFT" is still being pressed.

Any ideas anyone? Any help would be greatly appreciated. Misha

You have misspelled repeat in pygame.key.repeat(). I corrected this and it worked for me.

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"

In my code the "repeat" is correctly spelt.

I found the work around for my problem. The above code needs to be modified.

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

I double checked, the repeat is correctly spelt and it would not continue a keyboard input once another one was tapped. The problem is, as far as I can figure it out, and even occurs once at the point when a key is pressed. When another key is simultaneously pressed the event is lost.

Thus the solution is to set a variable true until the key is lifted up, and thus the variable is set false.

If you want to use continuous inputs than try this, it is my code.

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

If you want to use simultaneous input, then here:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM