10.pygame-碰撞检测

2022-12-19,,,

添加并监听英雄发射子弹事件

class Hero(GameSprite):
def __init__(self):
# 调用父类方法,设置image
super().__init__('./images/me1.png', 0)
# 设置英雄的初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom - 120 # 创建子弹精灵组
self.bullets = pygame.sprite.Group() # 重写父类方法,实现左右移动
def update(self):
# 英雄在水平方向移动
self.rect.x += self.speed
# 控制不能离开屏幕
# 判断x 小于0 的时候,将x设为0
if self.rect.x < 0:
self.rect.x = 0
# right = x + 窗口宽度 = 右侧
elif self.rect.right > SCREEN_RECT.right:
self.rect.right = SCREEN_RECT.right # 发射子弹
def fire(self):
for i in (0, 1, 2):
# 创建子弹精灵
bullet = Bullet() # 设置子弹精灵位置
bullet.rect.bottom = self.rect.y - i * 20
bullet.rect.centerx = self.rect.centerx
# 添加精灵组
self.bullets.add(bullet)
# 英雄发射子弹事件,因为创建敌机已经用了,所以我们在基础上+1
HREO_FIRE_EVENT = pygame.USEREVENT + 1
# 设置定时器事件 -- 发射子弹
pygame.time.set_timer(HREO_FIRE_EVENT,500) #监听事件
elif event.type == HREO_FIRE_EVENT: #判断是否发射子弹事件
self.hero.fire() #调用发射子弹方法 # 更新绘制发射子弹精灵组
self.hero.bullets.update()
self.hero.bullets.draw(self.screen)

定义子弹类

class Bullet(GameSprite):
def __init__(self):
# 设置子弹图片和初始速度
super().__init__('./images/bullet1.png', -2) def update(self):
# 调用父类方法,让子弹垂直方向飞行
super().update()
# 判断子弹是否飞出屏幕
if self.rect.bottom < 0:
self.kill()

 
碰撞检测
两个精灵组中所有精灵的碰撞检测

pygame.sprite.groupcollide(group1,gorup2,dokill1,dokill2,collided=None)
"""
如果将dokill设置为True,则发生碰撞的精灵将被自动移除
collided参数用于计算碰撞的回调函数,如果没有指定,则每个精灵必须有一个rect属性
"""
# 私有方法-碰撞监测
def __check_collide(self):
#传入子弹精灵组合敌机精灵组,任意发生碰撞则销毁
pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)

某个精灵和指定精灵组中的精灵碰撞检查

pygame.sprite.spritecollide(sprite,group,dokill,collided=None) -> Sprite_list
"""
如果dokill设置为True,则指定精灵组中发生碰撞的精灵自动移除
collided返回值是一个列表,是精灵组中和精灵发生碰撞的精灵
"""
# 敌机撞毁英雄
enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
# 判断enemies是否有内容
if enemies:
#销毁英雄飞机
self.hero.kill()
self.__game_over() # 游戏结束

10.pygame-碰撞检测的相关教程结束。

《10.pygame-碰撞检测.doc》

下载本文的Word格式文档,以方便收藏与打印。