python项目选择背景_Python - - 项目实战 - - 游戏背景
目标
背景交替滚动的思路确定
显示游戏背景
01,背景交替滚动的思路确定
运行 备课代码,观察 背景图像的显示效果:
游戏启动后,背景图像 会 连续不断地 向下方 移动
在 视觉上 产生英雄的飞机不断向上方飞行的 错觉 - - 在很多跑酷游戏中常用的套路
游戏的背景 不断变化
游戏的主角 位置保持不变
1.1 实现思路分析
解决方法
1,创建两张背景图像精灵
第 1 张 完全和屏幕重合
第 2 张在 屏幕的正上方
2,两张图像 一起向下方运动
self.rect.y += self.speed
3,当 任意背景精灵 的 rect.y >= 屏幕的高度 说明已经 移动到屏幕下方
4,将 移动到屏幕下方的这张图像 设置到 屏幕的正上方
rect.y = -rect.height
1.2 设计背景类
初始化方法
直接指定 背景图片
is_alt 判断是否是另一张图像
False 表示 第一张图像,需要与屏幕适合
True 表示 另一张图像,在屏幕的正上方
update() 方法
-判断 是否移动出屏幕,如果是,将图像设置到 屏幕的正上方,从而实现 交替滚动
继承 如果是父类提供的方法,不能满足子类的需求:
派生一个子类
在子类中针对特有的需求,重写父类方法,并且进行扩展
02,显示游戏背景
2.1 背景精灵的基本实现
在 plane_sprites 新建 Background 继承自 GameSprite
plane_sprites.py
import pygame
# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新的帧率
FRAME_PER_SEC = 60
class GameSprite(pygame.sprite.Sprite):
"""飞机大战游戏精灵"""
def __init__(self, image_name, speed=1):
# 调用父类的初始化方法
super().__init__()
# 定义对象的属性
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
def update(self, *args):
# 在屏幕的垂直方向上移动
self.rect.y += self.speed
class Background(GameSprite):
"""游戏背景精灵"""
def update(self, *args):
# 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 __update_sprites(self):
self.back_group.update()
self.back_group.draw(self.screen)
plane_main.py
import pygame
from Aircraft_War.plane_sprites import *
class PlaneGame(object):
"""飞机大战主游戏"""
def __init__(self):
print("游戏初始化")
# 1,创建游戏的窗口
# self.screen = pygame.display.set_mode((480, 700))
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
# 2,创建游戏的时钟
self.clock = pygame.time.Clock()
# 3,调用私有方法, 精灵和精灵组的创建
self.__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)
def start_game(self):
print("游戏开始...")
while True:
# 1,设置刷新帧率
self.clock.tick(FRAME_PER_SEC)
# 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):
self.back_group.update()
self.back_group.draw(self.screen)
@staticmethod
def __game_over():
print("游戏结束")
pygame.QUIT()
exit()
if __name__ == ‘__main__‘:
# 创建游戏对象
game = PlaneGame()
# 启动游戏
game.start_game()
2.3 利用初始化方法,简化背景精灵创建
思考 - - 上一小节完成的代码存在什么问题?是否可以简化?
在主程序中,创建的 两个背景精灵,传入了相同的图像文件路径
创建 第二个 背景精灵 时,在主程序中,设置背景精灵的图像位置
思考 - - 精灵 初始位置 的设置,应该 由主程序负责? 还是 由精灵自己负责
答案 - - 由精灵自己负责
根据面向对象设计原则,应该将对象的职责,封装到类的代码内部
尽量简化程序调用一方的代码调用
初始化方法
直接指定 背景图片
is_alt 判断是否是另一张图像
False 表示 第一张图像,需要与屏幕重合
True 表示 另一张图像,在屏幕的正上方
在 plane_sprites.py 中实现 Background 的
plane_sprites.py
import pygame
# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新的帧率
FRAME_PER_SEC = 60
class GameSprite(pygame.sprite.Sprite):
"""飞机大战游戏精灵"""
def __init__(self, image_name, speed=1):
# 调用父类的初始化方法
super().__init__()
# 定义对象的属性
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
def update(self, *args):
# 在屏幕的垂直方向上移动
self.rect.y += self.speed
class Background(GameSprite):
"""游戏背景精灵"""
def __init__(self, is_alt=False):
# 1,调用父类方法实现精灵的创建(image/rect/speed)
super().__init__("./images/background.png")
# 2,判断是否交替图像,如果是,需要设置初始位置
if is_alt:
self.rect.y = -self.rect.height
def update(self, *args):
# 1,调用父类的方法实现
super().update()
# 2,判断是否移除屏幕,如果移出屏幕,将图像设置到屏幕上方
if self.rect.y >= SCREEN_RECT.height:
self.rect.y = -self.rect.height
plane_main.py
import pygame
from Aircraft_War.plane_sprites import *
class PlaneGame(object):
"""飞机大战主游戏"""
def __init__(self):
print("游戏初始化")
# 1,创建游戏的窗口
# self.screen = pygame.display.set_mode((480, 700))
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
# 2,创建游戏的时钟
self.clock = pygame.time.Clock()
# 3,调用私有方法, 精灵和精灵组的创建
self.__create_sprites()
def __create_sprites(self):
bg1 = Background()
bg2 = Background(True)
self.back_group = pygame.sprite.Group(bg1, bg2)
def start_game(self):
print("游戏开始...")
while True:
# 1,设置刷新帧率
self.clock.tick(FRAME_PER_SEC)
# 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):
self.back_group.update()
self.back_group.draw(self.screen)
@staticmethod
def __game_over():
print("游戏结束")
pygame.QUIT()
exit()
if __name__ == ‘__main__‘:
# 创建游戏对象
game = PlaneGame()
# 启动游戏
game.start_game()
python项目选择背景_Python - - 项目实战 - - 游戏背景相关推荐
- python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...
Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...
- 《Python爬虫开发与项目实战》——第3章 初识网络爬虫 3.1 网络爬虫概述
本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第3章,第3.1节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 初识网 ...
- Python 小白从零开始 PyQt5 项目实战(8)汇总篇(完整例程)
本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战.不跳过一个细节,不漏掉一行代码,不省略一个例图. 本系列从软件安装.环境配置开始,介绍了基本应 ...
- 视频教程-Python疫情监控完整项目实战-Python
Python疫情监控完整项目实战 数据产品讲师,人工智能探索者,15年一线IT研发经验,国内顶级互联网行业工作背景,社区达人,著有长篇连载<胖子哥的大数据之路>,<数据实践之美> ...
- python从入门到项目实战李兴华网盘_贺胜军Python轻松入门到项目实战【经典完整版】...
贺胜军Python轻松入门到项目实战课程目录 01_Python基本概述 01_计算机组成_操作系统.avi 02_计算机的进制.avi 03_数据存储单位1.avi 04_编码和解码.avi 05_ ...
- python爬虫项目实例-Python爬虫开发与项目实战
Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...
- Python 小白从零开始 PyQt5 项目实战(7)折叠侧边栏的实现
单式状态栏,位于于窗口的左右侧边,可以实现软件功能或目录的导航. 本文详细介绍用 QTreeWidget 部件实现目录结构的折叠侧边栏,与用 QToolBox 部件实现垂直菜单结构的折叠侧边栏,通过案 ...
- Python 小白从零开始 PyQt5 项目实战(5)布局管理
本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战. 什么叫从零开始?从软件安装.环境配置开始.不跳过一个细节,不漏掉一行代码,不省略一个例图. ...
- Python 小白从零开始 PyQt5 项目实战(4)基本控件
本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战. 什么叫从零开始?从软件安装.环境配置开始.不跳过一个细节,不漏掉一行代码,不省略一个例图. ...
最新文章
- C#启动其他程序的代码
- mysql 双冒号_jdk8新特性之双冒号 :: 用法及详解
- autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
- 【练习】2021下半年数据结构刷题笔记和总结 (三)栈 队列 链表 枚举算法
- 电脑内部录音教程Virtual Audio Cable使用教程
- kido机器人没反应_机器人不能钩的三个英雄,章鱼妈上榜,钩中图四我方直接团灭!...
- L1-040 最佳情侣身高差 (10 分)—团体程序设计天梯赛
- PowerShell 远程连接与其它技巧
- 价值800新视界影视源码全开源源码
- [VS code - SSH Remote] ln: failed to create hard link ... File exists
- 双非年薪40W,从字节裸辞了
- MER 音乐情感识别-论文笔记7
- iOS 面向切面编程与typhoon框架
- JS的unshift()和shift()
- Ubuntu云服务器搭建饥荒联机版服务器教程
- 为什么选择 GPU 云服务器
- FUZ-2204-7环形dp
- 学位证书,学历证书,毕业证书有什么区别?
- 京东2021校园招聘笔试(8.27编程部分)——数据开发工程师(数列变换A了9%)
- 7-209 sdut-C语言实验-数位数7-210 sdut-C语言实验-小树快长高
热门文章
- 网易数据运河系统NDC设计与应用
- php中的active,用ActivePHP打造版本管理系统
- DockerFile 入门到精通
- Flowable 数据库表结构 ACT_ID_MEMBERSHIP
- MySQL在Windows 环境中的安装
- vue的transition组件的使用
- Java-自定义注解
- 华为卡槽打不开怎么办_17500元!华为5G折叠手机刷屏,有人焦虑连夜开会…
- java channel源码_Netty 4.0 源码分析(三):Channel和ChannelPipeline
- php ios 判断字符串长度,iOStextfield 限制输入字符长度和过滤表情符号