将键关闭保存在数组中并执行

save keydown in array and executes

本文关键字:数组 执行 存在 保存      更新时间:2023-09-26

im 创建一个简单的 2D 游戏,我想将键下键保存到数组中,并在循环中执行它们,这样用户就可以按住一个键并使其看起来像图表器在不停地移动。

我得到了一个 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. 这是个好主意吗?(如果没有,请随时向我推荐另一个:))

(对不起我的英语)

在 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;
     }
});

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

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

让你的循环检查数组中每个可能的移动,并在给定时刻触发相关函数到活动运动。