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网站验证码识别
Jan 25 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
python中cPickle类使用方法详解
Aug 27 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
python TF-IDF算法实现文本关键词提取
May 29 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
使用Python实现牛顿法求极值
Feb 10 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
字典算法实现及操作 --python(实用)
Mar 31 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
用PHP查询域名状态whois的类
2006/11/25 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
php实现简单的上传进度条
2015/11/17 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
利用python求积分的实例
2019/07/03 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
python中常用的数据结构介绍
2021/01/12 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
南威尔士家居商店:Leekes
2016/10/25 全球购物
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
中专毕业生求职简历的自我评价
2013/10/21 职场文书
学生出入校管理制度
2014/01/16 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
2015大一新生军训感言
2015/08/01 职场文书
公司保密管理制度
2015/08/04 职场文书
Win11快速关闭所有广告推荐
2022/04/19 数码科技
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS