在模块模式中创建“统一”变量

时间:2012-09-24 17:26:32

标签: javascript design-patterns module

我对模块模式的概念很陌生。我设法实现了我的HTML5游戏的核心功能,但是我无法找到一种方法让某些变量可用于该游戏的每个功能。

这是一个简短的伪示例,应该更清楚:

var Game = {};

Game.player = (function() {

    //...

    return {
        update : update,
        draw : draw        
    };
});

Game.main = (function() {

    var player = new Game.player();

    // needed by player
    var gravity = 1.0,
        loop,
        canvas,
        ctx,
        key_inputs;

    //...

    return {
        init : init,
        pause : pause,
        play : play        
    };
});

var game = new Game.main();
game.init();
​

2 个答案:

答案 0 :(得分:1)

您可以在Game.main中提供getter和setter方法。您应该将Game.main的实例传递给Game.player构造函数。然后Game.player可以在其Game.main实例上使用getter / setter方法来访问这些变量。

确保您的架构合理,并且只分享您需要共享的内容。

答案 1 :(得分:1)

如果作用于Player函数的代码需要使用Game函数中声明的某些变量,则有三个选项:

  • 将它们移到更高的范围(在这种情况下是全局的,所以不推荐)
  • 将它们作为参数传递给播放器(不是很好,因为如果它们在Player中更改,它们将不会在Game中更新)
  • getter中创建一个Game函数,用于将变量的当前状态返回给Player函数。

您还需要将Game的实例传递给Player,以便知道哪个Game从中获取数据。

以下是#3(我会尝试的那个)的例子:

Game.main = (function() {
    var player = new Game.player(this);

    // needed by player
    var gravity = 1.0,
        loop,
        canvas,
        key_inputs;

    var getSettings = function () {
        return {
            gravity: gravity,
            loop: loop,
            canvas: canvas,
            key_inputs: key_inputs
        };
    };

    return {
        init : init,
        pause : pause,
        play : play,
        getSettings: getSettings        
    };
});