Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get keyboard input in pygame?

I am making a game in pygame 1.9.2. It's a faily simple game in which a ship moves between five columns of bad guys who attack by moving slowly downward. I am attempting to make it so that the ship moves left and right with the left and right arrow keys. Here is my code:

keys=pygame.key.get_pressed() if keys[K_LEFT]:     location-=1     if location==-1:         location=0 if keys[K_RIGHT]:     location+=1     if location==5:         location=4 

It works too well. The ship moves too fast. It is near impossible to have it move only one location, left or right. How can i make it so the ship only moves once every time the key is pressed?

like image 501
Dan G. Avatar asked Apr 16 '13 18:04

Dan G.


People also ask

What pygame key event is use to ask if the keyboard is pressed?

KEYDOWN and pygame. KEYUP events when the keyboard buttons are pressed and released. Both events have key and mod attributes.

How do you write text in pygame?

Pygame does not provide a direct way to write text onto a Surface object. The method render() must be used to create a Surface object from the text, which then can be blit to the screen. The method render() can only render single lines. A newline character is not rendered.


1 Answers

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)

like image 199
Haz Avatar answered Sep 25 '22 00:09

Haz