繁体   English   中英

跟踪 Canvas 中的按键

[英]Keeping track of key presses in Canvas

我试图在游戏循环中使用 canvas 跟踪最后 4 次按键。

var lastKeys = []; // array to hold last 4 key presses
window.addEventListener("keydown", key_down, false); // key down
window.addEventListener("keyup", key_up, false); // key up

var keycode = "";
if (key.left  == true)  keycode = "left";
if (key.right == true)  keycode = "right";
if (key.up    == true)  keycode = "up";
if (key.down  == true)  keycode = "down";

And later on in the draw phase...
// add new element
lastKeys.unshift(keycode);
// remove last element
lastKeys.pop();

lastKeys 数组应该记录[up, down, left right] ,它只会记录[right, right, right right] ,在下面的示例中什么都没有。 - 因为每次滴答都会记录最后一次按键并覆盖内容。 只有我对如何解决这个问题有点困惑。

有人可以帮帮我吗?

最低代码如下:index.html

<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset="utf-8" />
<title>Minimum</title>
<link href = "stylesheet.css" rel = "stylesheet">

</head>

<body>

<canvas id="canvas" width="640" height="360"></canvas>
<!-- get keys -->
<script type="text/javascript" src="js/keys.js"></script>
<!-- call last -->
<script type="text/javascript" src="js/main.js"></script>

</body>
</html>

main.js

// declare canvas
var canvas = document.getElementById('canvas'),
  ctx = canvas.getContext('2d'),


  key =
  {
    right: false,
    left: false,
    up: false,
    down: false,
  }

  const canvasW = canvas.width;
  const canvasH = canvas.height;

// end canvas declarations


//vegetables
// -------------------------------
var lastKeys = [];
var keyCode = -1;


// initalise 
function init()
{

  // initialise keys
  window.addEventListener("keydown", key_down, false); // key down
  window.addEventListener("keyup", key_up, false); // key up

  // window.addEventListener("keydown", function (e)
  // {
  //   keys[e.keyCode] = true;
  // });

  // window.addEventListener("keyup", function (e)
  // {
  //   keys[e.keyCode] = false;
  // });

}

// call initialization
init();


// Draw frames
setInterval( render, 16 );




function render()
{
   get_keys();

}

function get_keys()
{

  if (key.left     === true) keyCode = 37;
  if (key.up       === true) keyCode = 39;
  if (key.right    === true) keyCode = 38;
  if (key.down     === true) keyCode = 40;
  console.log("K: " + keyCode);

  // add new element
  lastKeys.unshift(keyCode);
  // remove last element
  lastKeys.pop();

  console.log(lastKeys);
}

键.js

// declare canvas
var canvas = document.getElementById('canvas'),
  ctx = canvas.getContext('2d'),


  key =
  {
    right: false,
    left: false,
    up: false,
    down: false,
  }

  const canvasW = canvas.width;
  const canvasH = canvas.height;

// end canvas declarations


//vegetables
// -------------------------------
var lastKeys = [];
var keyCode = -1;


// initalise 
function init()
{

  // initialise keys
  window.addEventListener("keydown", key_down, false); // key down
  window.addEventListener("keyup", key_up, false); // key up

  // window.addEventListener("keydown", function (e)
  // {
  //   keys[e.keyCode] = true;
  // });

  // window.addEventListener("keyup", function (e)
  // {
  //   keys[e.keyCode] = false;
  // });

}

// call initialization
init();


// Draw frames
setInterval( render, 16 );




function render()
{
   get_keys();

}

function get_keys()
{

  if (key.left     === true) keyCode = 37;
  if (key.up       === true) keyCode = 39;
  if (key.right    === true) keyCode = 38;
  if (key.down     === true) keyCode = 40;
  console.log("K: " + keyCode);

  // add new element
  lastKeys.push(keyCode);
  if (lastKeys.length > 4)
  {
    // remove last element
    lastKeys.pop();
  }

  console.log(lastKeys);
}

您需要在整个文档上添加事件,然后使用tabIndex或通过像下面的代码一样自己关注 canvas

 const canvas = document.getElementById('someCanvas'); const log = document.getElementById('log'); let lastDownTarget console.log(canvas, log); document.addEventListener('mousedown', function(event) { lastDownTarget = event.target; alert('mousedown'); }, false); document.addEventListener('keydown', e => { if(lastDownTarget == canvas) { log.textContent += e.code; } }, false); document.addEventListener('keyup', e => { if(lastDownTarget == canvas) { log.textContent += e.code; } }, false);
 <canvas id="someCanvas" width="500" height="300" style="border:1px solid #000000;"></canvas> <p id="log"></p>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM