我是Python的新手,最近我一直致力于在pygame中创建一个小型的太空入侵者风格的游戏。我几乎已经到了尽头,但是如果敌人的船只(阻挡)与我的船(玩家)发生碰撞,发现碰撞,移除我的两艘船并显示一个短的游戏,我想这样做。过"消息。
到目前为止,我有用于检测子弹和敌舰发生碰撞的代码,如果我的船和敌舰发生碰撞,我已经重写了这个代码,但是这个代码只有在我没有射击时才有效,我也必须移动一旦检测到碰撞并且两艘船都消失,我仍然能够从检测到碰撞的位置发射子弹,从一侧到另一侧检测碰撞(碰撞时头部无效)。我不知道为什么会这样。如果有人能帮助我,我肯定会欣赏它。
有问题的代码:
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
答案 0 :(得分:1)
由于您正在使用组,因此您可能希望使用此功能来处理组之间的冲突:
会是这样的(我还没试过你的代码)
pygame.sprite.groupcollide(bullet_list, block_up_list, True, True, collided = None)
如果两个参数为True,则从列表中删除两者。当您学习如何使用groupcollide时,您会注意到它非常有用。
无论如何,在pygame文档中查找函数描述并查看一些示例。 希望有所帮助;)