碰撞侦测
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)
完整代码