范围问题与setInterval游戏循环

时间:2016-05-15 19:02:56

标签: javascript scope setinterval

我正在使用简单的代码构建一个游戏,但却很狡猾,而且我遇到了一个问题。

我的游戏循环如下:

function loop() {

    updateGame(game1, canvas1, onInit);
    displayGame(game1, canvas2, onInit);
    monitorPreformance(game1, canvas3, onInit);
    onInit = false;
}
setInterval(loop, 20);

并且,例如,我在updateGame里面:

function updateGame(arg1, arg2, arg3) {
    var a, b, c;
    function doThis {
        //
    }
    function doThat {
        //
    }
    function draw(){
        doThis();
        doThat();
    }
    draw();
}

问题在于,每次调用setInterval时,我的变量a,b和c都会重新初始化。当游戏创建时,我在每个updateGame,drawGame和monitorPreformance中调用了setInterval三次。现在我希望能够做一些事情,比如暂停游戏,所以我想像上面那样设置它,但它会导致这些范围问题。

有一个简单的解决方法吗?我是否必须初始化一个全局对象以包含每个函数的a,b,c?请注意,大约有50个这样的变量,这需要对代码进行半重写。注意,一些变量需要在三个游戏之间传递,game1的参数也是如此。但是,其他变量只需要在每个函数的循环调用之间预先设定。

如果没有简单的解决方法,那么正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

实现这一目标的一种方法是使用模块模式:

var updateGame = (function (arg1, arg2, arg3) {
    var a, b, c;
    function doThis {
        //
    }
    function doThat {
        //
    }

    return function () {
        doThis();
        doThat();  
    }
})(game1, canvas1, onInit);

请参阅more此处

编辑: 可能你还需要修改你的循环:

function loop() {
    updateGame();
    displayGame(game1, canvas2, onInit);
    monitorPreformance(game1, canvas3, onInit);
    onInit = false;
}
setInterval(loop, 20);