学习Python之小练习(飞机大战)(5)
2020-02-03 05:00
1131 查看
背景图像
要做到的效果
- 背景交替滚动
- 显示游戏背景
- 要做到背景不断向下方移动,视觉上形成飞机在往上跑
- 就像很多跑酷类游戏一样
设计飞机大战游戏背景类
- 因为游戏背景需要向下移动,那么需要判断背景图片是否移出游戏屏幕
- 考虑到这个问题,那么需要把两张背景图片纵向连续摆放
- 当下面一张背景图片移出屏幕以后,将它的Y值设置为负的 背景图片的高度
在plane_main.py 中显示游戏精灵
贴上代码 —plane_main.py
# -*- coding: utf-8 -*- 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.height self.back_group = pygame.sprite.Group(bg1, bg2) pass 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() pass 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()
plane_sprites.py
# -*- coding: utf-8 -*- 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.y
接下来对主程序代码进行简化
尽量不要在主程序中出现过于重复和繁琐的代码
在精灵类中的初始化方法进行改造
- 在Background类中判断要设置的背景图片是不是重复图片
- 如果是,则设置初始位置
- 如果不是,则不需要
贴上简化后的代码
# -*- coding: utf-8 -*- 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(is_alt=True) self.back_group = pygame.sprite.Group(bg1, bg2) pass 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() pass 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()
# -*- coding: utf-8 -*- 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.y
动态运行结果 ,有兴趣的小伙伴可以自己运行一下
加油!!!
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 学习Python之小练习(飞机大战)(7)
- 学习Python之小练习(飞机大战)(6)
- 编程语言的学习 ------ python3 循环语句以及列表的练习(购物车小练习优化二)
- Python计算机视觉编程练习8:string 模块学习
- python turtle库的学习总结及练习
- python学习第三章列表的部分课后练习自己尝试的代码
- Python入门学习日志03——运算符、表达式、循环,练习代码片
- Python学习打卡--day19(算法练习:分解质因数等)
- 笨方法学习Python 习题25:更多更多的练习
- Python(编程小白的第一本 Python 入门书) 学习笔记2——代码练习
- 基于Python的opencv学习练习(七)oust二值化+高斯滤波
- Python学习笔记: 第五章课后习题练习
- 递归函数 分类: python基础学习 python 小练习 2013-12-12 17:51 278人阅读 评论(0) 收藏
- Python学习打卡--day24(算法练习:计算球第10次落下反弹高度)
- 基于Python的opencv学习练习(十三)直方图绘制
- Python-学习-小例子练习
- python学习练习提高网址
- python学习之正则表达式练习:编写一个计算器
- python学习文件操作练习
- python学习第九章类部分课后练习自己尝试的代码