是我还是pygame.key.get_pressed()无效?

时间:2013-06-28 19:33:14

标签: python input pygame

好的,所以我正在制作一个基本的太空船游戏。

我不能让旋转工作,因为它扰乱了位图,但那是另一个问题。我应该使用gif吗?任何其他文件类型的建议?

回到这里的实际点,所以:

k = pygame.key.get_pressed()
是的,自我解释。这不起作用,因为它会按下每个键。

所以,其他地方:

d = k[pygame.K_d]

和另一行:

print d

和另一个:

if d:

因此,k会在按下键盘上的每个键时返回。

d无限期地返回0,无论是否按下d。

d始终为0.

因此关于d的陈述永远不会成真。

为什么会这样?

2 个答案:

答案 0 :(得分:7)

您可能会对get_pressed()实际正在做的事感到困惑。来自文档:

  

返回一个   表示每个键的状态的布尔值序列   键盘。使用键常量值来索引数组。真实的价值   表示按下该按钮。

     

使用此功能获取按下的按钮列表不是   处理用户文本输入的正确方法。你无从知晓   按下的按键顺序,快速按键可以完全按下   两次调用pygame.key.get_pressed()之间没有注意到。还有   无法将这些推送的密钥翻译成完全翻译的密钥   人物价值。请参阅事件队列中的pygame.KEYDOWN事件   这个功能。

换句话说,当您调用get_pressed()时,您将获得在调用get_pressed()时键盘状态的表示

例如,让我们说你的游戏中有一秒你调用get_pressed()。你会得到一个列出键盘上所有键的结构,如果按下它们(它们都将是假的)。

在游戏开始后两秒钟,按一个键。如果你看一下你之前看到的相同结构,它仍然会说一切都没有被按下,因为你仍然在看着键盘的状态,就像它是在一秒钟之前。但是,如果再次调用get_pressed(),则会返回一个新的更新结构,这个新结构应该显示该键已被按下。

解决此问题的一种方法是执行以下操作:

while True:
    # Update Stuff
    # Draw Stuff
    state = pygame.key.get_pressed()
    # Now check the keys

现在,您正在获取键盘上的最新信息。

应该注意的一点是,使用上述功能,您可能仍然可能会错过键盘按键。如果更新功能需要很长时间,则可能会按下一个键,然后在足够小的时间内按下键,以便在键关闭时不会调用get_pressed()。

如果这可能是个问题,您可能希望使用事件循环。有点像...

is_moving = False

while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN and event.key == pygame.K_d:
            is_moving = True
        elif event.type == pygame.KEYUP and event.key == pygame.K_d:
            is_moving = False

答案 1 :(得分:1)

对于混合(1)事件和(2)keystate输入,它看起来像

import pygame
from pygame.locals import *

done = False    

while not done:
    for event in pygame.event.get():
        # any other key event input
        if event.type == QUIT:
            done = True        
        elif event.type == KEYDOWN:
            if event.key == K_ESC:
                done = True
            elif event.key == K_F1:
                print "hi world mode"

    # get key current state
    keys = pygame.key.get_pressed()
    if keys[K_SPACE]:
        #repeating fire while held
        fire() 
  

我喜欢KEYDOWN和KEYUP,

您必须轮询事件。你可以做到的一种方法是

while not done:
    for event in pygame.event.get():
        # any other key event input
        if event.type == QUIT:
            done = True        
        elif event.type == KEYDOWN:
            if event.key == K_ESC:
                done = True

    player.handle_event(event)

然后在Player()

def handle_event(self, event):
    if event.type == KEYDOWN:
        if event.key == K_f: print 'Player.f pressed'