3.发射子弹

碰撞侦测 pygame....

碰撞侦测

blank

pygame.sprite.spritecollide(sprite, group, dokill)函数用于检测给定的单个精灵sprite与指定的精灵组group中的精灵是否发生碰撞。
参数含义
sprite:要检测碰撞的单个精灵。
group:用于检测碰撞的精灵组。
dokill:一个布尔值。若为True,当精灵组中的精灵与给定精灵发生碰撞时,该精灵将从组中移除。
返回值
该函数返回一个列表,列表中包含了精灵组中发生碰撞的所有精灵。如果没有发生碰撞,返回空列表。

添加代码到 游戏循环的 “update” 部分:

# 更新
all_sprites.update()

# 检查是否有敌人击中了玩家。
hits = pygame.sprite.spritecollide(player, mobs, False)
if hits:
    running = False

射击
添加子弹类

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10, 20))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = -10

    def update(self):
        self.rect.y += self.speedy
        # 子弹移出屏幕顶部 删除。
        if self.rect.bottom < 0:
            self.kill()
            
# ...
bullets = pygame.sprite.Group()

添加 按键侦测 Keypress 事件

    for event in pygame.event.get():
        # 检查是否关闭窗口
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()

Player类中添加射击方法 shoot

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

子弹碰撞侦测
pygame.sprite.groupcollide() 函数用于检测 两个精灵组之间碰撞。
pygame.sprite.groupcollide(group1, group2, dokill1, dokill2)
参数含义
dokill1:如果为True,发生碰撞时,group1中对应的精灵将被移除
dokill2:如果为True,发生碰撞时,group2中对应的精灵将被移除。
返回值
该函数返回一个字典。字典的key是group1中发生碰撞的精灵,value是一个列表,包含了group2中与该键对应的精灵发生碰撞的精灵。如果没有发生碰撞,返回的字典为空。

    # 更新
    all_sprites.update()
    # 检查是否有敌人击中了玩家。
    # ....

    # 检查是否有子弹击中敌人。
    hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
    # 敌人删除后 再次添加
    for hit in hits:
        m = Mob()
        all_sprites.add(m)
        mobs.add(m)

完整代码