如何每秒只获得一次密钥输入? (或延迟两个键盘输入之间的时间)
在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。
这里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。
当此增量大于间隔时间时,您可以继续活动,不要忘记更新您的上次变量。
好吧,现在的问题其实更加复杂。现在我需要上,下,左,右键重复禁用,但只有“y”键才能够重复功能。这是可能的,bcz y就像接受购买的东西,但其他键是移动。非常感谢! – windsound 2012-08-15 13:37:38
使用列表中的键使其成为“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在按住键的情况下使用重复移动。对这些键使用状态轮询效果更好。
好吧,现在的问题其实更加复杂。现在我需要上,下,左,右键重复禁用,但只有“y”键才能够重复功能。这是可能的,bcz y就像接受购买的东西,但其他键是移动。非常感谢! – windsound 2012-08-15 13:47:55
@windsound只要你有'if'语句来处理'if not_pressed'外的其他键,它们会在你按下它们时作出反应。如果你喜欢,你可以把'not_pressed'改成'y_not_pressed'。 – hammythepig 2012-08-15 13:56:03
@hammythebig有道理,但现在的问题是我的其他键不工作。我现在不能移动我的角色。你有其他的方式来聊天,我想更多地了解clock.tick功能。非常感谢! – windsound 2012-08-15 16:02:57