从 Phaser v2.0.1 升级到 v2.7.7 会中断声音
Posted
技术标签:
【中文标题】从 Phaser v2.0.1 升级到 v2.7.7 会中断声音【英文标题】:Upgrading from Phaser v2.0.1 to v2.7.7 breaks sound 【发布时间】:2017-04-23 19:23:45 【问题描述】:我刚刚在我的 Phaser 应用程序中用最新版本 (2.7.7) 替换了缩小的 Phaser js,我的应用程序中的音频已停止工作。该应用程序的其余部分仍然运行良好。加载音频的代码非常简单——我首先加载音频,然后将音频添加到一个数组中。
game.load.audio('sound.correct', 'assets/sound.general/sound.correct.mp3');
general_sounds[0] = game.add.audio('sound.correct');
当我开始播放我刚刚使用的音频时:
general_sounds[0].play()
在 2.0.1 中有效,但现在我得到的错误如下:
phaser.min.js:3 Uncaught TypeError: Cannot read property 'createBufferSource' of null
at c.Sound.play (phaser.min.js:3)
at <anonymous>:1:19
play @ phaser.min.js:3
(anonymous) @ VM1834:1
更奇怪的是,当我在控制台中运行上述 3 个命令时,声音一切正常。
有人知道怎么回事吗?
编辑:下面是我正在使用的代码的简化版本 - 在下面,general_sounds[1]
播放但 0 和 2 不播放。如果我将loadGeneralSound();
调用放在create()
而不是preload()
中,我会在代码下方看到错误。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Snap - it's kids play!</title>
<script type="text/javascript" src="js/phaser.min.js"></script>
<style type="text/css">
body
margin: 0;
</style>
</head>
<body>
<script type="text/javascript">
var game = new Phaser.Game(800, 600, Phaser.AUTO, '', preload: preload, create: create);
var general_sounds = [];
function preload()
// load general sounds
loadGeneralSound();
function create()
general_sounds[0].play();
general_sounds[1].play();
general_sounds[2].play();
// loads general sounds that are not object specific
function loadGeneralSound()
game.load.audio('sound.correct', 'assets/sound.general/sound.correct.mp3');
game.load.audio('sound.incorrect', 'assets/sound.general/sound.incorrect.mp3');
game.load.audio('voice.correct', 'assets/sound.general/sound.well_done.m4a');
general_sounds[0] = game.add.audio('sound.correct');
general_sounds[1] = game.add.audio('sound.incorrect');
general_sounds[2] = game.add.audio('voice.correct');
</script>
</body>
</html>
如果我将loadGeneralSound();
调用放入create()
而不是preload()
,则会出错:
Phaser CE v2.7.7 | Pixi.js | WebGL | WebAudio http://phaser.io ♥♥♥
phaser.min.js:3 Phaser.Cache.isSoundDecoded: Key "sound.correct" not found in Cache.
getItem @ phaser.min.js:3
isSoundDecoded @ phaser.min.js:3
play @ phaser.min.js:3
create @ snap.html:27
loadComplete @ phaser.min.js:3
preUpdate @ phaser.min.js:3
updateLogic @ phaser.min.js:3
update @ phaser.min.js:3
updateRAF @ phaser.min.js:3
window.requestAnimationFrame.forceSetTimeOut._onLoop @ phaser.min.js:3
phaser.min.js:3 Phaser.Cache.getSound: Key "sound.correct" not found in Cache.
getItem @ phaser.min.js:3
getSound @ phaser.min.js:3
play @ phaser.min.js:3
create @ snap.html:27
loadComplete @ phaser.min.js:3
preUpdate @ phaser.min.js:3
updateLogic @ phaser.min.js:3
update @ phaser.min.js:3
updateRAF @ phaser.min.js:3
window.requestAnimationFrame.forceSetTimeOut._onLoop @ phaser.min.js:3
phaser.min.js:3 Phaser.Cache.isSoundDecoded: Key "sound.incorrect" not found in Cache.
getItem @ phaser.min.js:3
isSoundDecoded @ phaser.min.js:3
play @ phaser.min.js:3
create @ snap.html:28
loadComplete @ phaser.min.js:3
preUpdate @ phaser.min.js:3
updateLogic @ phaser.min.js:3
update @ phaser.min.js:3
updateRAF @ phaser.min.js:3
window.requestAnimationFrame.forceSetTimeOut._onLoop @ phaser.min.js:3
phaser.min.js:3 Phaser.Cache.getSound: Key "sound.incorrect" not found in Cache.
getItem @ phaser.min.js:3
getSound @ phaser.min.js:3
play @ phaser.min.js:3
create @ snap.html:28
loadComplete @ phaser.min.js:3
preUpdate @ phaser.min.js:3
updateLogic @ phaser.min.js:3
update @ phaser.min.js:3
updateRAF @ phaser.min.js:3
window.requestAnimationFrame.forceSetTimeOut._onLoop @ phaser.min.js:3
phaser.min.js:3 Phaser.Cache.isSoundDecoded: Key "voice.correct" not found in Cache.
getItem @ phaser.min.js:3
isSoundDecoded @ phaser.min.js:3
play @ phaser.min.js:3
create @ snap.html:29
loadComplete @ phaser.min.js:3
preUpdate @ phaser.min.js:3
updateLogic @ phaser.min.js:3
update @ phaser.min.js:3
updateRAF @ phaser.min.js:3
window.requestAnimationFrame.forceSetTimeOut._onLoop @ phaser.min.js:3
phaser.min.js:3 Phaser.Cache.getSound: Key "voice.correct" not found in Cache.
getItem @ phaser.min.js:3
getSound @ phaser.min.js:3
play @ phaser.min.js:3
create @ snap.html:29
loadComplete @ phaser.min.js:3
preUpdate @ phaser.min.js:3
updateLogic @ phaser.min.js:3
update @ phaser.min.js:3
updateRAF @ phaser.min.js:3
window.requestAnimationFrame.forceSetTimeOut._onLoop @ phaser.min.js:3
【问题讨论】:
我无法复制这个。您最初是如何创建general_sounds
的?如果不将其定义为数组会怎样?
嗨,詹姆斯,感谢您提出的问题 - 我在上面提供了更多详细信息。如果我不定义数组,那么根本没有任何作用。
这是有道理的,因为我相信Interphase 1 的状态管理器文档指出所有game.load
调用都应该在preload
中进行,以确保它们可用。有趣的是,我无法运行您的示例,但如果我将加载调用移至create
,我可以复制该问题。 official Play Music example 发生了一些事情,因此 game.load
发生在 preload
中,game.add.audio
发生在 create
中。更改代码以遵循该标准对我有用。
感谢 James 的帮助 - 我还能从 create 中调用一个单独的函数来进行加载吗?我会尝试你的建议,看看这对我有什么好处。
你完全可以打破loadGeneralSound
,第二个将音频添加到游戏中。
【参考方案1】:
Interphase 1 在状态管理器上的文档指出,所有game.load
调用都应在preload
中进行,以确保它们可用。有趣的是,我无法运行您的示例,但如果我将加载调用移至 create
,我可以复制该问题。
official Play Music example 已分解,因此 game.load
发生在 preload
和 game.add.audio
发生在 create
。更改代码以遵循该标准对我有用。
例如:
function preload()
// load general sounds into cache
loadGeneralSound();
function create()
// Add audio to the array so they can be played.
addGeneralSound();
general_sounds[0].play();
general_sounds[1].play();
general_sounds[2].play();
// loads general sounds that are not object specific
function loadGeneralSound()
game.load.audio('sound.correct', 'assets/sound.general/sound.correct.mp3');
game.load.audio('sound.incorrect', 'assets/sound.general/sound.incorrect.mp3');
game.load.audio('voice.correct', 'assets/sound.general/sound.well_done.m4a');
// Add sounds to the array object so they can be referenced/played.
function addGeneralSound()
general_sounds[0] = game.add.audio('sound.correct');
general_sounds[1] = game.add.audio('sound.incorrect');
general_sounds[2] = game.add.audio('voice.correct');
【讨论】:
很高兴它有帮助! :)以上是关于从 Phaser v2.0.1 升级到 v2.7.7 会中断声音的主要内容,如果未能解决你的问题,请参考以下文章
每周更新:React UI 库WebStorm 2019.1.1PaySDK v2.0.1SpringBoot等更新发布