【FlappyBird小游戏】编写游戏逻辑(二)——读取游戏资源【源码】

提示:如果本文对您有帮助,欢迎点赞支持!

文章目录

1、读取图片资源

2、读取音效资源

3、读取游戏资源

4、修改游戏主循环

(1)游戏初始化

(2)游戏帧渲染


在上一篇中,我们已经可以读取图片资源,但是在该游戏中的图片资源非常多,另外还有音效资源,所以这里我们抽取相应方法来统一读取上述游戏资源。

1、读取图片资源

我们要读取的资源是具有透明度的.png文件:

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

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔法攻城狮MRL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值