未捕获的TypeError:game.cache.getSound(...)。从Phaser.Cache中检索声音时,play不是一个函数

时间:2015-11-14 09:12:59

标签: phaser-framework

我有一个有两种不同状态的移相器游戏,即preloadStategameState。首先使用Phaser.Loader中的preloadState加载声音文件。但是,在完成加载并输入gameState后,我无法检索所述声音文件。

调用堆栈:

Uncaught TypeError: this.cache.getSound(...).play is not a function
(anonymous function) @ game.js:232
Phaser.SignalBinding.execute @ phaser.js:29960
Phaser.Signal.dispatch @ phaser.js:29765
Phaser.Events.(anonymous function) @ phaser.js:44440
Phaser.InputHandler._pointerOverHandler @ phaser.js:40080
Phaser.Pointer.processInteractiveObjects @ phaser.js:38363
Phaser.Pointer.move @ phaser.js:38275
Phaser.Mouse.onMouseMove @ phaser.js:36385
_onMouseMove @ phaser.js:36275

以下是我的代码:

preload.js

    var preloadState = {
        preload: function() {
        // set preload sprite here
        // ...
        // Audio files
        this.load.audio('button_click','assets/button_click.ogg');
    },
    create: function() {
        this.button_click_sound = this.add.audio('button_click'); 
    }

game.js

var gameState = {
    create:function() {
         game.cache.getSound('button_click').play();    // Error here
} 

main.js

var game = new Phaser.Game(432,800,Phaser.AUTO);
game.state.add('gameState', gameState);
game.state.add('preloadState', preloadState);
game.state.start('preloadState');

根据http://phaser.io/docs/2.2.2/Phaser.Cache.html#getSoundgetSound方法返回Phaser.Sound对象,但其play()方法不可调用?

2 个答案:

答案 0 :(得分:0)

你能试试吗?



var gameState = {
  create:function() {
    var button_sound = game.add.audio('button_click');
    button_sound.play();
  }
} 




答案 1 :(得分:0)

我想我已经找到了无法访问play()方法的原因。

缓存以对象的形式存储音频数据,但不存储Phaser.Sound个实例,因此无法调用该方法。

可以在addSound中的Phaser.Sound方法中找到对象创建和插入缓存的代码:

this._cache.sound[key] = { url: url, data: data, isDecoding: false, decoded: decoded, webAudio: webAudio, audioTag: audioTag, locked: this.game.sound.touchLocked };

此外,我认为此方法Phaser.Cache#getSound的文档应更新为不使用Phaser.Sound作为返回值,而是使用声音对象。