V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
kokdemo
V2EX  ›  JavaScript

js 有没有办法捕获同时按下的两个按键?

  •  
  •   kokdemo · 2015-04-08 22:15:19 +08:00 · 4250 次点击
    这是一个创建于 3513 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这两天在研究按键的捕获,实用的场景是这样的:

    某格斗游戏,有一个招式是 ↓↘→D 现在需要打出这个斜的按键。我用的是wasd来模拟的方向键。

    于是先考虑记录两次按键的间隔,如果按下s和d的间隔足够小,就认为是一个斜向按键,于是这个招式只按了s和d两次,就发出三个方向。

    然后后面又有一个招式是 ↘D ……

    所以问题来自于记录不了同时按键的时候按下的状态,只能捕捉到按下的动作。有什么方法可以解决这个问题么?

    PS: 这个游戏是拳皇……

    5 条回复    2015-04-09 09:59:05 +08:00
    chekun
        1
    chekun  
       2015-04-08 22:18:02 +08:00
    也许你需要的是这个 https://github.com/SimonWaldherr/konami.js
    jedihy
        2
    jedihy  
       2015-04-08 23:20:55 +08:00 via iPhone
    克拉克的指令投
    DolphinWood
        3
    DolphinWood  
       2015-04-09 01:09:45 +08:00
    把按键状态缓存下来,类似这样:

    ```javascript
    var pressingStatus = {};

    elem.onkeydown = function (e) {
    pressingStatus[e.keyCode] = true;

    if (pressingStatus[keyA] && pressingStatus[keyB] && ...) {
    // do something
    }
    };

    elem.onkeyup = function (e) {
    pressingStatus[e.keyCode] = false;
    }
    ```
    kokdemo
        4
    kokdemo  
    OP
       2015-04-09 08:24:14 +08:00
    @DolphinWood
    @chekun 你发的那个konami.js 的思路就是三楼的思路,我觉得不错,晚上回来试试
    BoiledEgg
        5
    BoiledEgg  
       2015-04-09 09:59:05 +08:00
    可以借用underscore的debounce方法实现,做成某个延时内响应的按键都推迟该延时回调方法的调用,而这个回调方法的作用就是清除3楼提到的pressingStatus,这样避免按着不动然后再同时松开,也能简单的触发连招。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5400 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 08:07 · PVG 16:07 · LAX 00:07 · JFK 03:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.