如何每秒只获得一次密钥输入? (或延迟两个键盘输入之间的时间)

问题描述:

在pygame的,我使用的功能“pressed_key”如何每秒只获得一次密钥输入? (或延迟两个键盘输入之间的时间)

这是我的代码:

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

但是当我按它只有一次做到这一点, “基数”上涨了200点。我想知道是否有办法增加两次录入之间的时间?

感谢您的帮助!

(PS我真的不知道如何寻找类似的问题在这个问题上,我再次希望这不是复制的。但如果是这样,让我知道,我会删除这个问题。谢谢!)

我希望您对pygame有足够的了解,以便使用clock

(为简单起见,我们会说会是一秒所需的时间间隔)

一个简单的解决办法是只检查输入的每一秒,使用一个简单的计数器和pygame的时钟。

首先关闭你的主循环以外的时钟和计数器,。 另外,添加一个布尔变量来确定在这秒钟内是否按下了键。

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

然后在主循环中,你要做的第一件事是增加计数器,然后tick the clock

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

然后是你有你的代码,if声明,看看是否按钮被按下第二个:

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

最后,在你的主循环的末尾,添加一个检查切换布尔not_pressed回真正的每秒:

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

这应该允许该程序只需要从用户每秒一次输入。 要更改间隔,只需更改if counter == FRAMERATE:一行。

  • if counter == FRAMERATE:会在1秒钟
  • if counter == (FRAMERATE*2):将是2秒
  • if counter == int(FRAMERATE/4):将是第二个*

*四分之一注意 - 请确保您打开FRAMERATE由许多分,变成一个整数,要么使用周围的分区使用int(),要么使用整数除法:(FRAMERATE//4)

有关类似示例以了解所有内容如何适用,请参阅this answer

+0

好吧,现在的问题其实更加复杂。现在我需要上,下,左,右键重复禁用,但只有“y”键才能够重复功能。这是可能的,bcz y就像接受购买的东西,但其他键是移动。非常感谢! – windsound 2012-08-15 13:47:55

+1

@windsound只要你有'if'语句来处理'if not_pressed'外的其他键,它们会在你按下它们时作出反应。如果你喜欢,你可以把'not_pressed'改成'y_not_pressed'。 – hammythepig 2012-08-15 13:56:03

+0

@hammythebig有道理,但现在的问题是我的其他键不工作。我现在不能移动我的角色。你有其他的方式来聊天,我想更多地了解clock.tick功能。非常感谢! – windsound 2012-08-15 16:02:57

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

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

也:

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

另一种方式再次接受之前,让你接受了“按键”的时间,并等待:

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()返回自纪元以来的时间,以秒为单位的浮点数。这个时代是时间开始的地方。当年的1月1日,0时,“时代以来的时间”为零。对于Unix,这个时代是1970年。

知道,你现在正在获取时间与上一次保存时间: now-lasttime。
当此增量大于间隔时间时,您可以继续活动,不要忘记更新您的上次变量。

+0

好吧,现在的问题其实更加复杂。现在我需要上,下,左,右键重复禁用,但只有“y”键才能够重复功能。这是可能的,bcz y就像接受购买的东西,但其他键是移动。非常感谢! – windsound 2012-08-15 13:37:38

+1

使用列表中的键使其成为“for”:“用于[K_UP,K_LEFT,K_DOWN,K_RIGHT]中的键:如果pressed pressed keys [key]:#code”,则还可以包含具有回调的另一个列表(key_list,func_list):如果pressed pressed keys [key]:func()#call相应的函数“,funclist是[func_up,func_left ...] with是” def func_up():#code“ 在Python文档中搜索”zip“语法。 – 2012-08-15 15:21:05

另请参阅:Pygame: key.get_pressed() does not coincide with the event queue在按住键的情况下使用重复移动。对这些键使用状态轮询效果更好。