正如标题所说,我已经尝试了THREEx和Stemkovskis独立的KeyboardState.js,它们似乎都没有正确更新。
这是我的代码:
m_vKeyboard = new THREEx.KeyboardState();
// m_vKeyboard.update(); // if using stemkovskis
if (m_vKeyboard.pressed("F")) {
alert("And now it is always true!");
}
单击F键一次,将其释放;警告窗口弹出,单击确定,它会再次弹出所有永恒。怎么样?
答案 0 :(得分:1)
我想知道它是否与alert()是阻塞调用有关。使用下面的代码给我同样的问题。如果我注释掉alert()并取消注释console.log()它似乎工作正常。但是,我不确定这是否有助于解决您的问题。
var m_vKeyboard = new THREEx.KeyboardState();
setInterval(function () {
var key = "F";
var pressed = m_vKeyboard.pressed(key);
alert("And now it is always true!");
//console.log("key", key, "pressed", pressed);
}, 100);
答案 1 :(得分:1)
许多浏览器重复keydown
。阅读更多here和here (ctrl+f : auto-repeat)
。
以下是针对您的具体问题的建议解决方案:
一个。当keydown
在某个数组中将其状态存储为true
并在keyup
上将其设为假时。
wasPressed['F'] = true; //on keydown
wasPressed['F'] = false; //on keyup
B中。在检查下一个keydown
时也检查其状态。
if (m_vKeyboard.pressed("F") && !wasPressed['F'])
查找完整实施:Here
<强>更新强>
var wasPressed = {};
if( keyboard.pressed('F') && !wasPressed['f'] ){
alert("F was pressed");
prompt("Enter data : ");
wasPressed['f'] = true;
}
更新2
keyboard.domElement.addEventListener('keydown', function(event){
wasPressed = {};
})
答案 2 :(得分:0)
只需将其添加到KeyboardState.js中 onKeyDown
的开头:
if(event.repeat)return;& #xA; 代码>
&#XA;