2015-06-25 136 views
2

我在想如果我的键盘坏了,或者我的代码有问题。 下面的代码检测用户是否按下“u”,“d”,“j”和“m”键。未检测到键盘的按键

似乎不可能认识到所有四个键一次被按下。当按下3个键时,它最多可以检测到。我似乎无法找到问题。我将非常感谢您的帮助。

var jkeypressed = false; 
 
var ukeypressed = false; 
 
var dkeypressed = false; 
 
var mkeypressed = false; 
 

 

 
function yeah() { 
 
    var canvas = document.getElementById("canvas"); 
 
    var context = canvas.getContext("2d"); 
 
    canvas.height = 500; 
 
    canvas.width = 500; 
 

 

 
    document.addEventListener("keydown", function(ev) { 
 
    switch (ev.keyCode) { 
 
     case 77: 
 
     mkeypressed = true; 
 
     break; 
 
     case 74: 
 
     jkeypressed = true; 
 
     break; 
 
     case 85: 
 
     ukeypressed = true; 
 
     break; 
 
     case 68: 
 
     dkeypressed = true; 
 
     break; 
 
    } 
 
    }, false); 
 

 
    document.addEventListener("keyup", function(ev) { 
 
    switch (ev.keyCode) { 
 
     case 77: 
 
     mkeypressed = false; 
 
     break; 
 
     case 74: 
 
     jkeypressed = false; 
 
     break; 
 
     case 85: 
 
     ukeypressed = false; 
 
     break; 
 
     case 68: 
 
     dkeypressed = false; 
 
     break; 
 
    } 
 
    }, false); 
 

 
    context.fillStyle = "#33CCFF"; 
 
    context.font = "20px Arial"; 
 
    context.fillText(dkeypressed + ' ' + jkeypressed + ' ' + ukeypressed + ' ' + mkeypressed, 300, 50); 
 

 
} 
 
var x = setInterval(yeah, 1);
<canvas id="canvas"></canvas>

+0

document.body.addEventListener - 你忘了身体的一部分 – DUUUDE123

+0

感谢您的回复,老兄!我做了这个改变,但是页面仍然不会显示所有键为“真” – coder452

+1

我认为这是你的键盘(但不一定是坏掉的)。见http://gaming.stackexchange.com/questions/6669/how-do-i-remove-the-limit-on-pc-keyboard-button-presses –

回答

2

您可以简化代码: 有些事情,我注意到/固定:

  • 脚本不是身体
  • 添加 “键” 阵列是成立的,/false keyCode
  • 清理程序更新代码 (不切换,只有testin在KEYUP和的keydown而不是每一个 毫秒)
  • 画布没有被清除摹

我希望这有助于:)

<!DOCTYPE html> 
<html> 
    <head> 
    </head> 

    <body> 

    <canvas id="canvas"></canvas> 

    <script> 

    var keys = []; 

    var jkeypressed = false; 
    var ukeypressed = false; 
    var dkeypressed = false; 
    var mkeypressed = false; 

    var canvas = document.getElementById("canvas"); 
     canvas.height = 500; 
     canvas.width = 500; 
     var context = canvas.getContext("2d"); 
      context.fillStyle = "#33CCFF"; 
      context.font = "20px Arial"; 

    document.body.addEventListener("keydown", function(ev) 
    { 
     keys[ev.keyCode] = true; 
     update(); 
    }, false); 

    document.body.addEventListener("keyup", function(ev) 
    { 
     keys[ev.keyCode] = false; 
     update(); 
    }, false); 

    function update() 
    { 
     mkeypressed = false; 
     jkeypressed = false; 
     ukeypressed = false; 
     dkeypressed = false; 

     if (keys[77]) 
     { 
      mkeypressed = true; 
     } 
     if (keys[74]) 
     { 
      jkeypressed = true; 
     } 
     if (keys[85]) 
     { 
      ukeypressed = true; 
     } 
     if (keys[68]) 
     { 
      dkeypressed = true; 
     } 

     context.clearRect(0, 0, canvas.width, canvas.height); 
     context.fillText("D: " + dkeypressed + " J: " + jkeypressed + " U: " + ukeypressed + " M: " + mkeypressed, 
     100, 100); 
    } 

</script> 
</body> 

</html> 
+0

谢谢老兄!感谢您向我展示如何使代码更高效!这将有助于优化我的游戏! – coder452

+0

我很好奇,你在制作什么类型的游戏,为什么你需要这些游戏中的键? – DUUUDE123

3

这个演示工作:事https://jsfiddle.net/3q9jnnp0/

夫妇:

你必须在每次通话时清除画布以重绘

只添加一次事件监听器一次不会百万次,它会使浏览器崩溃。

另外更新动画“高效”使用​​。使用它非常简单,只需传递一个函数来调用循环函数并调用一次即可。 http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/

var jkeypressed = false; 
var ukeypressed = false; 
var dkeypressed = false; 
var mkeypressed = false; 

var canvas = document.getElementById("canvas"); 
var context = canvas.getContext("2d"); 
canvas.height = 500; 
canvas.width = 500; 
context.fillStyle = "#33CCFF"; 
context.font = "20px Arial"; 

document.body.addEventListener("keydown", function (ev) { 
    switch (ev.keyCode) { 
     case 77: 
      mkeypressed = true; 
      break; 
     case 74: 
      jkeypressed = true; 
      break; 
     case 85: 
      ukeypressed = true; 
      break; 
     case 68: 
      dkeypressed = true; 
      break; 
    } 
}, false); 

document.body.addEventListener("keyup", function (ev) { 
    switch (ev.keyCode) { 
     case 77: 
      mkeypressed = false; 
      break; 
     case 74: 
      jkeypressed = false; 
      break; 
     case 85: 
      ukeypressed = false; 
      break; 
     case 68: 
      dkeypressed = false; 
      break; 
    } 
}, false); 


function yeah() { 
    context.clearRect(0, 0, canvas.width, canvas.height); 
    context.fillText(dkeypressed + ' ' + jkeypressed + ' ' + ukeypressed + ' ' + mkeypressed, 300, 50); 
} 
var x = setInterval(yeah, 1); 
+0

谢谢穆罕默德乌梅尔!你的演示绝对比我的效率更高!我认为这是我的键盘,这是检测问题的原因。再一次感谢你的帮助! – coder452

+0

不,我还没有检测到任何变化。但后来我查了一下发生了什么事,在每个keydown我都得到了3003333电话。所以也许这需要一些东西。 –