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搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
python通过ftplib登录到ftp服务器的方法
May 08 Python
python创建临时文件夹的方法
Jul 06 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
python中多层嵌套列表的拆分方法
Jul 02 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
对Django的restful用法详解(自带的增删改查)
Aug 28 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 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
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python实现括号匹配的思路详解
2018/08/23 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
详解Django admin高级用法
2019/11/06 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
Python流程控制常用工具详解
2020/02/24 Python
django rest framework 自定义返回方式
2020/07/12 Python
德国网上花店:Valentins
2018/08/15 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
善意的谎言事例
2014/02/15 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
学生党员公开承诺书
2014/05/28 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
求职导师推荐信范文
2015/03/27 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
感恩的心主题班会
2015/08/12 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript