2016-09-08 9 views
0

Может ли кто-нибудь помочь мне с проблемой звука Phaser?
Я закодировал кнопку с функцией, которая играет звук в машинописном, но при нажатии на кнопку на хроме, Phaser дает мне следующее предупреждение на хромированной консоли: Phaser.Cache.getSound: Key "sample" not found in Cache.
На первом, я думал, что mp3 файл имеет не было полностью загружен, когда я нажал на кнопку, но даже когда я жду достаточного количества времени, ситуация все то же ...Воспроизведение аудио с помощью Phaser

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(); 
    } 
} 

Я, конечно, быть_наст файл sample.mp3 под активами/каталог аудио, поэтому Phaser должен уметь его найти.

ответ

1

Поместите mp3-файл под папку перекопанного файла javascript. В моем случае TypeScript искал source/assets/audio/sample.mp3, но перекопанный javascript искал dist/assets/audio/sample.mp3.
(test.png уже был там, так что Phaser удалось найти. Но я совершенно забыл поместить mp3 файл ...)

При использовании машинопись, всегда быть в курсе, что сценарии выполняются после того, как они передаются.

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 файл декодируется. Добавьте больше ключей к первому аргументу, если вам нужно загрузить больше звуков.

Функция лямбда, которая воспроизводит звук, вероятно, может быть обычным методом экземпляра (только ради последовательности).

Не проверял его, но это должно быть так.

+1

Спасибо за ваш комментарий. Причина, по которой я не мог воспроизвести звук, заключалась в том, что файл transpiled js ищет каталог различных ресурсов. После того, как я поместил mp3-файл в каталог js, исходный код начал работать. Этот mp3-файл достаточно велик, чтобы работать без проверки декодированного состояния, но я буду использовать 'setDecodedCallback', чтобы сделать 100% -ный звук аудиофайла декодирован перед его использованием. Большое спасибо за вашу помощь! – sora