python飞机大战pygame游戏背景设计详解


Posted in Python onDecember 17, 2019

本文实例讲述了python飞机大战pygame游戏背景设计。分享给大家供大家参考,具体如下:

目标

背景交替滚动的思路确定

  • 显示游戏背景

01. 背景交替滚动的思路确定

运行 备课代码,观察 背景图像的显示效果:

  • 游戏启动后,背景图像 会 连续不断地 向下方 移动
  • 在 视觉上 产生英雄的飞机不断向上方飞行的 错觉 —— 在很多跑酷类游戏中常用的套路
    • 游戏的背景 不断变化
    • 游戏的主角 位置保持不变

1.1 实现思路分析

python飞机大战pygame游戏背景设计详解
解决办法

  1. 创建两张背景图像精灵
    • 第 1 张 完全和屏幕重合
    • 第 2 张在 屏幕的正上方
  2. 两张图像 一起向下方运动
    • self.rect.y += self.speed
  3. 当 任意背景精灵 的 rect.y >= 屏幕的高度 说明已经 移动到屏幕下方
  4. 将 移动到屏幕下方的这张图像 设置到 屏幕的正上方
    • rect.y = -rect.height

1.2 设计背景类

python飞机大战pygame游戏背景设计详解

  • 初始化方法
    • 直接指定 背景图片
    • is_alt 判断是否是另一张图像
      • False 表示 第一张图像,需要与屏幕重合
      • True 表示 另一张图像,在屏幕的正上方
  • update() 方法
    • 判断 是否移动出屏幕,如果是,将图像设置到 屏幕的正上方,从而实现 交替滚动

继承 如果父类提供的方法,不能满足子类的需求:

  • 派生一个子类
  • 在子类中针对特有的需求,重写父类方法,并且进行扩展

02. 显示游戏背景

2.1 背景精灵的基本实现

  • 在 plane_sprites 新建 Background 继承自 GameSprite
class Background(GameSprite):
  """游戏背景精灵"""

  def update(self):

    # 1. 调用父类的方法实现
    super().update()

    # 2. 判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕的上方
    if self.rect.y >= SCREEN_RECT.height:
      self.rect.y = -self.rect.height

2.2 在 plane_main.py 中显示背景精灵

  1. 在 __create_sprites 方法中创建 精灵 和 精灵组
  2. 在 __update_sprites 方法中,让 精灵组 调用 update() 和 draw() 方法

__create_sprites 方法

def __create_sprites(self):

  # 创建背景精灵和精灵组
  bg1 = Background("./images/background.png")
  bg2 = Background("./images/background.png")
  bg2.rect.y = -bg2.rect.height
  
  self.back_group = pygame.sprite.Group(bg1, bg2)

__update_sprites 方法

def __update_sprites(self):

  self.back_group.update()
  self.back_group.draw(self.screen)

2.3 利用初始化方法,简化背景精灵创建

思考 —— 上一小结完成的代码存在什么样的问题?能否简化?

  • 在主程序中,创建的两个背景精灵,传入了相同的图像文件路径
  • 创建 第二个 背景精灵 时,在主程序中,设置背景精灵的图像位置

思考 —— 精灵 初始位置 的设置,应该 由主程序负责?还是 由精灵自己负责?

答案 —— 由精灵自己负责

  • 根据面向对象设计原则,应该将对象的职责,封装到类的代码内部
  • 尽量简化程序调用一方的代码调用

python飞机大战pygame游戏背景设计详解

  • 初始化方法
    • 直接指定 背景图片
    • is_alt 判断是否是另一张图像
      • False 表示 第一张图像,需要与屏幕重合
      • True 表示 另一张图像,在屏幕的正上方

在 plane_sprites.py 中实现 Background 的 初始化方法

def __init__(self, is_alt=False):

  image_name = "./images/background.png"
  super().__init__(image_name)
    
  # 判断是否交替图片,如果是,将图片设置到屏幕顶部
  if is_alt:
    self.rect.y = -self.rect.height

修改 plane_main 的 __create_sprites 方法

# 创建背景精灵和精灵组
bg1 = Background()
bg2 = Background(True)

self.back_group = pygame.sprite.Group(bg1, bg2)

更多关于Python相关内容可查看本站专题:《Python游戏开发技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python中的yield使用方法
Feb 11 Python
Python中使用logging模块代替print(logging简明指南)
Jul 09 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
在Python 中同一个类两个函数间变量的调用方法
Jan 31 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
Python字典添加,删除,查询等相关操作方法详解
Feb 07 Python
python 链接sqlserver 写接口实例
Mar 11 Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
python实现名片管理器的示例代码
Dec 17 #Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 #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
You might like
php函数之子字符串替换 str_replace
2011/03/23 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
Exitjs获取DataView中图片文件名
2009/11/26 Javascript
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
js的onload事件及初始化按钮事件示例代码
2013/09/25 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
python中input()与raw_input()的区别分析
2016/02/27 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
消防安全责任书范本
2014/04/15 职场文书
作风年建设汇报材料
2014/08/14 职场文书
律师催款函范文
2015/06/24 职场文书
小组组名及励志口号
2015/12/24 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
goland 设置project gopath的操作
2021/05/06 Golang