系列文章目录

目标

·背景简体滚动的思路确定

·显示游戏背景


前言

这一章节是讲述的飞机大战游戏背景的设计思路细节。


一、背景简体滚动的思路确定

·游戏启动后,背景图像 会连续不断的向下移动

·视觉上产生英雄的飞机在不停的向上方移动的错觉——在很多跑酷类游戏中常用的套路

  1. 游戏的背景不断变化
  2. 游戏的主角位置保持不变

1.1   实现思路分析

如图,一共两个背景图像,来回在屏幕上下来回滚动(就和之前英雄飞机出了屏幕上方,立刻就从下方出现的思路是一样的)

方法:

  • 创建两张背景图像精灵

第一张完全和屏幕重合

第二张在屏幕的正上方

  • 两张图像一起向下运动

·self.rect.y += self.speed

  • 当任意背景精灵的 rect.y >= 屏幕的高度 说明已经移动到屏幕的下方
  • 将移动到屏幕下方的这张图像 设置到屏幕的正上方

· rect.y = -rect.height

1.2   设计背景类

·初始化方法

直接指定背景图片

is_alt 判断是否是另一张图像

False 表示第一张图像,需要与屏幕重合

True  表示另一张图像,需要在屏幕的正上方

·update()方法

判断是否移动出屏幕,如果是,将图像设置到屏幕的正上方,从而实现交替滚动

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

派生一个子类,在子类中针对特有的需求,重写父类的方法,并且进行扩展(这里的子类是指新创建的背景类,因为之前设置的精灵类里面的update方法,并不能判断图像是否移出屏幕,所以要重写父类update方法)

下面update 子类方法的重写:

代码:

import pygame# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)# 定义刷新帧率
FRAME_PER_SEC = 60class 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 = speeddef update(self):# 在屏幕的垂直方向上移动self.rect.y += self.speedclass Background(GameSprite):"""游戏背景精灵"""def update(self):# 1.调用父类的方法实现(垂直在屏幕方向向上移动)super().update()# 2.判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.height

二、显示游戏背景

2.1   背景精灵的基本实现

·在plane_sprites新建Backgroud继承自GameSprite(上面已经操作了,就不做详细介绍了)

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

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

操作:

在主程序中,找到之前没有编写完成的 创建精灵的私有方法,添加代码

再滚动到

添加代码

代码:

import pygame
from plane_sprites import *class PlaneGame(object):"""飞机大战主游戏"""def __init__(self):print("游戏初始化")# 1.创建游戏的窗口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.heightself.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):passdef __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)@staticmethoddef __game_over():print("游戏结束")pygame.quit()exit()if __name__ == '__main__':# 创建游戏对象game = PlaneGame()# 启动游戏game.start_game()

输出结果:

虽然我截图是静止状态的,不过通过两张图片陨石所在的位置不同,是可以看出是在滚动的。这样两张背景图就可以自动交替运行了

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

·在主程序中,创建两个背景精灵,传入的相同的图像文件路径

·创建第二个背景精灵是,在主程序,设置背景精灵的图像位置

·根据面向对象设计原则,应该将对象的职责,封装到类的代码内部

·尽量简化程序调用一方的代码调用

·初始化方法:

  1. 直接指定背景图片
  2. Is_alt 判断是否是另外一张图像

False 表示第一张图像,需要与屏幕重合

True  表示另一张图像,需要在屏幕的正上方

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

先回到精灵工具的文件,添加代码:

再回到主程序,把之前的代码修改一下:

运行结果是一样的

现在的代码分别是:

精灵工具文件下

import pygame# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)# 定义刷新帧率
FRAME_PER_SEC = 60class 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 = speeddef update(self):# 在屏幕的垂直方向上移动self.rect.y += self.speedclass Background(GameSprite):"""游戏背景精灵"""def __init__(self, is_alt=False):# 1.调用父类方法实现精灵的创建(images/rect/speed)super().__init__("./images/background.png")# 2.判断是否是交替图像,如果是,需要设置初始位置if is_alt:self.rect.y = -self.rect.heightdef update(self):# 1.调用父类的方法实现(垂直在屏幕方向向上移动)super().update()# 2.判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.height

主程序下:

import pygame
from plane_sprites import *class PlaneGame(object):"""飞机大战主游戏"""def __init__(self):print("游戏初始化")# 1.创建游戏的窗口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):passdef __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)@staticmethoddef __game_over():print("游戏结束")pygame.quit()exit()if __name__ == '__main__':# 创建游戏对象game = PlaneGame()# 启动游戏
game.start_game()

这样修改过后,如果之后要在主程序中继续创建背景精灵,就很容易了,只需要创建一个类名,并且传入是否是交替图像就行。至于背景精灵要显示哪一张图像,就不需要在主程序中修改了。在主程序中,只需要创建精灵对象,再往精灵组里添加就可以了

总结

关于背景图像滚动的思路,其实就是两张一样的图片来回自动滚动,英雄飞机不用动

背景精灵的设计,也是为了简化主程序代码,后期如果在工作中遇到要修改的情况,只需要在精灵工具里面修改就行,并不需要在主程序进行修改

Python学习日记-第二十三天-飞机大战(游戏背景设计思路)相关推荐

  1. Python学习日记-第二十六天-飞机大战(发射子弹和碰撞检测)

    系列文章目录 1.发射子弹 2.碰撞检测 一.发射子弹 1.1   添加发射子弹事件 Pygame的定时器使用套路非常固定: 定义定时器常量--eventtid 在初始化方法中,调用set_timer ...

  2. Python实验,用pygame做飞机大战游戏设计

    飞机大战游戏设计 摘 要:根据课程要求,以及面向对象程序设计的编程思想,在Windows操作系统环境下,运用PyCharm编译程序,以Python语言为开发语言,最终实现飞机大战游戏相应的游戏操作功能 ...

  3. Python学习日记-第二十四天-飞机大战(敌机出场设计)

    系列文章目录 ·使用定时器添加敌机 ·设计Enemy 类 前言 昨天因为有事,所以没有及时更新 一.使用定时器添加敌机 游戏启动后,每隔一秒会出现一架敌机 每架敌机向屏幕下方飞行,飞行速度各不相同 每 ...

  4. Python学习日记(二十三) 类命名空间和组合

    类命名空间 在一个类中它的函数(方法)属于动态属性,直接定义的变量属于静态属性 首先先定义一个类,并在这个类里面加入静态变量.属性等然后将一个对象实例化 class Fighter: #定义一个战机的 ...

  5. Python学习日记-第二十九天-tcp(客户端)

    系列文章目录 tcp介绍 tcp特点 tcp客户端 一.tcp介绍 Tcp协议,传输控制协议是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义 TCP通信需要经过创建 ...

  6. Python学习日记(三十三) Mysql数据库篇 一

    背景 Mysql是一个关系型数据库,由瑞典Mysql AB开发,目前属于Oracle旗下的产品.Mysql是目前最流行的关系型数据库管理系统之一,在WEB方面,Mysql是最好的RDBMS(Relat ...

  7. Python 学习日记第二篇 -- 列表,元组

    一.列表 列表是一个可以包含所以数据类型的对象的位置有序集合,它是可以改变的.    1.列表的序列操作(Python3) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  8. pygame飞机大战游戏背景实现

    飞机大战游戏背景 文章目录 飞机大战游戏背景 一.思路分析 1.目标 2. 实现思路分析 3. 设计背景类 二. 显示游戏背景 1 .背景精灵的基本实现 2 .在 plane_main.py 中显示背 ...

  9. Python学习的第十三天:第二周总结

    文章目录 Python学习的第十三天 random 列表 列表的初步了解 列表的构建 列表的相关运算 列表的操作方法 元组 元组的初步了解 元组的构建 元组的相关运算 元组的应用场景 字符串 字符串的 ...

最新文章

  1. python入门要什么基础-python需要什么基础
  2. Spark源码分析之MemoryManager
  3. Shiro学习总结(10)——Spring集成Shiro
  4. 大数据的分析手段有哪几种
  5. 查询SQL的null与''
  6. 十种日常食物比砒霜还毒!
  7. Atitit.软件与编程语言中的锁机制原理attilax总结
  8. Java中重写与重载的区别
  9. 电压信号与电流信号的转换
  10. Win10任务栏无响应解决方法集锦
  11. R9000P电脑win10系统常用快捷键及使用技巧
  12. 乔治华盛顿大学计算机科学专业,乔治华盛顿大学计算机专业简介
  13. wow服务器维护通告,新一轮大服务器实装公告:4月2日凌晨维护
  14. win7计算机里没有网络图标,Win7网络图标不见了怎么办?Win7系统找回网络图标的方法...
  15. power query 向下填充_Power Query 系列 (12) - Power Query 结构化列应用案例
  16. 《策略驱动型数据中心——ACI技术详解》——1.3 数据中心设计
  17. 华为手机怎么编辑PDF?一款神器轻松搞定
  18. 校招进腾讯,二本没戏了?
  19. 知道这些,seo操作精华也就懂了
  20. iPhone 3G(是iPhone系列中的第二代)

热门文章

  1. 第二章、URL与资源
  2. 《文献笔记》三维血管重建 1-乳房X摄影图像
  3. 高德地图 添加自定义图标
  4. VIMperator介绍
  5. SpringCloud链路追踪SkyWalking-第一章-介绍
  6. TYAN 于Computex2023 展示支持第四代英特尔至强可扩展处理器的新款服务器
  7. CRC-32校验和CRC-32校验代码
  8. 电磁流量计测流工作原理及优缺点
  9. 科大讯飞前端一面(8.26)、二面(9.6)、HR面(9.21)
  10. 贴吧顶贴实战教学,让你在不自觉中学会顶贴的方法论