Python:飞机大战游戏7:发射子弹以及碰撞检测

简介: Python:飞机大战游戏7:发射子弹以及碰撞检测

image.png


一、发射子弹



  • 1.1、回顾一下英雄发射子弹的需求
  • (1)、游戏启动后,英雄 出现在屏幕的 水平中间 位置,距离屏幕底部 120像素
  • (2)、英雄 每隔 0.5 秒 发射一次子弹,每次 连发三枚子弹
  • (3)、英雄 默认不会移动,需要通过 左/右 方向键,控制 英雄 在水平方向移动
  • 1.2、添加发射子弹事件pygame  的 定时器 使用套路非常固定
  • (1)、定义 定时器 常量 --- eventid
  • (2)、在 初始化方法 中,调用 set_timer 方法 设置定时器事件
  • (3)、在 英雄循环 中,监听定时器事件
  • 代码实现: 在hero 中定义 fire 方法


def fire(self):
       print("发射子弹")
  • 定义英雄发射子弹事件
# 定义英雄发射子弹事件常量(创建敌机的定时器常量)
HERO_FIRE_EVENT = pygame.USEREVENT + 1
  • 初始化方法 中,调用 set_timer 方法 设置定时器事件


# 5、设置英雄发射子弹定时器事件(每0.5秒发射一次子弹)
pygame.time.set_timer(CREATE_HERO_FIRE_EVENT, 500)
  • 英雄循环 中,监听定时器事件


elif event.type == CREATE_HERO_FIRE_EVENT:
         # 英雄发射子弹
         self.hero.fire()
  • 1.3、定义子弹类
  • 对子弹的需求:
  • 子弹 从英雄 的正上方发射 沿直线上方 飞行
  • 飞出屏幕后,需要从 精灵组 中删除
  • Bullet - 子弹类
  • 初始化方法: 指定子弹的 图片 和初始速度 = -2向上飞


def __init__(self):
     super().__init__("./images/bullet1.png",-2)
  • 重写 update() 方法:判断子弹是否飞出了屏幕,如果是:把子弹从子弹的精灵组删除


# 判断子弹是否从屏幕顶部飞出去
if self.rect.bottom < 0:
      # 从子弹精灵组删除子弹
      self.kill()
  • 1.4、发射子弹
  • Hero 的初始化方法中创建 子弹精灵组 属性


# 3、定义子弹的精灵组
self.bullets_group = pygame.sprite.Group()
  • 修改 plan_main.py__update_sprites 方法,让子弹精灵组 调用 updatedraw来显示子弹


# update - 让组中的所有精灵更新位置
self.hero.bullets_group.update()
# draw - 在screen上绘制所有的精灵
self.hero.bullets_group.draw(self.screen)
  • 实现 fire() 方法,并且利用元组循环一次创建三个子弹精灵组


def fire(self):
      print("发射子弹")
      for i in (0,1,2):
             # 1、创建子弹精灵
             bullet = Bullet()
             # 2、设置精灵的位置
             bullet.rect.x = self.rect.centerx
             bullet.rect.y = self.rect.y - i * 20 - 5
             # 3、将精灵添加到精灵组
             self.bullets_group.add(bullet)


二、碰撞检测



  • 2.1、了解碰撞检测方法
  • pygame 提供了 两个非常方便 的方法可以实现碰撞检测:
  • (1)、pygame.sprite.groupcollide()
  • 两个精灵组所有的精灵 的碰撞检测


pygame.sprite.groupcollide(group1,group2,dokill1,dokill2,collided = None) -> Sprite_dic
  • 如果将 dokill 设置为 True ,则发生碰撞的精灵将被自动移除,dokill1是与group1关联的,dokill2是与group2关联的;collided 参数是用于 计算碰撞的回调函数,如果没有指定,则每一个精灵必须有一个 rect属性
  • (2)、pygame.sprite.spritecollide()
  • 判断 某个精灵指定精灵组 中的精灵的碰撞(sprite是某一个独立的精灵,group与dokill是绑定的)


pygame.sprite.spritecollide(sprite,group,dokill,collided = None) -> Sprite_list
  • 如果将 dokill 设置为 true,则 指定精灵组方式碰撞的精灵将被自动移除
  • collided 参数是用于 计算碰撞的回调函数,如果没有指定,则每个精灵必有一个 rect 属性
  • 返回 精灵组  中跟 精灵 发生碰撞的 精灵列表(可以根据列表是否有值来判断精灵的去留)
  • 2.2、碰撞的实现


def __check_collide(self):
     print("碰撞检测")
     # 1、子弹摧毁敌机
     pygame.sprite.groupcollide(self.hero.bullets_group,self.enemy_group,True,True)
      # 2、敌机撞毁英雄
      enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
      if len(enemies) > 0:
          # 让英雄牺牲
          self.hero.kill()
          # 游戏结束
          self.__game_over()


目录
相关文章
|
2月前
|
机器学习/深度学习 数据采集 算法
时间序列结构变化分析:Python实现时间序列变化点检测
在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。
181 1
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:智能质量检测与控制
使用Python实现深度学习模型:智能质量检测与控制 【10月更文挑战第8天】
174 62
使用Python实现深度学习模型:智能质量检测与控制
|
16天前
|
机器学习/深度学习 PyTorch TensorFlow
使用Python实现智能食品质量检测的深度学习模型
使用Python实现智能食品质量检测的深度学习模型
61 1
|
1月前
|
IDE 开发工具 Python
Python扑克游戏编程---摸大点
Python扑克游戏编程---摸大点
|
2月前
|
Docker Python 容器
python检测docker compose文件是否正确
python检测docker compose文件是否正确
|
2月前
|
机器学习/深度学习 数据采集 网络安全
使用Python实现深度学习模型:智能网络安全威胁检测
使用Python实现深度学习模型:智能网络安全威胁检测
210 5
|
2月前
|
编解码 Python Windows
python有没有包 可以检测 这个视频是否可以播放
python有没有包 可以检测 这个视频是否可以播放
|
2月前
|
Python
python编写下象棋游戏|4-14
python编写下象棋游戏|4-14
|
1月前
|
运维 安全 网络协议
Python 网络编程:端口检测与IP解析
本文介绍了使用Python进行网络编程的两个重要技能:检查端口状态和根据IP地址解析主机名。通过`socket`库实现端口扫描和主机名解析的功能,并提供了详细的示例代码。文章最后还展示了如何整合这两部分代码,实现一个简单的命令行端口扫描器,适用于网络故障排查和安全审计。
|
1月前
|
数据处理 Python
Python读取大文件的“坑“与内存占用检测
Python读取大文件的“坑“与内存占用检测
48 0