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

前端 未结 4 461
心在旅途
心在旅途 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:54

    My guess is that set repeat doesn't work the way that you think it will. Basically, after your second key goes up, the repeat doesn't happen. This would seem to make sense to me: open up a text editor and hold down the "A" key. "A"s will spill out across the screen. Then, press the "J" key with the "A" key still held down. The "A"s stop. That is a typical key repeat system.

    I'm not sure using this "set_repeat" method is going to work out in the end anyway. Basically, any key that the player presses will now "repeat", even if they click "fire" or "jump".

    As an alternative, try saving the state when the user presses or releases. Don't use the set_repeat, but do something like the following:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if pygame.key.get_pressed()[K_LEFT]:
                player.moving_left = True
            if pygame.key.get_pressed()[K_RIGHT]:
                player.moving_right = True
            if pygame.key.get_pressed()[K_UP]:
                player.moving_up = True
            if pygame.key.get_pressed()[K_DOWN]:
                player.moving_down = True
        elif event.type == KEYUP:
            if pygame.key.get_pressed()[K_LEFT]:
                player.moving_left = False
            if pygame.key.get_pressed()[K_RIGHT]:
                player.moving_right = False
            if pygame.key.get_pressed()[K_UP]:
                player.moving_up = False
            if pygame.key.get_pressed()[K_DOWN]:
                player.moving_down = False
    
    # Somewhere else in your game loop...
    if player.moving_left:
        player.pos[0] -= 2
    if player.moving_right:
        player.pos[0] += 2
    if player.moving_up:
        player.pos[1] -= 2
    if player.moving_right:
        player.pos[1] += 2
    

提交回复
热议问题