点击按钮几次使游戏运行得越来越快 - javascript

时间:2017-03-10 08:15:16

标签: javascript jquery html5-canvas setinterval requestanimationframe

作为我学习的一部分,我使用画布在javascript中构建游戏“Space Invaders”。 在游戏开始之前,主页面已加载并等待点击新游戏按钮。当我点击此按钮时,游戏开始正常运行并且完全没有问题。 (游戏运行一个递归函数,调用函数update()和render() - 查看代码-...) 问题来自于在游戏运行期间我再次按下此按钮。发生的事情是游戏运行得更快,当我点击几次游戏时跑得越来越快......

我现在不在,因为它的间隔周期本身并不清楚,或者因为run()函数再次调用自身并导致循环进入递归函数。

非常感谢。

// // ---------------------------------------- //当我按下newGame按钮时调用此函数

    function startGame()
    {   
        clearInterval(timeInterval);
        run();
        // run function - run the recursive function below
        timeInterval = setInterval(randEnemyShots,frequencyShot);
        // randEnemyShots function - choose one enemey from all enemies to shot 
        // frequencyShot variable - this is the frequqncy of shots 
    }

// ---------------------------------------- //

    function run()
    {
        var loop=function(){
            if(gameRuning)
            {
                update(); 
                // update function - all the logic of game
                render();
                // render function - drawing the game 
                window.requestAnimationFrame(loop,canvas);
            }
        };
        window.requestAnimationFrame(loop,canvas);
    }

// --------------------------------------------- -------------------------------------------------- ------------------------ //

2 个答案:

答案 0 :(得分:1)

问题在于,当您点击“开始”按钮时,您再次调用run()功能,这有效地使游戏速度加倍。

run()函数应该只在游戏初始化时调用一次,这样游戏循环就可以无限期地运行。

function gameInit(){
    //Initialisation code here
    run(); //Start the game loop only once
}

function startGame() {   
    //Handle 'Start' button click
    clearInterval(timeInterval);
    timeInterval = setInterval(randEnemyShots,frequencyShot);
}

如果设置为false,则可以使用gameRuning值来“暂停”循环。

答案 1 :(得分:0)

最好使用setTimeout(带检查)而不是setInterval。由于setInterval的行为和成本通常很奇怪。