python飞机大战pygame游戏框架搭建操作详解


Posted in Python onDecember 17, 2019

本文实例讲述了python飞机大战pygame游戏框架搭建操作。分享给大家供大家参考,具体如下:

目标

  • 明确主程序职责
  • 实现主程序类
  • 准备游戏精灵组

01. 明确主程序职责

  • 回顾 快速入门案例,一个游戏主程序的 职责 可以分为两个部分:
    • 游戏初始化
    • 游戏循环
  • 根据明确的职责,设计 PlaneGame 类如下:
    python飞机大战pygame游戏框架搭建操作详解
    提示 根据 职责 封装私有方法,可以避免某一个方法的代码写得太过冗长

如果某一个方法编写的太长,既不好阅读,也不好维护!

  • 游戏初始化 —— init() 会调用以下方法:
    python飞机大战pygame游戏框架搭建操作详解
    游戏循环 —— start_game() 会调用以下方法:
    python飞机大战pygame游戏框架搭建操作详解

02. 实现飞机大战主游戏类

2.1 明确文件职责

python飞机大战pygame游戏框架搭建操作详解

  • plane_main
    1. 封装 主游戏类
    2. 创建 游戏对象
    3. 启动游戏
  • plane_sprites
    • 封装游戏中 所有 需要使用的 精灵子类
    • 提供游戏的 相关工具

代码实现

  • 新建 plane_main.py 文件,并且设置为可执行
  • 编写 基础代码
import pygame
from plane_sprites import *


class PlaneGame(object):
  """飞机大战主游戏"""

  def __init__(self):
    print("游戏初始化")

  def start_game(self):
    print("开始游戏...")


if __name__ == '__main__':
  # 创建游戏对象
  game = PlaneGame()

  # 开始游戏
  game.start_game()

2.3 游戏初始化部分

完成 init() 代码如下:

def __init__(self):
  print("游戏初始化")
  
  # 1. 创建游戏的窗口
  self.screen = pygame.display.set_mode((480, 700))
  # 2. 创建游戏的时钟
  self.clock = pygame.time.Clock()
  # 3. 调用私有方法,精灵和精灵组的创建
  self.__create_sprites()

def __create_sprites(self):
  pass

使用 常量 代替固定的数值

  • 常量 —— 不变化的量
  • 变量 —— 可以变化的量

应用场景

  • 在开发时,可能会需要使用 固定的数值,例如 屏幕的高度 是 700
  • 这个时候,建议 不要 直接使用固定数值,而应该使用 常量
  • 在开发时,为了保证代码的可维护性,尽量不要使用 魔法数字

常量的定义

  • 定义 常量 和 定义 变量 的语法完全一样,都是使用 赋值语句
  • 常量 的 命名 应该 所有字母都使用大写,单词与单词之间使用下划线连接

常量的好处

  • 阅读代码时,通过 常量名 见名之意,不需要猜测数字的含义
  • 如果需要 调整值,只需要 修改常量定义 就可以实现 统一修改

提示:Python 中并没有真正意义的常量,只是通过命名的约定 —— 所有字母都是大写的就是常量,开发时不要轻易的修改!

代码调整

  • 在 plane_sprites.py 中增加常量定义
import pygame

# 游戏屏幕大小
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)

修改 plane_main.py 中的窗口大小

self.screen = pygame.display.set_mode(SCREEN_RECT.size)

2.4 游戏循环部分

完成 start_game() 基础代码如下:

def start_game(self):
  """开始游戏"""
  
  print("开始游戏...")
    
  while True:
  
    # 1. 设置刷新帧率
    self.clock.tick(60)
    
    # 2. 事件监听
    self.__event_handler()
    
    # 3. 碰撞检测
    self.__check_collide()
    
    # 4. 更新精灵组
    self.__update_sprites()
    
    # 5. 更新屏幕显示
    pygame.display.update()

def __event_handler(self):
  """事件监听"""
  
  for event in pygame.event.get():
  
    if event.type == pygame.QUIT:
      PlaneGame.__game_over()

def __check_collide(self):
  """碰撞检测"""
  pass

def __update_sprites(self):
  """更新精灵组"""
  pass
  
@staticmethod
def __game_over():
  """游戏结束"""

  print("游戏结束")
  pygame.quit()
  exit()

03. 准备游戏精灵组

3.1 确定精灵组

python飞机大战pygame游戏框架搭建操作详解

3.2 代码实现

创建精灵组方法

def __create_sprites(self):
  """创建精灵组"""
  
  # 背景组
  self.back_group = pygame.sprite.Group()
  # 敌机组
  self.enemy_group = pygame.sprite.Group()
  # 英雄组
  self.hero_group = pygame.sprite.Group()

更新精灵组方法

def __update_sprites(self):
  """更新精灵组"""
  
  for group in [self.back_group, self.enemy_group, self.hero_group]:
  
    group.update()
    group.draw(self.screen)

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

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

Python 相关文章推荐
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
Django实现学员管理系统
Feb 26 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
如何解决django-celery启动后迅速关闭
Oct 16 Python
python从内存地址上加载python对象过程详解
Jan 08 Python
python字符串的index和find的区别详解
Jun 20 Python
python3.x中安装web.py步骤方法
Jun 23 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
五种Python转义表示法
Nov 27 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 Python
使用Python测试Ping主机IP和某端口是否开放的实例
Dec 17 #Python
基于Django实现日志记录报错信息
Dec 17 #Python
python实现12306登录并保存cookie的方法示例
Dec 17 #Python
Django多进程滚动日志问题解决方案
Dec 17 #Python
python django中8000端口被占用的解决
Dec 17 #Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 #Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 #Python
You might like
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
python Django批量导入数据
2016/03/25 Python
代码分析Python地图坐标转换
2018/02/08 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
通过Pandas读取大文件的实例
2018/06/07 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
python常用数据重复项处理方法
2019/11/22 Python
python实现扫雷游戏
2020/03/03 Python
keras得到每层的系数方式
2020/06/15 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
最好的商品表达自己:Cafepress
2019/09/04 全球购物
生产车间主管岗位职责
2013/12/28 职场文书
专题组织生活会方案
2014/06/15 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
Mysql 一主多从的部署
2022/05/20 MySQL
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python