其他分享
首页 > 其他分享> > 10.pygame-碰撞检测

10.pygame-碰撞检测

作者:互联网

添加并监听英雄发射子弹事件
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,self,子弹,精灵,碰撞检测,pygame,rect
来源: https://www.cnblogs.com/Mickey-7/p/16297623.html