在Phaser游戏引擎的状态间传递音乐对象[英] Passing a music object between states in a Phaser game engine

问题描述

我的问题是具体 Phaser 游戏引擎

所以我有一个包含几个状态的游戏,每个状态的定义如下:

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

普通、简单、标准.一切都很好(到目前为止).

这是我在"预加载器"中定义音乐的方式(与这里):

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") 的代码,则表示文件不在缓存中.有没有办法将它添加到全局缓存中?这是个坏主意吗?

谢谢!

推荐答案

  1. 全局变量:

您实际上可以在 myGame 上定义这些.虽然它使用不同的方式来定义这些,但请查看 全屏移动模板,它是 Phaser 代码库本身的一部分.Phaser 的创建者实际上 在他们的论坛上推荐这个来声明"全局"变量.

这给了你这样的东西:

myGame.fx = game.add.audio('sfx');
// ...
  1. 全局缓存:

好问题.我发现的唯一一件事就是分解 MP3 文件并将它们单独加载到缓存中.这样,您的缓存就有一个具有该名称/键的对象.

但是如果你将这些添加到你的 myGame 对象中,你应该能够将你的音频保存在一个文件中.

本文地址:https://www.itbaoku.cn/post/1740221.html