将keydown保存在数组中并执行

时间:2013-01-27 19:49:41

标签: javascript jquery

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

我有一个setInterval函数,就像游戏Timer一样,它只是一直循环自我。我添加了一个监听器和一个数组来保存密钥。

我检查了数组中的键,看起来很好但是,函数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. 这是一个好主意吗? (如果没有,请随时向我推荐另一个:))
  3. (对不起我的英文)

2 个答案:

答案 0 :(得分:1)

不是将按下的键存储在数组中,使每个键代码激活“移动”数组中的相关变量。例如按下左键时,movement['left']=1。使用keyup将其重新设置为0.

让你的循环检查数组中每个可能的移动,并在corelance中触发相关的函数,以便在给定时刻进行主动移动。

答案 1 :(得分:1)

在setInterval中注册eventhandler总是错误的。在您的情况下,您每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上,你再次重置这些标志(需要另一个事件处理程序)。