88.播放声音和音效

简介: 88.播放声音和音效

怎么播放声音


播放音效:pygame.mixer.Sound()


播放音效我们使用 mixer 模块,在使用之前,需要先生成一个 Sound 对象,对这个 Sound 对象进行控制,Sound 对象 的 play() 方法就是播放音效,稍候我们来讲这些方法。


播放背景音乐:pygame.mixer.music


播放背景音乐我们使用 music 模块,music 模块和 mixer 模块是紧密关联的。



music 模块 方法如下:



代码:


from pygame.locals import *
import pygame
import sys
def main():
    pygame.init()        # 初始化游戏
    pygame.mixer.init()  # 初始化混音器模块(可以不写,上面初始化已经包含了,最好写上)
    pygame.mixer.music.load("bg_music.ogg")   # 加载背景音乐
    pygame.mixer.music.set_volume(0.1)      # 设置背景音乐音量0.2
    pygame.mixer.music.play()               # 播放音乐
    cat_sound = pygame.mixer.Sound("cat.wav")    # 加载点击鼠标左键发生的音乐
    cat_sound.set_volume(0.2)                  # 设置音量
    dog_sound = pygame.mixer.Sound("dog.wav")    # 加载点击鼠标右键发生的音乐
    dog_sound.set_volume(0.2)                  # 设置音量
    bg_size = width, height = 500, 450          # 设置窗口
    screen = pygame.display.set_mode(bg_size)   # 设置屏幕
    pygame.display.set_caption("music-demo")    # 窗口名
    pause = False
    pause_image = pygame.image.load("pause.png").convert_alpha()      # 加载暂停播放图片
    unpause_image = pygame.image.load("unpause.png").convert_alpha()  # 加载继续播放图片
    pause_rect = pause_image.get_rect()  # 得到暂停图片的矩形尺寸
    # 设置矩形的左边界和上边界
    pause_rect.left, pause_rect.top = (width - pause_rect.width) // 2, (height - pause_rect.height) // 2
    clock = pygame.time.Clock()  # 设置帧率需要
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:  # 如果鼠标按下
                if event.button == 1:    # 如果按下的是鼠标左键,1左键,2中间键,3右键
                    cat_sound.play()     # 播放hole_music
                elif event.button == 3:  # 如果按下的是鼠标右键
                    dog_sound.play()     # 播放laugh_music
            elif event.type == pygame.KEYDOWN:   # 如果键盘按下:
                if event.key == pygame.K_SPACE:  # 如果按下的是空格且 flag == 0
                    pause = not pause            # 暂停变为True
        # 窗口背景白色
        screen.fill((255, 255, 255))
        if pause:
            screen.blit(pause_image, pause_rect)    # 记载暂停播放图片,刷新图片和位置
            pygame.mixer.music.pause()              # 暂停播放背景音乐
        else:
            screen.blit(unpause_image, pause_rect)  # 记载继续播放图片
            pygame.mixer.music.unpause()            # 继续播放背景音乐
        # 更新界面
        pygame.display.flip()
        clock.tick(30)
if __name__ == "__main__":
    main()


测试效果:




暂停图片素材:



将播放声音加到游戏中


import pygame
import sys                      # 退出需要
from pygame.locals import *     # 把pygame的常量名导进去
from random import *            # 随机生成数需要
# 球类继承自Spirte类
class Ball(pygame.sprite.Sprite):
    def __init__(self, image, position, speed, bg_size):
        # 初始化动画精灵
        pygame.sprite.Sprite.__init__(self)
        # 使用 .convert_alpha() 可以转换像素格式,提高 blit 的速度
        self.image = pygame.image.load(image).convert_alpha()   # 加载小球图片
        self.rect = self.image.get_rect()                       # 获取小球位置
        # 将小球放在指定位置
        self.rect.left, self.rect.top = position            # 小球的左边和上边
        self.speed = speed
        self.width, self.height = bg_size[0], bg_size[1]    # 窗口的宽高
        self.radius = self.rect.width / 2                   # 增加半径属性
    def move(self):
        self.rect = self.rect.move(self.speed)    # 移动小球矩形位置
        # 如果小球的左侧出了边界,那么将小球左侧的位置改为右侧的边界
        # 这样便实现了从左边进入,右边出来的效果
        if self.rect.right < 0:                # 小球右边界<0,即小球出左边
            self.rect.left = self.width        # 从右边进来
        elif self.rect.left > self.width:      # 小球左边界>窗口宽度,即小球出右边
            self.rect.right = 0                # 从左边进来
        elif self.rect.bottom < 0:             # 小球下边界<0,即小球出上边
            self.rect.top = self.height        # 从下边出来
        elif self.rect.top > self.height:      # 小球上边界>窗口高度
            self.rect.bottom = 0               # 从上边出来
def main():
    pygame.init()   # 初始化
    ball_image = "gray_ball.png"   # 球图像
    bg_image = "background.png"    # 背景图像
    running = True   # 初始化running为True
    # 添加背景音乐
    pygame.mixer.music.load("bg_music.ogg")  # 加载背景音乐
    pygame.mixer.music.play()                # 播放背景音乐
    # 添加音效
    loser_sound = pygame.mixer.Sound("loser.wav")     # 失败的时候的声音
    laugh_sound = pygame.mixer.Sound("laugh.wav")     # 嘲笑的声音
    winner_sound = pygame.mixer.Sound("winner.wav")   # 成功的时候的声音
    hole_sound = pygame.mixer.Sound("hole.wav")
    # 背景音乐会贯穿游戏的始终,背景音乐完整播放一次我们视为游戏的时间,
    # 因此我们需要想办法让游戏在背景音乐停止时结束,我们应该有留意到:
    # music 模块有一个 set_endevent() 方法,该方法的作用就是在音乐播放完时
    # 发送一条事件消息,发送什么消息是我们自定义的,USEREVENT 就是自定义消息,
    # Pygame 给我们预定了很多事件,像我们熟悉的 键盘事件、鼠标事件等。这些预定义
    # 的事件都有一个标记符,例如:MOUSEBUTTONDOWN 、KEYDOWN等。这些都是
    # 一些数字的等值定义,其实在内部,2 就表示鼠标按下,但是人类难以记住,所以定义为
    # MOUSEBUTTONDOWN。
    # USEREVENT 就是数字24,24以上就是我们可以自定义的事件,我们可以像这样自定义事件:
    # MY_EVENT = USEREVENT。
    # MY_EVENT_1 = USEREVENT + 1........
    # 音乐播放完时游戏结束
    GAMEOVER = USEREVENT
    pygame.mixer.music.set_endevent(GAMEOVER)
    # 根据背景图片指定游戏界面尺寸
    bg_size = width, height = 1024, 681         # 窗口尺寸
    screen = pygame.display.set_mode(bg_size)   # 绘制窗口
    pygame.display.set_caption("小游戏")         # 窗口名
    background = pygame.image.load(bg_image).convert_alpha()   # 加载背景图片
    # 用来存放小球对象的列表
    balls = []
    group = pygame.sprite.Group()   # 这里的group在碰撞检测需要
    # 创建五个小球
    for i in range(5):
        # 位置随机,速度随机
        # position = (小球的左边,上边)
        position = randint(0, width - 100), randint(0, height - 100)   # 随机生成位置
        speed = [randint(-10, 10), randint(-10, 10)]                   # 随机生成速度
        """四个参数ball_image, position, speed, bg_size 前面都设置了"""
        ball = Ball(ball_image, position, speed, bg_size)              # 实例化小球
        # 在创建小球这里必须进行一下碰撞检测
        """
        spritecollide(sprite, group, dokill, collided = None)
        第一个参数 sprite 是指定被检测的精灵;(就是我们写的里面的 item)
        第二个参数 group 是指定一个组(就是我们写的里面的 target 列表),它是 sprite 的组,因此要使用 sprite.Group() 来生成;
        第三个参数 dokill 是设置是否从组中删除检测到碰撞的精灵,设置为True,则删除;
        第四个参数 collided 是指定一个回调函数,用于定制特殊的检测方法,如果第四个参数忽略的话,默认是检测精灵之间的 rect 属性。
        """
        while pygame.sprite.spritecollide(ball, group, False, pygame.sprite.collide_circle):
            #                             小球   group  不删除   圆形属性
            # 随机生成的小球碰撞了就再次随机生成位置
            ball.rect.left, ball.rect.top = randint(0, width - 100), randint(0, height - 100)
        balls.append(ball)   # 列表用append
        group.add(ball)      # 集合用add
    clock = pygame.time.Clock()   # 设置帧率需要
    while running:  # 主循环
        for event in pygame.event.get():  # 遍历事件
            if event.type == QUIT:        # ×掉窗口
                sys.exit()                # 退出游戏
            elif event.type == GAMEOVER:  # 判断事件是否为我们自定义的GAMEOVER事件
                loser_sound.play()        # 失败的声音播放
                pygame.time.delay(2000)   # 暂停2秒
                laugh_sound.play()        # 嘲笑的声音播放
                running = False           # 退出循环了
        """blit:第一个参数为一个Surface对象,第二个为左上角位置。画完以后得用update更新,否则画面一片漆黑。"""
        # 更新图像的位置,这里是更新背景图像的位置
        screen.blit(background, (0, 0))
        for each in balls:  # 遍历小球
            each.move()     # 移动小球
            screen.blit(each.image, each.rect)  # 更新小球位置
        for each in group:
            group.remove(each)  # 把自身拿出来
            if pygame.sprite.spritecollide(each, group, False, pygame.sprite.collide_circle):  # 把自己和别的球进行碰撞检测
                each.speed[0] = -each.speed[0]    # 碰撞后方向移动
                each.speed[1] = -each.speed[1]
            group.add(each)  # 还要把自己放进去
        pygame.display.flip()   # 刷新界面
        # 数越大越快
        clock.tick(30)
if __name__ == "__main__":  # 运行
    main()


目录
相关文章
|
3月前
|
运维 网络协议 数据可视化
在线Ping全解析:零门槛搞定网络诊断,小白也能轻松上手
在数字化时代,在线Ping是零门槛网络诊断工具:无需安装、不需专业知识,浏览器输入网址即可秒测延迟与丢包。依托多节点云端探测,支持ICMP/TCP/Pv6,兼具可视化报告与DNS、Traceroute等拓展功能,助力个人排障与企业运维,让网络健康一目了然。(239字)
739 2
|
10月前
|
监控 Java 测试技术
《服务治理》流量治理:熔断机制详解与实践
熔断机制是微服务中防止雪崩的核心容错手段,通过CLOSED、OPEN、HALF-OPEN状态转换实现故障隔离与自动恢复。本文详解Resilience4j的注解与编程式使用、异常分类、组合容错及生产调优,提升系统韧性。
|
8月前
|
自然语言处理 API 语音技术
Qwen3-TTS全面升级:声情并茂,语通八方
Qwen3-TTS是阿里云推出的旗舰语音合成模型,支持多音色、多语种及多方言,提供49+种情感丰富的高品质声音,覆盖中文、英文、日语等10大语言及多种方言,语速韵律自然拟人。通过Qwen API可轻松调用,适用于多样化场景。
3171 2
|
11月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
7476 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
12月前
|
Shell 测试技术 API
Claude Code 官方内部团队最佳实践!
Immerse,独立开发者、内容创作者、AGI实践者,分享编程、AI、开源等内容。关注公众号“沉浸式趣谈”及个人网站获取更新。欢迎点赞、评论、转发支持!本文介绍Claude Code——智能编程命令行工具及其使用技巧。
8251 0
|
11月前
|
存储 弹性计算 应用服务中间件
阿里云轻量应用服务器与云服务器ECS有何区别?轻量应用服务器性能、优势与收费价格参考
2025年,阿里云轻量应用服务器2核2G3M带宽搭配40GB ESSD云盘的配置,每天10点和15点开启的抢购价只要38元1年,新用户非抢购专属优惠价也只要68元1年。对于一些初次接触阿里云轻量应用服务器的用户来说,可能不是很清楚它与云服务器ECS有什么不同?选择轻量应用服务器有哪些优势,本文为大家介绍轻量应用服务器的性能、适用场景、优势、收费标准以及与云服务器ECS之间的区别,以供参考。
|
人工智能 自然语言处理 搜索推荐
生成式引擎优化将成为律师事务所营销大趋势
随着生成式引擎优化的出现,数字营销正在经历一场翻天覆地的变化,律师事务所必须适应新的流量获取方式,其中人工智能生成的内容将发挥核心作用。
1285 2
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
478 0
Java NIO 开发
|
缓存 物联网 异构计算
智谱发布新一代旗舰模型 GLM-4.5,面向推理、代码与智能体的开源SOTA模型!
7月28日晚,智谱带来新一代旗舰模型——GLM-4.5!GLM-4.5 系列模型是专为智能体设计的基础模型。GLM-4.5拥有 3550 亿总参数量,其中 320 亿活跃参数;GLM-4.5-Air 采用更紧凑的设计,拥有 1060 亿总参数量,其中 120 亿活跃参数。GLM-4.5模型统一了推理、编码和智能体能力,以满足智能体应用的复杂需求。
1642 0
|
域名解析 缓存 网络协议
计算机网络——网络基础_网络命令的使用(配置主机IP、ipconfig、ping、tracert、arp实战)
任务要求 打开Windows 10的命令(控制台)窗口。 实验步骤 有多种方法打开Windows命令(控制台)窗口。其中一种较为快速的方法是: 在键盘上按下“Win+R"组合键,系统将打开“运行"窗口,如图1-1所示。键入cmd.按回车键或单击“确定”按钮,Windows将打开命令(控制台)窗口,显示俞令提示符,如图1-2所示。
3133 1
计算机网络——网络基础_网络命令的使用(配置主机IP、ipconfig、ping、tracert、arp实战)