(六)通过pygame让游戏背景图像实现交替滚动 |
您所在的位置:网站首页 › 怎样不让桌面壁纸移动起来 › (六)通过pygame让游戏背景图像实现交替滚动 |
python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解pygame中的精灵和精灵组 (五)通过pygame搭建游戏框架 (六)通过pygame让游戏背景图像实现交替滚动 (七)通过pygame来设置飞机大战中 敌机 的速度、位置等 (八)通过pygame来操控游戏人物的移动 (九)通过pygame使游戏人物发射子弹 (十)通过pygame来进行碰撞检测 文章目录 原理解决办法具体代码改进 原理在游戏中,需要如何将游戏的背景实现交替滚动? 利用运动是相对的游戏启动后,背景图像会连续不断地向下方移动,在视觉上就会产生英雄的飞机不断向上方飞行的错觉,这在很多跑酷类游戏中是常见的 如果只是单单一张背景图向下移动,如下图所示,可以看到,如果只是一张背景图向下移动的话,那么游戏主界面上方就会出现没有背景图的情况(红色区域)
让两张背景图像同时向下移动,那么上文所说的“红色区域”就会被“暂时”遮住,但是在第1张背景图完全移出背景图像之后,第2张背景就又会产生没有背景图的情况 因为之前的GameSprite类中的update方法只是让游戏精灵的y值跟游戏精灵的速度进行了相加,但是并没有根据精灵移出屏幕进行判断,我们想要的是当一个图像移出屏幕之后,将图像再移动到屏幕的正上方,从而实现交替滚动 所以如果在继承中,父类提供的方法不能满足子类的需求,我们需要怎么做? 从父类中派生出一个子类在子类中针对特有的需求,重写父类方法,对父类的方法进行扩展我们可以派生出一个背景类,在背景类中重写update方法 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): #在屏幕垂直方向上移动 self.rect.y += self.speed class Background(GameSprite): """游戏背景精灵""" def update(self): #调用父类的方法实现:垂直移动 super().update() #判断是否移出屏幕,若移出屏幕,应该将图像设置到图像上方 if self.rect.y >= SCREEN_RECT.height: self.rect.y = -self.rect.heightplane_main.py 代码为: import pygame from plane_sprites import * class PlaneGame(object): """飞机大战主游戏""" def __init__(self): print("游戏初始化") #创建游戏窗口 self.screen = pygame.display.set_mode(SCREEN_RECT.size) #创建游戏的时钟 self.clock = pygame.time.Clock() #调用私有方法,精灵和精灵组的创建 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: #设置刷新帧率 self.clock.tick(FRAME_PER_SEC) #事件监听 self.__event_handler() #碰撞检测 self.__check_collide() #更新/绘制精灵组 self.__update_sprites() #更新显示 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() 改进 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)上面的代码中,创建的两个背景精灵,传入了相同的图像文件路径,精灵的初始位置应该由精灵自己负责,而不是由主程序负责。 根据面向对象设计原则,应该将对象的职责,封装到类的代码内部尽量简化程序调用一方的代码调用
修改后的代码为: class Background(GameSprite): """游戏背景精灵""" def __init__(self, is_alt=False): # 调用父类方法实现精灵的创建(image/rect/speed) super().__init__("./images/background.png") # 判断是否是交替图像,如果是,需要设置初始位置 if is_alt: self.rect.y = -self.rect.height def update(self): #调用父类的方法实现:垂直移动 super().update() #判断是否移出屏幕,若移出屏幕,应该将图像设置到图像上方 if self.rect.y >= SCREEN_RECT.height: self.rect.y = -self.rect.height def __create_sprites(self): #创建背景精灵和精灵组 bg1 = Background() bg2 = Background(is_alt=True) self.back_group = pygame.sprite.Group(bg1, bg2)完整代码如下: 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): #在屏幕垂直方向上移动 self.rect.y += self.speed class Background(GameSprite): """游戏背景精灵""" def __init__(self, is_alt=False): # 调用父类方法实现精灵的创建(image/rect/speed) super().__init__("./images/background.png") # 判断是否是交替图像,如果是,需要设置初始位置 if is_alt: self.rect.y = -self.rect.height def update(self): #调用父类的方法实现:垂直移动 super().update() #判断是否移出屏幕,若移出屏幕,应该将图像设置到图像上方 if self.rect.y >= SCREEN_RECT.height: self.rect.y = -self.rect.heightplane_main.py import pygame from plane_sprites import * class PlaneGame(object): """飞机大战主游戏""" def __init__(self): print("游戏初始化") #创建游戏窗口 self.screen = pygame.display.set_mode(SCREEN_RECT.size) #创建游戏的时钟 self.clock = pygame.time.Clock() #调用私有方法,精灵和精灵组的创建 self.__create_sprites() def __create_sprites(self): #创建背景精灵和精灵组 bg1 = Background() bg2 = Background(is_alt=True) self.back_group = pygame.sprite.Group(bg1, bg2) def start_game(self): print("游戏开始") while True: #设置刷新帧率 self.clock.tick(FRAME_PER_SEC) #事件监听 self.__event_handler() #碰撞检测 self.__check_collide() #更新/绘制精灵组 self.__update_sprites() #更新显示 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() |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |