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利用beautifulSoup实现爬虫
Sep 29 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
python实现数据图表
Jul 29 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
python中下标和切片的使用方法解析
Aug 27 Python
python创建学生成绩管理系统
Nov 22 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
Python使用configparser库读取配置文件
Feb 22 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 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连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
详解python单例模式与metaclass
2016/01/15 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
python 系统调用的实例详解
2017/07/11 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
台湾旅游网站:灿星旅游
2018/10/11 全球购物
What is EJB
2016/07/22 面试题
教师对学生的评语
2014/04/28 职场文书
建筑管理专业求职信
2014/07/28 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL