当前位置: 首页 > 知识库问答 >
问题:

Pygame-on碰撞没有检测到

禄星腾
2023-03-14

我对Python非常陌生,最近我一直致力于在pyplay中创建一个小型的太空入侵者风格的游戏。然而,我几乎已经到达了终点,我想让它这样,如果敌人的船(块)与我的船(玩家)相撞,碰撞被检测到,移除我的两艘船并显示一个简短的“游戏结束”信息。

到目前为止,我有探测子弹和敌舰碰撞的代码,我重写了这个代码,如果我的船和敌舰碰撞,但是这个代码只有在我不开枪的情况下才有效,我也必须从一边移动到另一边为了检测到碰撞(正面碰撞什么也不做),一旦检测到碰撞,两艘船都消失了,我仍然能够从检测到碰撞的位置发射子弹。我不知道为什么会这样。如果有人能帮我,我一定会很感激的。

以下是相关代码:

for i in range(15):
    block = Block(BLACK)
    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(55) # change to 155 collisions fixed
    block_list.add(block)
    all_sprites_list.add(block)

for i in range(1):
    player = Player()
    player.rect.y = 480
    player_list.add(player)
    all_sprites_list.add(player)

...

    for player in player_list:

        player_hit_list = pygame.sprite.spritecollide(block, player_list, True)

        for player in player_hit_list:
            gameover.play()
            player_list.remove(player)
            all_sprites_list.remove(player)
            block_list.remove(block)
            all_sprites_list.remove(block)

     for bullet in bullet_list:

        block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True)

        for block in block_hit_list:
            explosion.play()
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)
            score += 10

我现在已经设法让碰撞正确地检测到,但是一旦船只消失(由于碰撞),我仍然能够开火。一旦发生碰撞,有没有办法隐藏子弹?

这是我的更新代码:

for i in range(15):
    block = Block(BLACK)
    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(55) # change to 155 collisions fixed
    block_list.add(block)
    all_sprites_list.add(block)

for i in range(1):
    player = Player()
    player.rect.y = 480
    player_list.add(player)
    all_sprites_list.add(player)

...

    for player in player_list:

        block_hit_list = pygame.sprite.spritecollide(player, block_list, True)

        for block in block_hit_list:
            gameover.play()
            player_list.remove(player)
            all_sprites_list.remove(player)
            block_list.remove(block)
            all_sprites_list.remove(block)

     for bullet in bullet_list:

        block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True)

        for block in block_hit_list:
            explosion.play()
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)
            score += 10

共有1个答案

郭思聪
2023-03-14

由于您正在使用组,您可能希望使用此函数来处理组之间的冲突:

会是这样的(我没试过你的代码)

pygame.sprite.groupcollide(bullet_list,block_up_list,真,真,碰撞=无)

如果两个参数都为True,则从列表中删除这两个参数。当您学习如何使用groupcollide时,您会注意到它非常有用。

无论如何,在pygame文档中查找函数描述并查看一些示例。希望有帮助;)

 类似资料:
  • 所以我试图用Python和Pyplay创建一个益智平台游戏,但是我遇到了一点麻烦。当我为主要角色使用单点图像,而不是矩形图像时,如何制作碰撞检测器?我知道直角图像有左、右、顶部和底部像素功能(这对冲突检测非常有用),但是对于单片图像有这样的功能吗?或者我只需要为x和y坐标创建一个变量图像的宽度/高度?我试过用那个 但是catImg一直在通过窗户的尽头。我做错了什么?提前谢谢。

  • 我已经有一段时间了。我正在尝试用PyGame制作一个游戏,我到达了碰撞段,已经被卡住了一段时间,并且检查了一些线程。 这是我的代码(删除了中间的其他方法和条件语句,但保留了相关部分)。我对这个错误有点困惑,因为我在两个类init中都self.imageRect=self.image.get_rect(),但是我有这个错误。当程序试图在dog类中执行冲突检测部分时,该错误具体为: "属性错误:'Pe

  • 在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义。 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列(按帧组成的序列),如下图所示: 图1:动作逐帧分解图 如果将逐帧分解后的动作,按照一定的频率播放,那么就形成了

  • 我正在编写我的第一个Pyplay游戏。我试图进行冲突检测,但有时会奏效- 我尝试使用实际上我使用 这是我的碰撞代码: 我除了当我触摸尖峰,启动功能,但只是有时工作。

  • 我正在制作一个游戏,在这个游戏中,你可以用精灵跳跃,障碍物正在向你移动。我制作了一个精灵面具,并试图使用精灵碰撞功能,但什么也没发生:为了检查是否发生碰撞,我做了一个简单的打印语句。我试着将玩家精灵与自己碰撞,碰撞成功了。所以我在困惑什么是缺失或错误。 背景图片 玩家图片 障碍物图片

  • 我画了一个旋转的矩形,我需要检查它是否碰撞。整个班级: 这是碰撞函数: 这就是我得到的: 我认为这已经足够了,因为它每次都会随着旋转位置的更新来检测碰撞,但是似乎我必须使用分离轴定理,你能帮助我吗?