在上一篇中,我们已经可以读取图片资源,但是在该游戏中的图片资源非常多,另外还有音效资源,所以这里我们抽取相应方法来统一读取上述游戏资源。
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 SOUNDS3、读取游戏资源
def load(): IMAGES = load_sprites() # 图片资源 SOUNDS = load_sounds() # 音效资源 return IMAGES, SOUNDS4、修改游戏主循环
(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
图片来源:http://www.hp91.cn/ 页游