python飞机大战pygame游戏之敌机出场实现方法详解


Posted in Python onDecember 17, 2019

本文实例讲述了python飞机大战pygame游戏之敌机出场实现方法。分享给大家供大家参考,具体如下:

目标

使用 定时器 添加敌机

  • 设计 Enemy 类

01. 使用定时器添加敌机

运行 备课代码,观察 敌机的 出现规律:

  1. 游戏启动后,每隔 1 秒 会 出现一架敌机
  2. 每架敌机 向屏幕下方飞行,飞行 速度各不相同
  3. 每架敌机出现的 水平位置 也不尽相同
  4. 当敌机 从屏幕下方飞出,不会再飞回到屏幕中

1.1 定时器

  • 在 pygame 中可以使用 pygame.time.set_timer() 来添加 定时器
  • 所谓 定时器,就是 每隔一段时间,去 执行一些动作
set_timer(eventid, milliseconds) -> None
  • set_timer 可以创建一个 事件
  • 可以在 游戏循环 的 事件监听 方法中捕获到该事件
  • 第 1 个参数 事件代号 需要基于常量 pygame.USEREVENT 来指定
    • USEREVENT 是一个整数,再增加的事件可以使用 USEREVENT + 1 指定,依次类推…
  • 第 2 个参数是 事件触发 间隔的 毫秒值

定时器事件的监听

  • 通过 pygame.event.get() 可以获取当前时刻所有的 事件列表
  • 遍历列表 并且判断 event.type 是否等于 eventid,如果相等,表示 定时器事件 发生

1.2 定义并监听创建敌机的定时器事件

pygame 的 定时器 使用套路非常固定:

  1. 定义 定时器常量 —— eventid
  2. 在 初始化方法 中,调用 set_timer 方法 设置定时器事件
  3. 在 游戏循环 中,监听定时器事件

1) 定义事件

  • 在 plane_sprites.py 的顶部定义 事件常量
# 敌机的定时器事件常量
CREATE_ENEMY_EVENT = pygame.USEREVENT

在 PlaneGame 的 初始化方法 中 创建用户事件

# 4. 设置定时器事件 - 每秒创建一架敌机
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)

2) 监听定时器事件

  • 在 __event_handler 方法中增加以下代码:
def __event_handler(self):
  
  for event in pygame.event.get():
  
    # 判断是否退出游戏
    if event.type == pygame.QUIT:
      PlaneGame.__game_over()
    elif event.type == CREATE_ENEMY_EVENT:
      print("敌机出场...")

02. 设计 Enemy 类

  1. 游戏启动后,每隔 1 秒 会 出现一架敌机
  2. 每架敌机 向屏幕下方飞行,飞行 速度各不相同
  3. 每架敌机出现的 水平位置 也不尽相同
  4. 当敌机 从屏幕下方飞出,不会再飞回到屏幕中
    python飞机大战pygame游戏之敌机出场实现方法详解
  • 初始化方法
    • 指定 敌机图片
    • 随机 敌机的 初始位置 和 初始速度
  • 重写 update() 方法
    • 判断 是否飞出屏幕,如果是,从 精灵组 删除

2.1 敌机类的准备

  • 在 plane_sprites 新建 Enemy 继承自 GameSprite
  • 重写 初始化方法,直接指定 图片名称
  • 暂时 不实现 随机速度 和 随机位置 的指定
  • 重写 update 方法,判断是否飞出屏幕
class Enemy(GameSprite):
  """敌机精灵"""
  
  def __init__(self):
    
    # 1. 调用父类方法,创建敌机精灵,并且指定敌机的图像
    super().__init__("./images/enemy1.png")

    # 2. 设置敌机的随机初始速度

    # 3. 设置敌机的随机初始位置
  
  def update(self):
    
    # 1. 调用父类方法,让敌机在垂直方向运动
    super().update()
    
    # 2. 判断是否飞出屏幕,如果是,需要将敌机从精灵组删除
    if self.rect.y >= SCREEN_RECT.height:
      print("敌机飞出屏幕...")

2.2 创建敌机

演练步骤

  1. 在 __create_sprites,添加 敌机精灵组
    • 敌机是 定时被创建的,因此在初始化方法中,不需要创建敌机
  2. 在 __event_handler,创建敌机,并且 添加到精灵组
    • 调用 精灵组 的 add 方法可以 向精灵组添加精灵
  3. 在 __update_sprites,让 敌机精灵组 调用 update 和 draw 方法
    python飞机大战pygame游戏之敌机出场实现方法详解
    演练代码
  • 修改 plane_main 的 __create_sprites 方法
# 敌机组
self.enemy_group = pygame.sprite.Group()

修改 plane_main 的 __update_sprites 方法

self.enemy_group.update()
self.enemy_group.draw(self.screen)

定时出现敌机

elif event.type == CREATE_ENEMY_EVENT:
  self.enemy_group.add(Enemy())

2.3 随机敌机位置和速度

  1. 导入模块
  • 在导入模块时,建议 按照以下顺序导入
1. 官方标准模块导入
2. 第三方模块导入
3. 应用程序模块导入

修改 plane_sprites.py 增加 random 的导入

import random
  1. 随机位置
    python飞机大战pygame游戏之敌机出场实现方法详解
    使用 pygame.Rect 提供的 bottom 属性,在指定敌机初始位置时,会比较方便
  • bottom = y + height
  • y = bottom - height
  1. 代码实现
  • 修改 初始化方法,随机敌机出现 速度 和 位置
def __init__(self):

  # 1. 调用父类方法,创建敌机精灵,并且指定敌机的图像
  super().__init__("./images/enemy1.png")

  # 2. 设置敌机的随机初始速度 1 ~ 3
  self.speed = random.randint(1, 3)

  # 3. 设置敌机的随机初始位置
  self.rect.bottom = 0
  
  max_x = SCREEN_RECT.width - self.rect.width
  self.rect.x = random.randint(0, max_x)

2.4 移出屏幕销毁敌机

  • 敌机移出屏幕之后,如果 没有撞到英雄,敌机的历史使命已经终结
  • 需要从 敌机组 删除,否则会造成 内存浪费

检测敌机被销毁

  • del 内置方法会在对象被销毁前调用,在开发中,可以用于 判断对象是否被销毁
def __del__(self):
  print("敌机挂了 %s" % self.rect)

代码实现
python飞机大战pygame游戏之敌机出场实现方法详解
判断敌机是否飞出屏幕,如果是,调用 kill() 方法从所有组中删除

def update(self):
  super().update()
  
  # 判断敌机是否移出屏幕
  if self.rect.y >= SCREEN_RECT.height:
    # 将精灵从所有组中删除
    self.kill()

更多关于Python相关内容可查看本站专题:《Python游戏开发技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
Python判断文本中消息重复次数的方法
Apr 27 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Python中有几个关键字
Jun 04 Python
简单了解Django项目应用创建过程
Jul 06 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 #Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 #Python
selenium+Chrome滑动验证码破解二(某某网站)
Dec 17 #Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 #Python
Django app配置多个数据库代码实例
Dec 17 #Python
python关闭占用端口方式
Dec 17 #Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
Dec 17 #Python
You might like
利用PHP创建动态图像
2006/10/09 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
php生成短域名函数
2015/03/23 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
简明json介绍
2008/09/28 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
js创建对象的方式总结
2015/01/10 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
python tornado微信开发入门代码
2018/08/24 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Python 没有main函数的原因
2020/07/10 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
党员三严三实心得体会
2014/10/13 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技