Pygame: key.get_pressed() does not coincide with the event queue

前端 未结 4 456
心在旅途
心在旅途 2020-11-30 13:25

I\'m attempting to work out simple controls for an application using pygame in Python. I have got the basics working, but I\'m hitting a weird wall: I am using the arrow key

4条回答
  •  情深已故
    2020-11-30 13:42

    just use the events return data, instead of trying to poll, you're already checking if its a keydown event TYPE, now just interrogate the KEY index, like so:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_LEFT:
                player.pos = (player.pos[0] - 2, player.pos[1])
    

    rest of code.....

    also consider using a separate data structure to store the state of your controls, then just use the events to update that data structure. That will help make the controls a bit more flexible as you wont be relying on the event queue to cause your character to move, which in my experience causes problems like: not being able to push more than two buttons at a time, and odd delay or timing issues with character movements. so something like:

    keystates={'up':False, 'down':False, 'left':False, 'right':False}
    running=True
    
    #start main pygame event processing loop here
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                running=False
    
            #check for key down events
            if event.type == KEYDOWN:
                if event.key == K_UP:
                    keystates['up']=True
                if event.key == K_DOWN:
                    keystates['down']=True
                if event.key == K_LEFT:
                    keystates['left']=True
                if event.key == K_RIGHT:
                    keystates['right']=True
    
            #check for key up events
            if event.type == KEYUP:
                if event.key == K_UP:
                    keystates['up']=False
                if event.key == K_DOWN:
                    keystates['down']=False
                if event.key == K_LEFT:
                    keystates['left']=False
                if event.key == K_RIGHT:
                    keystates['right']=False
    
        #do something about the key states here, now that the event queue has been processed
        if keystates['up']:
            character.moveUp()  #or whatever your call for these are...
        if keystates['down']:
            character.moveDown()
        if keystates['left']:
            character.moveLeft()
        if keystates['right']:
            character.moveRight()
    
    #gracefully exit pygame here
    pygame.quit()
    

提交回复
热议问题