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 相关文章推荐
Python os模块介绍
Nov 30 Python
python实现二分查找算法
Sep 21 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
Python读取YUV文件,并显示的方法
Dec 04 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
python实现批量注册网站用户的示例
Feb 22 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 Python
用Python仅20行代码编写一个简单的端口扫描器
Apr 08 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的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
javascript new后的constructor属性
2010/08/05 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
python 实现汉诺塔游戏
2020/11/28 Python
JPA面试常见问题
2016/11/14 面试题
土木工程毕业生推荐信
2013/10/28 职场文书
室内设计专业自荐信
2014/05/31 职场文书
2014国庆节标语口号
2014/09/19 职场文书
公司证明怎么写
2014/09/22 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
2015年校长新年寄语
2014/12/08 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
总结Python使用过程中的bug
2021/06/18 Python