pygame音频处理

概念

首先几乎没有什么游戏是一声不吭的,多重的感官体验更能刺激玩家的神经,没有声音的游戏就好比 不蘸番茄的薯条,忘记带枪的战士!

尽管如此,Pygame 对于声音的处理并不是太理想,我说的是如果你想用 Pygame 做一个炫酷的音乐播放器那可能会让你失望,因为Pygame对于声音格式的支持十分有限,不过对于游戏开发来说,这完全是足够的,我们需要的我们自己转换就可以了。

格式

一般游戏来说,声音主要分为两种,一种是背景音乐,一种是音效。

背景音乐就是时刻伴随着游戏存在的,往往就是重复播放的一首曲子或者歌曲;

音效就是在某种条件下被触发产生的,比如飞机相撞会发出爆炸的声音

Pygame 支持的声音格式十分有限,一般情况下我们使用 .ogg 的格式来做背景音乐,用无压缩的 .wvb 来作为音效。

如果是拿到了一个 .mp3 格式,可以使用格式工厂这类的软件把它转为**.ogg** 或者 .wvb 格式,

还需要注意的是music 模块虽然写了支持 .mp3 格式,但是它对 .mp3 格式的支持十分有限,经常你会在网上找到一段很好的 .mp3 的曲子,但是载入之后压根没有声音。你把它转为 .ogg 格式就可以很好的支持了。

播放音乐和音效

播放音效

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

方法作用
play()开始播放
stop()停止播放
fadeout()淡出
set_volume()设置音量
get_volume()获取音量
get_num_channels()计算该音效播放了多少次
get_length()获得该音效的长度
get_raw()将该音效以二进制格式的字符串返回
实例

我们可以导入不同的两种音效,然后通过鼠标左右键控制播放不同的两种音效,如下面案例:

import pygame
import os

pygame.init()
# 初始化pygame模块
pygame.mixer.init()
# 初始化音频处理模块

bg_size = width,height = 500,300
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("Music Monster Demo")
# screen.fill((255,255,255))
# 设置窗口

game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, "img")
# 打开图片文件夹

winner_sound = pygame.mixer.Sound("./music/15121.wav")
loser_sound = pygame.mixer.Sound("./music/15122.wav")
# 加载音效文件
winner_sound.set_volume(0.2)
loser_sound.set_volume(0.2)
#设置音量

pause_image = pygame.image.load(os.path.join(img_folder, "pause.png")).convert()
unpause_image = pygame.image.load(os.path.join(img_folder, "play.png")).convert()
# 加载图片并转码
screen.blit(pause_image,(50,100))
screen.blit(unpause_image,(300,100))
# 显示图片

running=True
while running:
     for event in  pygame.event.get():
          if event.type == pygame.QUIT:
          	running=False

          elif event.type == pygame.MOUSEBUTTONDOWN:
               if event.button == 1:
                    winner_sound.play()
                    loser_sound.stop()
               elif event.button == 3:
                    loser_sound.play()
                    winner_sound.stop()
    # 获取时间并检查,在对应的事件下做相应的事
     pygame.display.flip()
    # 更新显示
pygame.quit()
播放背景音乐

播放背景音乐我们使用 music 模块,music 模块和 mixer 模块是紧密关联的,所以我们用 .mixer.music 他是在mixer里边的**—pygame.mixer.music**

方法作用
load()载入音乐
play()播放音乐
rewind()重新播放
stop()停止播放
pause()暂停播放
unpause()恢复播放
fadeout()淡出
set_volume()设置音量
get_volume()获取音量
get_busy()检测音乐流是否正在播放
set_pos()设置开始播放的位置
get_pos()获取已经播放的时间
queue()将音乐文件放入待播放列表中
set_endevent()在音乐播放完毕时发送事件
get_endevent()获取音乐播放完毕时发送的事件类型
实例

我们可以将一段背景音乐加入其中,打开程序后就会播放,然后鼠标左键点击后会播放一种音效,鼠标右键点击后就会播放另外一种音效,点击空格键就暂停背景音乐,再次点击就继续播放。

import pygame
import os

pygame.init()
# 初始化pygame模块
pygame.mixer.init()
# 初始化音频处理模块

bg_size = width,height = 500,300
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("Music Monster Demo")
# screen.fill((255,255,255))
# 设置窗口

game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, "img")
# 打开图片文件夹

pygame.mixer.music.load(r"./music/bg_music.mp3")
pygame.mixer.music.set_volume(0.1)
pygame.mixer.music.play()
# 加载背景音乐并播放

winner_sound = pygame.mixer.Sound("./music/15121.wav")
loser_sound = pygame.mixer.Sound("./music/15122.wav")
# 加载音效文件
winner_sound.set_volume(0.2)
loser_sound.set_volume(0.2)
#设置音量

pause_image = pygame.image.load(os.path.join(img_folder, "pause.png")).convert()
unpause_image = pygame.image.load(os.path.join(img_folder, "play.png")).convert()
# 加载图片并转码
##screen.blit(pause_image,(50,100))
##screen.blit(unpause_image,(300,100))
# 显示图片

pause=False
running=True
while running:
     for event in  pygame.event.get():
          if event.type == pygame.QUIT:
          	running=False

          elif event.type == pygame.MOUSEBUTTONDOWN:
               if event.button == 1:
                    winner_sound.play()
                    loser_sound.stop()
               elif event.button == 3:
                    loser_sound.play()
                    winner_sound.stop()
          elif event.type == pygame.KEYDOWN:
               if event.key == pygame.K_SPACE:
                    pause = not pause
     # 获取时间并检查,在对应的事件下做相应的事
     if pause:
          screen.fill((0,0,0))
          screen.blit(pause_image,(180,100))
          pygame.mixer.music.pause()
          
     else:
          screen.fill((0,0,0))
          screen.blit(unpause_image,(180,100))
          pygame.mixer.music.unpause()
    # 设定暂停的条件,判断后执行暂停
     pygame.display.flip()
    # 更新显示
pygame.quit()

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值