提示:如果本文对您有帮助,欢迎点赞支持!
文章目录
在上一篇中,我们已经可以读取图片资源,但是在该游戏中的图片资源非常多,另外还有音效资源,所以这里我们抽取相应方法来统一读取上述游戏资源。
1、读取图片资源
我们要读取的资源是具有透明度的.png文件:
我们将读取的图片文件资源放在一个字典中,如下图:
SPRITES_PATH = 'assets/sprites/' # 精灵图片资源路径
def load_sprites():
IMAGES = {} # 图片资源
# 背景图片路径
BACKGROUND_PATH = SPRITES_PATH+'background-black.png'
# 地面图片路径
BASE_PATH = SPRITES_PATH+'base.png'
# 管道图片路径
PIPE_PATH = SPRITES_PATH+'pipe-green.png'
# 展示分数的数字图片路径
IMAGES['numbers'] = (
pygame.image.load(SPRITES_PATH+'0.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'1.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'2.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'3.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'4.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'5.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'6.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'7.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'8.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'9.png').convert_alpha()
)
# 读取背景图片路径
IMAGES['background'] = pygame.image.load(BACKGROUND_PATH).convert()
# 地面图片路径
IMAGES['base'] = pygame.image.load(BASE_PATH).convert_alpha()
# 读取管道图片路径
IMAGES['pipe'] = (
pygame.transform.rotate(
pygame.image.load(PIPE_PATH).convert_alpha(), 180),
pygame.image.load(PIPE_PATH).convert_alpha(),
)
# 读取玩家图片路径
IMAGES['player'] = (
pygame.image.load(SPRITES_PATH+'redbird-upflap.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'redbird-midflap.png').convert_alpha(),
pygame.image.load(SPRITES_PATH+'redbird-downflap.png').convert_alpha(),
)
return IMAGES
需要注意的是:
(1)我们在读取背景图片时,使用了 image = pygame.image.load(image).convert() 的显示效果,这是因为背景图片是一个纯黑背景图片,所以不需要设置透明效果,而其他需要读取透明效果的,我们使用了image = pygame.image.load(image).convert_alpha()。
其中 convert_alpha相对于convert,保留了图像的Alpha 通道信息,可以认为是保留了透明的部分,实现了透明转换。
(2)管道图片的读取,我们读取了一个旋转180度的上管道图片数据和原来的下管道图片数据。
2、读取音效资源
def load_sounds():
SOUNDS = {} # 音效资源
# 音效
if 'win' in sys.platform:
soundExt = '.wav'
else:
soundExt = '.ogg'
SOUNDS['die'] = pygame.mixer.Sound(SOUNDS_PATH+'die' + soundExt)
SOUNDS['hit'] = pygame.mixer.Sound(SOUNDS_PATH+'hit' + soundExt)
SOUNDS['point'] = pygame.mixer.Sound(SOUNDS_PATH+'point' + soundExt)
SOUNDS['swoosh'] = pygame.mixer.Sound(SOUNDS_PATH+'swoosh' + soundExt)
SOUNDS['wing'] = pygame.mixer.Sound(SOUNDS_PATH+'wing' + soundExt)
return SOUNDS
3、读取游戏资源
def load():
IMAGES = load_sprites() # 图片资源
SOUNDS = load_sounds() # 音效资源
return IMAGES, SOUNDS
4、修改游戏主循环
(1)游戏初始化
import sys
import pygame
import flappy_bird_utils as tool
FPS = 30 # 刷新频率
SCREENWIDTH = 288 # 屏幕宽度
SCREENHEIGHT = 512 # 屏幕高度
class Flappy_Bird_Env(object):
def __init__(self):
# 初始化窗口
pygame.init() # 初始化游戏,即初始化pygame的各个子模块
self.clock = pygame.time.Clock() # 创建时钟对象,可以控制游戏循环频率
self.screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT)) # 创建游戏窗口(SCREENWIDTH*SCREENHEIGHT)
pygame.display.set_caption('Flappy Bird by MRL') # 设置窗口标题,默认为‘pygame window’
# 定义一些常量
self.IMAGES, self.SOUNDS = tool.load() # 加载游戏资源
# 背景图片相关设置
self.BACKGROUND_WIDTH = self.IMAGES['background'].get_width()
# 地面图片相关设置
self.BASEX = 0 # 地面图片的x坐标
self.BASEY = SCREENHEIGHT * 0.79 # 地面图片的y坐标
self.baseShift = self.IMAGES['base'].get_width() - self.BACKGROUND_WIDTH # 地面图片多余出的x距离,用来实现移动效果
注意:我们将图片导入的函数load()放在了同目录下的flappy_bird_utils.py中
(2)游戏帧渲染
经过上述整理后,我们的帧渲染函数变为:
def frame_step(self,input_actions):
pygame.event.pump() # 让pygame采取默认的事件操作
# 计算地面x坐标,实现移动效果
self.BASEX = -((-self.BASEX + 100) % self.baseShift)
# 绘制背景图像
self.screen.blit(self.IMAGES['background'], (0, 0)) # 背景,元组参数表示绘制位置,也可以通过Rect矩形类来表示位置
# 绘制地面图像
self.screen.blit(self.IMAGES['base'], (self.BASEX, self.BASEY)) # 地面
# 更新游戏窗口
pygame.display.update()
# 指定循环频率
self.clock.tick(FPS)
return