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月前
|
存储 Java C语言
【python】——使用嵌套列表实现游戏角色管理
【python】——使用嵌套列表实现游戏角色管理
37 0
|
1月前
|
人工智能 数据可视化 机器人
【Python】Python实现五子棋游戏(带可视化界面)【独一无二】
【Python】Python实现五子棋游戏(带可视化界面)【独一无二】
|
1月前
|
存储 人工智能 算法
【Python】Yahtzee(掷骰子游戏)模拟程序【独一无二】
【Python】Yahtzee(掷骰子游戏)模拟程序【独一无二】
|
4天前
|
存储 监控 Python
python 检测文件大小并定期删除
python 检测文件大小并定期删除
9 1
|
10天前
|
机器学习/深度学习 算法 数据可视化
Python用KNN(K-近邻)回归、分类、异常值检测预测房价、最优K值选取、误差评估可视化
Python用KNN(K-近邻)回归、分类、异常值检测预测房价、最优K值选取、误差评估可视化
|
12天前
|
数据采集 关系型数据库 BI
Python路面平整度检测车辆数据——速度修正
Python路面平整度检测车辆数据——速度修正
|
17天前
|
存储 Python
Python 一步一步教你用pyglet制作“彩色方块连连看”游戏
Python 一步一步教你用pyglet制作“彩色方块连连看”游戏
38 0
|
17天前
|
算法 Python
Python 一步一步教你用pyglet制作汉诺塔游戏
Python 一步一步教你用pyglet制作汉诺塔游戏
29 0
|
22天前
|
数据采集 存储 安全
python检测代理ip是否可用的方法
python检测代理ip是否可用的方法
|
23天前
|
API Python
怎么使用python检测代理IP是否有效
怎么使用python检测代理IP是否有效