目标

背景交替滚动的思路确定

显示游戏背景

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 - - 项目实战 - - 游戏背景相关推荐

  1. python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...

    Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...

  2. 《Python爬虫开发与项目实战》——第3章 初识网络爬虫 3.1 网络爬虫概述

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第3章,第3.1节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 初识网 ...

  3. Python 小白从零开始 PyQt5 项目实战(8)汇总篇(完整例程)

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战.不跳过一个细节,不漏掉一行代码,不省略一个例图. 本系列从软件安装.环境配置开始,介绍了基本应 ...

  4. 视频教程-Python疫情监控完整项目实战-Python

    Python疫情监控完整项目实战 数据产品讲师,人工智能探索者,15年一线IT研发经验,国内顶级互联网行业工作背景,社区达人,著有长篇连载<胖子哥的大数据之路>,<数据实践之美> ...

  5. python从入门到项目实战李兴华网盘_贺胜军Python轻松入门到项目实战【经典完整版】...

    贺胜军Python轻松入门到项目实战课程目录 01_Python基本概述 01_计算机组成_操作系统.avi 02_计算机的进制.avi 03_数据存储单位1.avi 04_编码和解码.avi 05_ ...

  6. python爬虫项目实例-Python爬虫开发与项目实战

    Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...

  7. Python 小白从零开始 PyQt5 项目实战(7)折叠侧边栏的实现

    单式状态栏,位于于窗口的左右侧边,可以实现软件功能或目录的导航. 本文详细介绍用 QTreeWidget 部件实现目录结构的折叠侧边栏,与用 QToolBox 部件实现垂直菜单结构的折叠侧边栏,通过案 ...

  8. Python 小白从零开始 PyQt5 项目实战(5)布局管理

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战. 什么叫从零开始?从软件安装.环境配置开始.不跳过一个细节,不漏掉一行代码,不省略一个例图. ...

  9. Python 小白从零开始 PyQt5 项目实战(4)基本控件

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战. 什么叫从零开始?从软件安装.环境配置开始.不跳过一个细节,不漏掉一行代码,不省略一个例图. ...

最新文章

  1. C#启动其他程序的代码
  2. mysql 双冒号_jdk8新特性之双冒号 :: 用法及详解
  3. autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
  4. 【练习】2021下半年数据结构刷题笔记和总结 (三)栈 队列 链表 枚举算法
  5. 电脑内部录音教程Virtual Audio Cable使用教程
  6. kido机器人没反应_机器人不能钩的三个英雄,章鱼妈上榜,钩中图四我方直接团灭!...
  7. L1-040 最佳情侣身高差 (10 分)—团体程序设计天梯赛
  8. PowerShell 远程连接与其它技巧
  9. 价值800新视界影视源码全开源源码
  10. [VS code - SSH Remote] ln: failed to create hard link ... File exists
  11. 双非年薪40W,从字节裸辞了
  12. MER 音乐情感识别-论文笔记7
  13. iOS 面向切面编程与typhoon框架
  14. JS的unshift()和shift()
  15. Ubuntu云服务器搭建饥荒联机版服务器教程
  16. 为什么选择 GPU 云服务器
  17. FUZ-2204-7环形dp
  18. 学位证书,学历证书,毕业证书有什么区别?
  19. 京东2021校园招聘笔试(8.27编程部分)——数据开发工程师(数列变换A了9%)
  20. 7-209 sdut-C语言实验-数位数7-210 sdut-C语言实验-小树快长高

热门文章

  1. 网易数据运河系统NDC设计与应用
  2. php中的active,用ActivePHP打造版本管理系统
  3. DockerFile 入门到精通
  4. Flowable 数据库表结构 ACT_ID_MEMBERSHIP
  5. MySQL在Windows 环境中的安装
  6. vue的transition组件的使用
  7. Java-自定义注解
  8. 华为卡槽打不开怎么办_17500元!华为5G折叠手机刷屏,有人焦虑连夜开会…
  9. java channel源码_Netty 4.0 源码分析(三):Channel和ChannelPipeline
  10. php ios 判断字符串长度,iOStextfield 限制输入字符长度和过滤表情符号