Javascript游戏循环 - 如何知道循环外的函数已经过了多少时间

时间:2015-12-15 04:27:36

标签: javascript loops

你必须知道我在javascript中对这个新游戏开发还是新手。

首先,我有这个游戏循环

GameLoop = {

  //Insert more members here if needed
  id : null,

  run : function(options) {

    var now,
        dt       = 0,
        //last     = timestamp(),
        last     = Date.now(),
        slow     = options.slow || 1, // slow motion scaling factor
        step     = 1 / options.fps || 60,
        slowStep = slow * step,
        update   = options.update,
        render   = options.render;


    function frame() {
        //now = timestamp();
        now = Date.now();
        dt = dt + Math.min(1, (now - last) / 1000);
        while(dt > slowStep) {
            dt = dt - slowStep;
            update(step);
        }
        render(dt / slow);
        last = now;
        this.id = requestAnimationFrame(frame, options.canvas);
    }
    this.id = requestAnimationFrame(frame);

  },

  pause : function() {
      cancelAnimationFrame(this.id);
  }

};

我是使用互联网上的一些文档和教程创建的。而我想知道如何拥有一个每1秒或每60帧更改一个状态变量的函数。例如,我可以在Draw方法中使用它:

//Moves enemy towards the player 30px every second
function moveEnemy() {
    if(one Second Has Passed Since Last Time We Moved) {
        enemy.xPosition += '30px';
    }
}

这只是我想要实现的一个假设的例子,我希望有这些游戏循环经验的人可以帮助我。如果您需要更多信息,请告诉我,或者我是否因某种原因需要更新我的问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果你的要求是每秒移动敌人一次,则不需要在框架循环内。

var enemyMoverInterval = setInterval(
    function moveEnemy() {
        enemy.xPosition += '30px';
    }
}, 1000);

编辑:如果你真的想在游戏循环中拥有它......

var enemyLastMoved = new Date();
GameLoop = {
    // ...
    function frame() {
        // ....
        if (now - enemyLastMoved > 1000) {
            enemy.xPosition += '30px';
            enemyLastMoved += 1000;
        }
        // ...

或混合方法:

var enemyMustMove = false;
setInterval(function() {
    enemyMustMove = true;
}, 1000);

并在游戏循环中:

        // .... 
        if (enemyMustMove) {
            enemyMustMove = false;
            enemy.xPosition += '30px';
        }

PS enemy.xPosition += '30px'可能不会做你想要的。