You can get the events from pygame and then watch out for the
KEYDOWN event, instead of looking at the keys returned by
get_pressed()(which gives you keys that are currently pressed down, whereas the
KEYDOWN event shows you which keys were pressed down on that frame).
What’s happening with your code right now is that if your game is rendering at 30fps, and you hold down the left arrow key for half a second, you’re updating the location 15 times.
events = pygame.event.get() for event in events: if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: location -= 1 if event.key == pygame.K_RIGHT: location += 1
To support continuous movement while a key is being held down, you would have to establish some sort of limitation, either based on a forced maximum frame rate of the game loop or by a counter which only allows you to move every so many ticks of the loop.
move_ticker = 0 keys=pygame.key.get_pressed() if keys[K_LEFT]: if move_ticker == 0: move_ticker = 10 location -= 1 if location == -1: location = 0 if keys[K_RIGHT]: if move_ticker == 0: move_ticker = 10 location+=1 if location == 5: location = 4
Then somewhere during the game loop you would do something like this:
if move_ticker > 0: move_ticker -= 1
This would only let you move once every 10 frames (so if you move, the ticker gets set to 10, and after 10 frames it will allow you to move again)