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合并字典键值并去除重复元素的实例
Dec 18 Python
vscode 远程调试python的方法
Dec 01 Python
Python内置函数—vars的具体使用方法
Dec 04 Python
读取本地json文件,解析json(实例讲解)
Dec 06 Python
Python实现加载及解析properties配置文件的方法
Mar 29 Python
Python socket实现简单聊天室
Apr 01 Python
python切片及sys.argv[]用法详解
May 25 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
使用python实现画AR模型时序图
Nov 20 Python
python3 求约数的实例
Dec 05 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
python利用 keyboard 库记录键盘事件
Oct 16 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连接access数据库
2008/03/27 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
Yii学习总结之安装配置
2015/02/22 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
js控制淡入淡出示例代码
2013/11/12 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
Python中标准模块importlib详解
2017/04/16 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
python excel和yaml文件的读取封装
2021/01/12 Python
大韩航空官方网站:Korean Air
2017/10/25 全球购物
个人简历自我评价
2014/01/06 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
放假通知范文
2015/04/14 职场文书
国王的演讲观后感
2015/06/03 职场文书
学籍证明模板
2015/06/18 职场文书