6

好的,所以我正在制作一个基本的宇宙飞船游戏。

我无法让旋转工作,因为它会扰乱位图,但这是另一个问题。我什至应该使用 gif 吗?任何其他文件类型建议?

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

k = pygame.key.get_pressed()

是的,不言自明。这不起作用,因为它会返回按下的每个键。

所以,在其他地方:

d = k[pygame.K_d]

和另一行:

print d

另一个:

if d:

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

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

d 始终为 0。

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

为什么会这样?

4

2 回答 2

7

您可能会对get_pressed()的实际操作感到困惑。从文档:

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

使用此函数获取按钮列表不是处理用户文本输入的正确方法。您无法知道按键的顺序,并且在两次调用 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
于 2013-06-28T19:43:39.303 回答
2

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

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'
于 2013-06-29T04:18:56.940 回答