ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

10.pygame-碰撞检测

2022-05-22 13:01:30  阅读:163  来源: 互联网

标签:__ 10 self 子弹 精灵 碰撞检测 pygame rect


添加并监听英雄发射子弹事件
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有