Python pygame中的连续对象创建?

Python pygame中的连续对象创建?,python,python-2.7,pygame,Python,Python 2.7,Pygame,好的,我对这个话题做了一些研究。我正在用Python的Pygame创建一个游戏,它是著名的“Raiden 2”的复制品。我的游戏循环与我所见过的非常相似。我要做的是让构造函数在按住空格键的同时创建一个bullet对象(使用我的bullet类)。但是,以下代码仅为每个按键创建一个项目符号。按住按钮不起任何作用,只会创建一个项目符号 while game.play is True: for event in pygame.event.get(): if event.type

好的,我对这个话题做了一些研究。我正在用Python的Pygame创建一个游戏,它是著名的“Raiden 2”的复制品。我的游戏循环与我所见过的非常相似。我要做的是让构造函数在按住空格键的同时创建一个bullet对象(使用我的bullet类)。但是,以下代码仅为每个按键创建一个项目符号。按住按钮不起任何作用,只会创建一个项目符号

while game.play is True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                b = Bullet(x, y)
                bullet_group.add(b)

    bullet_group.draw(screen)

不知道从这里到哪里去。欢迎并感谢您的任何帮助。

这应该能满足您的期望:

addBullets = False
while game.play is True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                addBullets = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_SPACE:
                addBullets = False

    if addBullets: 
        b = Bullet(x, y)
        bullet_group.add(b)

    bullet_group.draw(screen)     
您将项目符号的创建从事件处理中移出,并在其中仅设置一个“标志”,如果释放键停止项目符号的创建,则该标志将被收回

而且。。。正如
jsbueno
在评论中提到的,这也会起作用:


我认为另一个答案是缺乏一个重要的细节。你很可能不想每帧发射一颗子弹,所以你需要一个计时器。最简单的方法是计算帧数,但这样游戏就有帧速率限制(最好不要这样做)


帧速率独立变量是使用
pygame.Clock.tick
返回的时间(自上次调用以来经过的时间)并从计时器变量中减去它。如果计时器是
,那么您希望在每次按键时创建几个项目符号?我认为您正在查找您只查看
KEYDOWN
事件,因此每次按键只会获得一次事件。对于像这样的实时游戏,我喜欢使用,
pygame.key.get_pressed()
@cmd嘿,它很管用!谢谢你帮我。我不知道KEYDOWN不适用于多对象创建…@Minighost不要忘记接受答案以完成问答过程。。。(答案左侧的“V”在单击表示答案已被接受时变为绿色)酷。另一个选项是使用
pygame.key,get_pressed()[pygame.K_SPACE]
来了解函数调用时是否按下了给定的键(在本例中为空格)。哇,有这么多选项。。。我想我会坚持@jsbueno使用get_pressed()的方法。似乎与我的代码一致。非常感谢你们!
while game.play is True:
    for event in pygame.event.get():
       pass # do something with events
    if pygame.key.get_pressed()[pygame.K_SPACE]: 
        b = Bullet(x, y)
        bullet_group.add(b)
firing = False
bullet_timer = 0

while game.play:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game.play = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                firing = True
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_SPACE:
                firing = False

    if bullet_timer > 0:
        bullet_timer -= 1
    elif firing:  # Timer is less than 0 and we're firing.
        bullet = Bullet()
        bullet_group.add(bullet)
        bullet_timer = 10   # Reset timer to 10 frames.
clock = pygame.time.Clock()
firing = False
bullet_timer = 0

while game.play:
    # `dt` is the passed time since the last tick in seconds.
    dt = clock.tick(30) / 1000

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                firing = True
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_SPACE:
                firing = False

    if bullet_timer > 0:
        bullet_timer -= dt
    elif firing:  # Timer is below 0 and we're firing.
        bullet = Bullet()
        bullet_group.add(bullet)
        bullet_timer = .5  # Reset timer to a half second.