在pygame中创建连续对象?

时间:2017-05-04 19:07:37

标签: python python-2.7 pygame

好的,所以我对这个话题进行了一些研究。我用Python的Pygame创建了一个游戏,这是着名的" Raiden 2"的复制品。我的游戏循环与我见过的游戏循环非常相似。我正在尝试做的是让构造函数在空格键被保持时创建一个子弹对象(使用我的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)

不知道从哪里开始。任何帮助都是受欢迎和赞赏的。

2 个答案:

答案 0 :(得分:3)

这应该按照您的预期运作:

#!/usr/bin/env python3

您将子弹的创建从事件处理中移除,并且只设置一个"标记"如果释放键,则停止创建子弹。

并且......正如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

答案 1 :(得分:0)

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

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.

与帧速率无关的变体是使用pygame.Clock.tick返回的时间(自上次调用以来经过的时间)并从计时器变量中减去它。如果计时器为<= 0,我们就可以开火了。

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.