概念
首先几乎没有什么游戏是一声不吭的,多重的感官体验更能刺激玩家的神经,没有声音的游戏就好比 不蘸番茄的薯条,忘记带枪的战士!
尽管如此,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()