Javascript 相位器警告“;音频源已存在“;连续播放mp3声音样本时

Javascript 相位器警告“;音频源已存在“;连续播放mp3声音样本时,javascript,audio,phaser-framework,Javascript,Audio,Phaser Framework,我对加载和播放音效有点困惑。我的游戏是在不同的状态下设置的,首先预加载状态确保所有图像和声音都已加载。游戏状态是主游戏,下一个关卡将重新启动此状态。有不同的级别,但状态是相同的,它只是更改一个\u levelIndex变量并使用相同的状态 游戏状态会在.create()函数中将所需的音频添加到游戏中,并且每次启动游戏状态时都会调用此create函数。请参阅下面的代码 mygame.Preloader.prototype = { preload: function(){

我对加载和播放音效有点困惑。我的游戏是在不同的状态下设置的,首先预加载状态确保所有图像和声音都已加载。游戏状态是主游戏,下一个关卡将重新启动此状态。有不同的级别,但状态是相同的,它只是更改一个
\u levelIndex
变量并使用相同的状态

游戏状态会在
.create()
函数中将所需的音频添加到游戏中,并且每次启动游戏状态时都会调用此create函数。请参阅下面的代码

mygame.Preloader.prototype = {
    preload: function(){

        this.loadingbar_bg = this.add.sprite(80, 512, "loadingbar_bg");
        this.loadingbar_fill = this.add.sprite(80, 512, "loadingbar_fill");
        this.load.setPreloadSprite(this.loadingbar_fill);

        // load sounds
        this.load.audio("button", ["snd/button.mp3", "snd/button.ogg"]);
        this.load.audio("punch",  ["snd/punch.mp3",  "snd/punch.ogg"]);
        this.load.audio("coin",   ["snd/coin.mp3",   "snd/coin.ogg"]);
    },
    create: function() {
        this.state.start("MainGame");
    },
};

mygame.GameState.prototype = {

    create: function() {
        this.stage.backgroundColor = "#f0f";
        // etc.

        // sound effects
        this.sound1 = this.game.add.audio("button");
        this.sound2 = this.game.add.audio("punch");
        this.sound3 = this.game.add.audio("coin");
        //etc.
    },

    update: function() {
        if (hitFace) {
            this.sound2.play();
            hitFace = false;
        };
    },

    doNextLevel: function() {
        this.sound1.play();
        this._levelIndex++; // next level
        this.state.start("MainGame"); // restart this state
    },
    //etc.
};
问题是,当我每隔几秒钟连续播放几次冲压声时,控制台会发出此警告(移相器会发出此警告)

相位器。声音:音频源已存在

即使游戏状态是第一次启动,此警告也会出现

我怀疑这与解码mp3和ogg声音有关。我是否必须在玩家每次启动(或重新启动)一个级别(即重新启动游戏状态)时解码声音样本?换句话说,如果游戏状态为
.create()
,则每次启动一个关卡并使用
game.add.audio
添加音频样本时,上一关卡的解码样本是否会被销毁,并且每次都必须重新加载/解码?这似乎是浪费,最好的方法是什么?因此,我的问题是:

  • 此消息“音频源已存在”是什么意思?或 我应该忽略它吗
  • 如果要在某个状态中使用声音,是否每次启动状态并调用
    .create()
    时都必须重新添加声音
  • 也有点相关,如果我想在多个不同的状态(菜单、游戏、选项等)中使用相同的声音样本,我是否必须为每个状态的相同声音执行
    game.add.audio()

  • 嗯,据我所知,你的代码似乎做的事情是正确的。因此,我将尝试用我所掌握的知识回答您的问题:

    1。此消息“音频源已存在”是什么意思?还是应该忽略它?

    该消息意味着已经有一个声音播放的实例,正如您可以在发出声音的地方看到的:

    if (this._sound && ***!this.allowMultiple***)
        {
            console.warn('Phaser.Sound: Audio source already exists');
    
            // this._disconnectSource();
        }
    
    如果您试图播放的声音已经由Phaser.sound播放,并且如果不允许多次播放,则会引发此错误。。。这就是问题的关键所在。允许多个来自:

    因此,基本上是抱怨您试图产生一个声音的几个实例,但不允许多次出现。你不应该忽略它,而应该使用正确的标志

    问题2和3:

    您不应该重新添加资源,因为这就是为什么您在引擎中加载音频源,以便可以在所有级别重复使用。你也不必为所有的州这么做

    为了在多个状态下重复使用声音,您应该能够在全局范围内添加音频或任何游戏对象并访问它() 其他方法是将这些资源作为属性添加到游戏对象中,这样你就不会污染全局范围,而只会污染游戏对象上下文。 但我认为,在不同的州添加这些音频,并管理这些音频在各州的删除/创建,是更好的策略。主要是因为JS是邪恶的,易变性可能会给你打坏牌

    *不是那么邪恶

    要解决此警告:只需使用标志(),例如:


    你用答案解决了你的问题吗?
    /**
    * @property {boolean} allowMultiple - This will allow you to have multiple instances of this Sound playing at once. This is only useful when running under Web Audio, and we recommend you implement a local pooling system to not flood the sound channels.
    * @default
    */
    this.allowMultiple = false;
    
        this.sound1 = this.game.add.audio("button") // allowMultiple is false by default
        this.sound2 = this.game.add.audio("punch");
        // Allow multiple instances running at the same time for sound2
        this.sound2.allowMultiple = true;
        this.sound3 = this.game.add.audio("coin");
        // Allow multiple instances running at the same time for sound3
        this.sound3.allowMultiple = true;