十三、声音

我最喜欢的游戏记忆是我玩我最喜欢的游戏时听的音乐和声音。无论是 Bastion 和 Fez 的音乐还是 Stardew 的声音,我们的耳朵都可以帮助我们充分欣赏游戏。

添加背景音乐

没有什么比好的配乐更能让你沉浸在游戏中了。最好的游戏会根据玩家的心情和位置来交换背景音乐。我们将从更简单的事情开始:

game.addEventListenerTo(window)
game.addRendererTo(document.querySelector(".camera"))
game.animate()

const music = new Audio("path/to/sounds/background.mp3")
music.loop = true
music.play()

点击此链接前,请调低音量,它会播放音乐。

这是出自 http://codepen.io/assertchris/pen/wzmQWb

在现代浏览器中播放声音其实很容易。快速搜索一个循环 MP3 和这个新的Audio对象正是我们所需要的。然而,如果我们想让背景音乐循环播放,我们需要将loop属性设置为true

Note

没有一种简单的方法可以让Audio对象循环而不在它们之间留有空隙。你可以考虑一个替代方案,比如 SoundManager2 ( https://github.com/scottschiller/SoundManager2 )。

添加动作和事件声音

添加游戏音效(为玩家发起的事件和动作),需要我们跳到动作和事件发生的地方:

element.addEventListener("keydown", (event) => {
  this.state.keys[event.keyCode] = true

  if (event.keyCode === 32) {
    new Audio("path/to/sounds/jump.wav").play()
  }
})

这是出自 http://codepen.io/assertchris/pen/wzmQWb

我们第一次尝试跳跃时,音效似乎需要一段时间加载才能播放。我们可以通过在玩家开始移动之前预加载所有声音来解决这个问题。

事实上,在游戏开始前预加载所有游戏资源(如字体、图像和声音)通常是个好习惯。在声音的情况下,我们只需要添加以下代码,在游戏开始预加载它之前:

new Audio("path/to/sounds/jump.wav").load()

这将启动加载过程,声音文件应该在使用时被加载(只要互联网连接足够快)。还有其他方法来确保所有的声音文件都被加载,但是它们使这个过程变得相当复杂。我想这是另一个时间的话题…

摘要

在这一章中,我们简单看了一下如何在游戏中嵌入背景音乐和动作/事件声音。现代浏览器为此提供了很好的工具,但如果我们需要支持旧浏览器或需要对播放进行更大的控制,我们总是可以求助于像 SoundManager2 这样的库。

购买许多声音、音乐文件和精灵(或精灵包)可能会很贵。你可能想让图形和声音艺术家参与到游戏的制作过程中来。