声音的力量
良好的音频(声音和音乐)是为游戏加料(Juice)的最有效方式。 加料(Juice)是一个非正式的游戏设计词,表示使游戏变得有趣和引人入胜的事物。 有时也称为“游戏感觉”。
与图形一样,为游戏找到合适的声音也是具有挑战性的事。 OpenGameArt 是查找音频资源的好地方,在该站点中搜索声音是一种有趣的体验,但我们将寻求另一种创建游戏音效的方法。
制作自定义声音
我们将使用一个非常棒的工具 Bfxr 来生成我们的 太空大撞击 游戏所需的声音。 Bfxr 看起来像这样:
不要被所有这些滑块和音频术语吓倒。 左侧的按钮将随机生成该类型的声音。 尝试单击“Shoot”按钮几次。 生成的声音将保存在按钮下方的列表中。
对于 太空大撞击 游戏,我们需要一个“射击”声音和一个“爆炸”声音。 当你找到你想要的声音时,点击“Export Wav”按钮(不是“Save to Disk”按钮)。
接下来,我们将创建一个“snd”文件夹(就像我们为图像所做的那样)并将 WAV 文件放在那里。 以下是我选择的声音:(音频文件请查看文末源代码链接处,直接在游戏运行页面查看)
- expl3.wav
- expl6.wav
- pew.wav
请注意,有两个爆炸声。 这样,我们可以在它们之间随机选择,并在我们的Mob爆炸中有一点变化。
最后但并非最不重要的一点是,我们需要一些背景音乐。 随意浏览 OpenGameArt,或者你可以使用这个:
Frozen Jam by tgfcoder
请注意,在上面的页面上,艺术家已指定“署名说明”。 这些是艺术家选择将音乐许可给您的要求。 简而言之,这意味着我们必须给艺术家以赞誉(credit)。 我们将在程序顶部复制并粘贴该语句。
为游戏添加声音
我们已准备好将声音添加到游戏中。 首先,我们需要指定我们的声音文件夹在哪里:
# Frozen Jam by tgfcoder <https://twitter.com/tgfcoder> licensed under CC-BY-3
# Art from Kenney.nl
import pygame
import random
from os import path
img_dir = path.join(path.dirname(__file__), 'img')
snd_dir = path.join(path.dirname(__file__), 'snd')
接下来,我们需要加载声音文件。 我们将在加载图形的同一位置执行此操作。 让我们先做射击声音:
# Load all game sounds
shoot_sound = pygame.mixer.Sound(path.join(snd_dir, 'pew.wav'))
现在我们已加载声音并将其分配给变量 shoot_sound,以便我们可以引用它。 我们希望在玩家射击时播放声音,所以让我们将其添加到 shoot() 方法中:
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
shoot_sound.play()
这就是和射击相关的音效设置,现在,射击的时候,感受好多了!
接下来,让我们添加爆炸声。 我们将加载它们并将它们放在一个列表中:
# Load all game sounds
shoot_sound = pygame.mixer.Sound(path.join(snd_dir, 'pew.wav'))
expl_sounds = []
for snd in ['expl3.wav', 'expl6.wav']:
expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir, snd)))
我们将在摧毁Mob时随机选择其中一个音效来播放:
# check to see if a bullet hit a mob
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
score += 50 - hit.radius
random.choice(expl_sounds).play()
m = Mob()
all_sprites.add(m)
mobs.add(m)
背景音乐
最后要做的是添加一些背景音乐,这会给游戏带来很多个性和情感。 音乐与声音的工作方式略有不同,因为您希望它在后台不断播放。
首先,加载音乐:
expl_sounds = []
for snd in ['expl3.wav', 'expl6.wav']:
expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir, snd)))
pygame.mixer.music.load(path.join(snd_dir, 'tgfcoder-FrozenJam-SeamlessLoop.ogg'))
pygame.mixer.music.set_volume(0.4)
这个音乐文件音量比较大,我们不希望它压倒其他声音,因此我们还将音量设置为最大值的 40%。
要播放音乐,您只需在代码中选择歌曲应该从哪里开始,在我们的例子中就是在游戏循环开始之前:
score = 0
pygame.mixer.music.play(loops=-1)
# Game loop
running = True
loops 参数是您指定歌曲重复次数的方式。 通过将循环设置为-1,我们可以无限重复。
试试看 —— 现在游戏的时候感觉不是好多了? 我们没有改变任何游戏玩法,但音乐和音效让体验更加丰富。 尝试不同的声音,看看它如何影响游戏感觉。
在下一课中,我们将为玩家添加生命值,这样玩家就不会那么容易“死去”。
完整的代码请访问:
Pygame教程:太空大撞击 添加音效 配套代码
题图来自:UnSplash