2013-08-28 45 views
0

我试图让按钮BOOL切换,而不是因为它只是使它关闭和开启(真和假)每帧如果按键被按下。pygame - 试图切换一个BOOL时,按下键,而不是按下

这里是我的小拨动代码

if key[pygame.K_z] and robsHouse.pressed == False: 
     robsHouse.pressed = True 
    elif key[pygame.K_z] and robsHouse.pressed == True: 
     robsHouse.pressed = False 

任何意见将是有益的,谢谢。

+0

是实际嵌套在if语句中的elif,还是只在复制代码时出错?因为如果elif在if内,那么会导致问题。 – Chachmu

回答

0

您需要切换KEYDOWNKEYUP事件。

+0

他没有_need_来切换'KEYDOWN'和'KEYUP'。这只是这样做的一种方式。 'pygame.key'模块允许检索布尔值数组(每个可能的键为1)。通常不会鼓励这种方法,因为您会错过在帧之间发生的快速击键,但是某些应用程序可能不需要知道事件的发生。 – Haz

0

所以,这个布尔值会在按下按钮时改变,是否正确? 只需使用KEYUP事件和反向变量:

if event == KEYUP: 
    if event.key == DESIRED_KEY: 
     boolVar = not boolVar 
0

当您按住按键,你的代码切换robsHouse.pressed每一帧的原因是因为key[pygame.K_z]条件将得到满足每个循环迭代时,键盘会下来,然后第二个条件将导致交替的帧相互满足。

不改变您检索关键数据的方式,你可以做这样的事情:

if key[pygame.K_z]: 
    robsHouse.pressed = True 
else: 
    robsHouse.pressed = False 

另一种方法是找到pygame中的事件模块KEYUPKEYDOWN事件,而不是从密钥获取关键数据模块。可以做这样的:

for event in pygame.event.get(): 
    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_z: 
      robsHouse.pressed = True 
    elif event.type == pygame.KEYUP: 
     if event.key == pygame.K_z: 
      robsHouse.pressed = False 

就个人而言,我更喜欢在大多数情况下,第二种方法。无论如何,您将需要从pygame的事件模块处理事件,否则队列将会填满,程序将无响应(这在pygame事件模块文档中提到过)。