(六)通过pygame让游戏背景图像实现交替滚动

您所在的位置:网站首页 怎样不让桌面壁纸移动起来 (六)通过pygame让游戏背景图像实现交替滚动

(六)通过pygame让游戏背景图像实现交替滚动

2024-07-16 08:05:51| 来源: 网络整理| 查看: 265

python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解pygame中的精灵和精灵组 (五)通过pygame搭建游戏框架 (六)通过pygame让游戏背景图像实现交替滚动 (七)通过pygame来设置飞机大战中 敌机 的速度、位置等 (八)通过pygame来操控游戏人物的移动 (九)通过pygame使游戏人物发射子弹 (十)通过pygame来进行碰撞检测

文章目录 原理解决办法具体代码改进

原理

在游戏中,需要如何将游戏的背景实现交替滚动?

利用运动是相对的

游戏启动后,背景图像会连续不断地向下方移动,在视觉上就会产生英雄的飞机不断向上方飞行的错觉,这在很多跑酷类游戏中是常见的

如果只是单单一张背景图向下移动,如下图所示,可以看到,如果只是一张背景图向下移动的话,那么游戏主界面上方就会出现没有背景图的情况(红色区域)

在这里插入图片描述 那么要怎么解决这个问题呢??

用两张一样的背景图,另一张叠放在屏幕的正上方(如下图)

在这里插入图片描述

让两张背景图像同时向下移动,那么上文所说的“红色区域”就会被“暂时”遮住,但是在第1张背景图完全移出背景图像之后,第2张背景就又会产生没有背景图的情况 在这里插入图片描述 那么怎么解决这个问题呢? 当第一张图像完全移出屏幕后,立马又移到第二张图像的正上方,这样循环,周而复始,就可以实现背景图的循环滚动了 在这里插入图片描述

解决办法 创建两张背景图像精灵,第一张完全和图像屏幕重合,第二张在屏幕的正上方两张图一起向下方运动:self.rect.y += self.speed当任意背景精灵的 rect.y >= 屏幕高度 说明已经完全移出了屏幕将移动到屏幕下方的这张图像设置到屏幕的正上方 rect.y = -rect.height(将y值设置成图像高度的负值) 具体代码

因为之前的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.height

plane_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)

上面的代码中,创建的两个背景精灵,传入了相同的图像文件路径,精灵的初始位置应该由精灵自己负责,而不是由主程序负责。

根据面向对象设计原则,应该将对象的职责,封装到类的代码内部尽量简化程序调用一方的代码调用

在这里插入图片描述 is_alt判断是否是另一张图像

False 表示第一张图像,需要与屏幕重合True 表示另一张图像,在屏幕正上方

修改后的代码为:

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.height

plane_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()


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭