开发者问题收集

使用 Phaser 播放音频

2016-09-08
2107

有人能帮我解决 Phaser 声音问题吗?
我已经用 TypeScript 编写了一个按钮,其中包含一个播放声音的功能,但是当我在 chrome 上按下按钮时,Phaser 在 chrome 控制台上向我发出以下警告: Phaser.Cache.getSound:未在缓存中找到键“sample”。
起初,我以为按下按钮时 mp3 文件尚未完全加载,但即使我等待了足够长的时间,情况仍然一样……

export class PlayState extends Phaser.State {

    private sampleSound: Phaser.Sound;
    private testButton:  Phaser.Sprite;

    preload() {
      this.load.image("test", "assets/image/test.png")
      this.load.audio("sample", "assets/audio/sample.mp3");
    }

    create() {
      // Add test button
      this.testButton = this.add.sprite(50, 50, "test");
      this.testButton.anchor.setTo(0.5);
      this.testButton.inputEnabled = true;
      this.testButton.events.onInputDown.add(this.test);

      // Add audio
      this.sampleSound = this.add.audio("sample");
    }

    private test = () => {
      this.sampleSound.play();
    }
}

我当然在 assets/audio 目录下有 sample.mp3 文件,所以 Phaser 应该能够找到它。

2个回答

加载声音文件是一回事,解码又是另一回事。不确定为什么会出现缓存错误,但最可能发生的情况是文件已加载,但尚未解码。

尝试以下方法:

export class PlayState extends Phaser.State {

    private sampleSound: Phaser.Sound;
    private testButton: Phaser.Sprite;

    preload() {
        this.load.image("test", "assets/image/test.png");
        this.load.audio("sample", "assets/audio/sample.mp3");
    }

    create() {
        // Add audio
        this.sampleSound = this.add.audio("sample");

        this.game.sound.setDecodedCallback(["sample"], this.createButton, this);
    }

    private createButton(): void {
        // Add test button
        this.testButton = this.add.sprite(50, 50, "test");
        this.testButton.anchor.setTo(0.5);
        this.testButton.inputEnabled = true;
        this.testButton.events.onInputDown.add(this.test);
    }

    private test = () => {
        this.sampleSound.play();
    }
}

这样,您只会在解码 mp3 文件后创建按钮。如果需要加载更多声音,请在第一个参数中添加更多键。

播放声音的 lambda 函数可能是一种常规实例方法(只是为了保持一致性)。

还没有测试过,但应该是这个。

Kamen Minkov
2016-09-09

将mp3文件 放在转移的JavaScript文件的文件夹下方 。 就我而言,打字稿正在寻找 source/Assets/audio/sample.mp3 ,但是转移的JavaScript正在寻找 dist/Assets/Audio/sample.mp3
(test.png已经在那里,所以Phaser能够找到它。但是我完全忘记了放置mp3文件...)

当您使用Typescript时,请始终知道脚本是在之后执行的他们被移交了。

sora
2016-09-10