有人可以帮我解决Phaser声音问题吗?
我编写了一个带有在TypeScript中播放声音的功能的按钮,但是当我按下chrome上的按钮时,Phaser在chrome控制台上给出了以下警告:
Phaser.Cache.getSound: Key "sample" not found in Cache.
起初,当我按下按钮时,我认为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应该能够找到它。
答案 0 :(得分:1)
加载声音文件是一回事,将其解码是另一回事。不确定为什么会出现缓存错误,但最可能发生的是你加载了文件但尚未解码。
尝试这样的事情:
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函数可能是常规实例方法(仅为了保持一致性)。
Haven没有对它进行测试,但这应该是它。
答案 1 :(得分:1)
将mp3文件放在已转换的javascript文件的文件夹下。
就我而言,TypeScript正在寻找source/assets/audio/sample.mp3
,但是已编译的javascript正在寻找dist/assets/audio/sample.mp3
。
(test.png已经存在,所以Phaser能够找到它。但我完全忘了放置mp3文件......)
使用TypeScript时,请始终注意脚本在转换后执行。