windsound
windsound

Reputation: 666

How to only get a key entry once per second? (or delay the time in between two keyboard entry)

In pygame, I am using function "pressed_key"

This is my Code:

if(pressed_keys[K_y]):
    base += 10;

But when I do it by pressing it only once, the "base" increased 200ish. I want to know if there is a way to increase the time between two entry?

Thanks for helping!

(p.s. I really dont know how to search similar questions on this question. I hope this is not duplicate. But in case it is, let me know. I will delete this question. Thanks again!)

Upvotes: 1

Views: 2272

Answers (3)

ninMonkey
ninMonkey

Reputation: 7511

See also: Pygame: key.get_pressed() does not coincide with the event queue To use repeated movement while key is held down. Using state polling for those keys works better.

Upvotes: 0

hammythepig
hammythepig

Reputation: 957

I hope you know enough about pygame to use a clock.

(For simplicity's sake we'll say the time interval required will be one second)

A simple solution would be to only check for input every second, using a simple counter and the pygame clock.

First off start the clock and the counter, outside of your main loop. Also, add a boolean variable to determine if the key was pressed within this second.

FRAMERATE = 30 #(The framerate used in this example is 30 FPS)
clock = pygame.time.Clock()
counter = 0
not_pressed = True

Then inside the main loop, the first thing you do is increase the counter, then tick the clock.

while argument:
    counter+=1
    clock.tick(FRAMERATE)

Then were you have your code, an if statement to see if the button has been pressed this second:

if not_pressed:
    if(pressed_keys[K_y]):
        not_pressed=False
        base += 10
#Rest of code:
if(pressed_keys[K_up]):

Finally, at the end of your main loop, add a checker to switch the boolean not_pressed back to True every second:

if counter == FRAMERATE:
    counter=0
    not_pressed=True

That should allow the program to only take input from the user once every second. To change the interval, simply change the if counter == FRAMERATE: line.

  • if counter == FRAMERATE: would be 1 Second
  • if counter == (FRAMERATE*2): would be 2 Seconds
  • if counter == int(FRAMERATE/4): would be a quarter of a second*

*note- make sure you turn FRAMERATE divided by a number, into an integer, either by using int() surrounding the division, or by using integer division: (FRAMERATE//4)

For a similar example to see how everything fits, see this answer.

Upvotes: 1

Not a privileged user
Not a privileged user

Reputation: 963

Here http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat

pygame.key.set_repeat(delay, interval): return None

also:

pygame.key.get_pressed()[K_y]: return bool

another way is to get the time you accepted the "key pressing" ,and wait before accepting it again:

import time
interval = 100 #you set your interval in miliseconds
lasttime = 0

while 1:
    draw() #draw routine
    events() #another events
    now = time.time() #save in one variable if you are going to test against more than one, reducing the number of time.time() calls
    if(pressed_keys[K_y] and (now-lasttime)>interval):
        lasttime = now
        base += 10

time.time() Return the time in seconds since the epoch as a floating point number. The epoch is the point where the time starts. On January 1st of that year, at 0 hours, the “time since the epoch” is zero. For Unix, the epoch is 1970.

knowing that, you are getting the time right now against the lasttime you saved it: now-lasttime.
When this delta is more than the interval, you are allowed to continue your event, don't forget to update your lasttime variable.

Upvotes: 2

Related Questions