如何添加音频
音频是游戏不可或缺的一部分,合理地使用可以使游戏如虎添翼。
基本流程 通常来说,音频的使用流程如下:
创建音频实例,一般来说一个音频文件对应一个实例:
1 const ctx = swan.createInnerAudioContext();
修改 ctx
属性,详见 API :
1 2 ctx.loop = true ; ctx.src = 'xxx.mp3' ;
监听事件:
1 2 3 ctx.onStop(function ( ) { console .log('audio stopped' ); });
播放音频:
如果 ctx
没有设置 autoplay
,则需要调用 ctx.play()
播放,否则音频资源加载后将自动播放:
不再需要音频资源时,将其释放:
1 2 ctx.destroy(); ctx = null ;
详细的方法请参见音频 API 。
典型使用场景 全部静音 如果想实现一键将所有音频静音,建议使用一个音频管理器负责所有音频实例的管理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class AudioManager { constructor (audioNames) { this .audios = []; for (let i = 0 ; i < audioNames.length; ++i) { const name = audioNames[i]; const ctx = swan.createInnerAudioContext(); ctx.src = name + '.mp3' ; this .audios.push(ctx); } } muteAll() { this .setVolume(0 ); } unmuteAll() { this .setVolume(1 ); } setVolume(volume) { for (let i = 0 ; i < this .audios.length; ++i) { this .audios[i].volume = volume; } } }
背景音乐 我们通常希望背景音乐在加载后就自动播放,并且不断循环,这样的典型场景可以用以下方式实现:
1 2 3 4 5 const bgCtx = swan.createInnerAudioContext();bgCtx.loop = true ; bgCtx.autoplay = true ; bgCtx.src = 'xxx.mp3' ;
音效 音效的特殊性在于,它往往会触发多次,并且可能在上一次播放结束前又需要触发一次。默认情况下,在一个音频结束播放(可以通过 ctx.onEnded
获得该时机)前,如果再次调用 ctx.play()
是不会有任何效果的,因为当前已经在播放状态了。
以下是一种实现随时触发多次音效(multishot)的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class MultishotAudio { constructor (audioPath) { this .audioPath = audioPath; this .ctxArr = []; } play() { for (let i = 0 ; i < this .ctxArr.length; ++i) { if (this .ctxArr[i]._isEnded) { this .ctxArr[i].play(); return ; } } const ctx = this ._createEffectCtx(); this .ctxArr.push(ctx); ctx.play(); } _createEffectCtx() { const ctx = swan.createInnerAudioContext(); ctx._isEnded = false ; ctx.onEnded(() => { ctx._isEnded = true ; }); ctx.src = this .audioPath; return ctx; } }
更多信息请参见音频 API 。