如何处理主游戏循环中的键盘事件?

时间:2016-09-02 15:01:51

标签: javascript keyboard-shortcuts keyboard-events game-loop

我正在用JavaScript编写一个简单的游戏,它已经处理了基本的键盘输入,如下所示:

var input = {};
document.onkeydown = function(e) {
    input[e.keyCode] = true;
}
document.onkeyup = function(e) {
    input[e.keyCode] = false;
}

while (!done) {
    handleInput(input);
    update();
    render();
}

现在我需要游戏来处理关键组合(例如CTRL + X)。我希望它仅在keyup 上接受这样的组合。

编辑:修改键不需要与" main"同时进行全部操作。键。的 /修改

我想到的两种可能的解决方案是:

  • 公开一个包含keyup事件列表的数组(对象带有#34; main"键加修饰符)。每次轮询时,handleInput函数都会负责排空队列
  • 跟踪handleInput内的可能关键组合(观察按住修改键)并在" main"时触发组合行为。钥匙上升(我实际上并不喜欢这样)

您是否建议我使用优雅的方式扩展当前的功能?

4 个答案:

答案 0 :(得分:1)

您所要做的就是创建upInput变量,在其中存储您的密钥键。然后,要检查是否按下了组合,您必须检查是否只有CTRL + C(或17,67)变量中的组合,如果所有这些都是true。然后轻松打印您的消息并重置upInput变量。

var input = upInput = {};

document.onkeydown = function(e) {
    input[e.keyCode] = true;
    if (JSON.stringify(Object.keys(upInput)) != '["17","67"]')
        upInput = {};
}
document.onkeyup = function(e) {
    var k = e.keyCode;
    input[k] = false;
    if ([17, 67].indexOf(k) > -1)
        upInput[k] = true;
    if (JSON.stringify(Object.keys(upInput)) == '["17","67"]'
            && upInput[17] && upInput[67]) // CTRL + C
        alert('YES!'),
        upInput = {};
}

Demo

希望有所帮助!

答案 1 :(得分:1)

试试这个;) 当您按CTRL + X并释放其中一个(或两个)时,它将显示一条消息

var map = {17: false, 88: false};
var fire_event = false;

window.addEventListener('keydown', function(e) {
    if (e.keyCode in map) {
        map[e.keyCode] = true;
        if (map[17] && map[88]) {
            fire_event = true;
        }
    }
}, false);

window.addEventListener('keyup', function(e) {
    if (e.keyCode in map) {
        map[e.keyCode] = false;
    }
    if (fire_event) {
        fire_event = false;
        alert('YOU PRESSED CTRL + X');
    }
}, false);

答案 2 :(得分:0)

我会以其中一种方式做到:

  • 检查handleInput部分中的组合(您的类型 第二个apporach)
  • 保存最后X个键盘事件的列表(其中X是最大值 组合序列的长度)并检查此列表是否匹配 任何预定义的组合触发器

答案 3 :(得分:0)

尝试它是否有效:

var KEY_QUEUE = [];
var KEYs = [17, 88];

document.onkeydown = function (e) {
    if (KEY_QUEUE.indexOf(e.keyCode) === -1) {
        KEY_QUEUE.push(e.keyCode);
    }
};

document.onkeyup = function (e) {
    var index = KEY_QUEUE.indexOf(e.keyCode);
    if ( isSubArray(KEYs, KEY_QUEUE) 
         && KEYs.indexOf(e.keyCode) > -1 ) {
        console.log("You press CTRL + X");
    }
    KEY_QUEUE.splice(index, 1);
};

function isSubArray(ary, targetAry) {
  return new RegExp(ary.toString()).test(targetAry.toString());
}

我检查了一些案例,例如Ctrl xx CtrlCtrl x aCtrl a x,它的工作原理与我预期的一样。但我不确定你的想法是否相同。