0

我正在创建一个简单的 2d 游戏,我想将 keydown 键保存到数组中,并在循环中执行它们,这样用户就可以按住一个键,让它看起来像是在不停地移动。

我有一个 setInterval 函数,它就像一个游戏计时器,它一直在循环它。我添加了一个监听器和一个数组来保存密钥。

我检查了数组内的键,它看起来不错,但是函数 moveRight 和 moveLeft 无法正常工作。

这是代码:

      this.keysPressed = new Array();
      InitGameLoop: function () {
        var that = this;
        setInterval(function () {
            $(document).keydown(function (e) {
                var key = e.which;
                that.keysPressed.push(key);
                for (var i = 0; i < that.keysPressed.length; i++) {
                    if (that.keysPressed[i] == 38) {
                        that.moveRight(worldWidth, 10);
                    }
                    else if (that.keysPressed[i] == 37) {
                        that.moveLeft(10);
                    }
                    log(that.keysPressed, that.yPos);
                    that.keysPressed.pop();
                }
            });
        }, 60);

我的问题是:

  1. 我在做什么?
  2. 这是一个好主意吗?(如果没有,请随时向我推荐另一个:))

(对不起我的英语不好)

4

2 回答 2

1

不要将按下的键存储在数组中,而是让每个键代码激活“运动”数组中的相关变量。例如,当按下左键时,movement['left']=1。用于keyup将其设置回 0。

让您的循环检查每个可能的运动的阵列,并在给定时刻触发相关功能到活动运动。

于 2013-01-27T20:09:32.747 回答
1

在 setInterval 中注册事件处理程序总是错误的。在您的情况下,每 60 毫秒您将创建一个额外的侦听器,当您按下一个键时,您的所有侦听器都会触发。此外,绝对不需要将它们存储在数组中。只需注册一次侦听器,每次按下键时都会触发。如果按下了多个键,侦听器将分别为每个键触发。

$(document).keydown(function (e) {
     var key = e.which;
     console.log(key);
     // call your according functions here
     switch (key){
     case 37: // moving left
        // do stuff
        // set a flag to indicate that you are moving left
        moveleft = true;
        break;
     case 39: // moving right
        // do stuff
        // set a flag to indicate that you are moving right
        moveright = true;
        break;
     }
});

由于您正在捕获 keydown,因此您应该设置标志。这样您就可以跟踪当前按下了哪些键。在 keyup 上,您将再次重置这些标志(需要另一个事件处理程序)。

于 2013-01-27T20:09:48.900 回答