【问题标题】:Pygame not emptying list correctlyPygame没有正确清空列表
【发布时间】:2016-05-15 17:44:26
【问题描述】:

我正在制作一个“突围”风格的游戏,我认为能够处理多个球会很有趣。这是我的游戏类中的 run_logic() 函数:

def run_logic(self):

    if not self.game_over:
        self.all_sprites_list.update()

        if self.ball.y > SCREEN_HEIGHT:
            self.ball_list.remove(self.ball)
            self.all_sprites_list.remove(self.ball)

            if len(self.ball_list) == 0:
                self.game_over = True

        bounce_balls = pygame.sprite.spritecollide(self.player, self.ball_list, False)

        if len(bounce_balls) > 0:

            for b in bounce_balls:
                diff = (self.player.rect.x + self.player.width/2) - (b.rect.x + b.width/2)
                b.rect.y = SCREEN_HEIGHT - 50 - b.rect.height
                b.bounce(diff)

        for ball in self.ball_list:

            dead_blocks = pygame.sprite.spritecollide(ball, self.block_list, True)

            if len(dead_blocks) > 0:
                ball.bounce(0)

                power1 = random.randrange(0, 10)
                if power1 == 1:
                    self.ball = Ball(self.level)
                    self.ball_list.add(self.ball)
                    self.all_sprites_list.add(self.ball)

            if len(self.block_list) == 0:
                self.game_over = True
                self.level += 1

如果有帮助,这里是 __init__() 函数:

def __init__(self):

    self.game_over = False

    self.block_list = pygame.sprite.Group()
    self.ball_list = pygame.sprite.Group()
    self.all_sprites_list = pygame.sprite.Group()

    top = 40
    block_height = 30

    for row in range(4):

        for column in range(0, 1):  # 29
            block = Block(BLOCK_COLOUR_LIST[self.level], column * 65 + 6, top)
            self.block_list.add(block)
            self.all_sprites_list.add(block)

        top += block_height + 10

    self.player = Player(self.level)
    self.all_sprites_list.add(self.player)

    self.ball = Ball(self.level)
    self.ball_list.add(self.ball)
    self.all_sprites_list.add(self.ball)

当只有一个球时它工作正常,当它落地时游戏退出。但是一旦产生了多个球(通过击中方块随机产生),无论它们是否都落地,我仍然无法死去。我之前在这里找不到类似的问题,我不知道为什么这不起作用,所以我非常感谢一些帮助。

【问题讨论】:

  • 您将同一个对象 (self.ball) 多次添加到 self.ball_list,但只有在球触底时才将其删除。你的失败条件不会是真的。
  • 对不起,我不明白。这就是我希望它发挥作用的方式:我从一个球开始,然后我大约每击出 10 个挡块就添加一个球。每当其中一个球落地时,游戏首先移除该球,然后检查它是否是最后一个(如果列表为空)。如果是,那么游戏就结束了。这不是正在发生吗?
  • 是的,但是你会生成更多的球,所以当它们被添加到球组时,列表永远不会变空。

标签: python list class pygame breakout


【解决方案1】:

正如 cmets 中已经指出的那样,问题如下:

您只检查存储在 self.ball 中的球是否应该被移除。如果您将更多球添加到列表中,则永远不会检查是否也必须删除这些球,因为它们存储在 self.ball 中。

要修复它,请在循环中更新您的游戏逻辑,在循环中遍历列表中的每个球。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多