在Phaser游戏引擎中的状态之间传递音乐对象

时间:2017-03-20 19:08:53

标签: javascript phaser-framework

我的问题具体关于 Phaser game engine

所以我有一个带有几个州的游戏,每个州的定义如下:

var myGame = {};

myGame.Boot = function (game) {

};
myGame.Boot.prototype = {
    init: function () {
         //some init
    },
    create: function () {
        //this.scale.scaleMode
        this.state.start('Preloader');
    }
};

游戏的定义如下:

var game = new Phaser.Game(gameWidth, gameHeight, Phaser.AUTO, 'main');

game.state.add('Boot', myGame.Boot);
game.state.add('Preloader', myGame.Preloader);
game.state.add('MainMenu', myGame.MainMenu);

正常,简单,标准。一切都很好(到目前为止)。

以下是我在“预加载器”中定义音乐的方法。 (same as here):

fx = game.add.audio('sfx');
fx.allowMultiple = true;
fx.addMarker('alien death', 1, 1.0);
fx.addMarker('boss hit', 3, 0.5);
fx.addMarker('escape', 4, 3.2);
fx.addMarker('meow', 8, 0.5);
fx.addMarker('numkey', 9, 0.1);

this.sound.setDecodedCallback(
     [gg.fx],
     this.start, this
);

其中fx是全局变量。然后,如果我需要播放音乐,我会做

fx.play(button.name);

代码有效,但我必须始终保留此全局变量(或将其传递给我需要音乐的每个州)。

所以我有几个问题:

  1. 我不喜欢全局变量。有没有更好的方法呢?我计划有很多效果,我想用一种简单的方法来管理它们。
  2. 如果我没有使用全局变量并且调用像this.sound.play这样的代码(" name"),那么它表示该文件不在缓存中。有没有办法将其添加到全局缓存?这是个坏主意吗?
  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

  1. 全球大战:
  2. 您实际上可以在myGame上定义这些内容。虽然它使用不同的方式来定义这些,但请查看Phaser代码库本身的Full Screen Mobile Template。 Phaser的创造者实际上recommended this on their forums for declaring 'global' variables

    这给你这样的东西:

    myGame.fx = game.add.audio('sfx');
    // ...
    
    1. 全局缓存:
    2. 好问题。我发现的唯一一件事就是打破MP3文件并将它们单独加载到缓存中。通过这种方式,您的缓存有一个具有该名称/密钥的对象。

      但是,如果您将这些内容添加到myGame对象中,则应该能够将音频保存在一个文件中。