使用 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