2016-05-15 105 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。 –