从 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 发生在 preloadgame.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等更新发布

如何将 Spine 动画添加到 Phaser 游戏?

测试跟踪模块UX交互升级,多个X-Pack功能开放至开源版,MeterSphere开源持续测试平台v2.7.0发布

Phaser并发阶段器

Cordova 打包phaser3.0 iOS游戏

co-dialog弹出框组件-版本v2.0.1