2016-05-15 80 views
0

我正在用简单的代码构建游戏,但很有用,而且我遇到了问题。范围问题与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(); 
} 

的问题是,我的变量a,b和c,得到重新初始化每个我打电话给setInterval。游戏创建时,我在每个updateGame,drawGame和monitorPreformance中调用了三次setInterval。现在我希望能够做到像暂停游戏这样的事情,所以我想按照上述方式进行设置,但这会导致这些范围问题。

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

如果没有简单的解决方法,那么正确的方法是什么?要实现这一目标

+0

也许你应该将它作为参数传递,也许它们应该是'game1'属性,也许它们应该是全局变量。不知道你的情况的细节很难知道。 – pomber

+0

你可以使这个变量全局。 'var window.a;'等 –

+2

忽略全局变量建议 – naomik

回答

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

这几乎是我正在寻找的解决方案。看到更多的建议让我找到我的答案。万分感谢! –

+0

强烈推荐阅读更多链接下的全书。 – jano

+0

是的,它似乎是一个很好的阅读。特别是因为我相当新的真正的JavaScript。 –