Сделайте так, чтобы события onkeydown происходили только один раз для определенных ключей

В java char есть int. Ваш первый фрагмент печатает символ, соответствующий значению 1 в схеме кодирования по умолчанию (что, вероятно, является Unicode). Символ Unicode U + 0001 является непечатаемым символом, поэтому вы не видите никакого вывода.

Если вы хотите распечатать символ «1», вы можете посмотреть значение '1' в используемой схеме кодирования. В Unicode это 49 (то же, что и ASCII). Но это будет работать только для цифр 0-9.

Возможно, вам лучше использовать String, а не char, и использовать встроенный метод toString() Java:

int a = 1;
String b = toString(a);
System.out.println(b);

Это будет работать независимо от вашей системной кодировки и будет работать для многозначных чисел.

0
задан Flimzy 17 January 2019 в 07:14
поделиться

3 ответа

Измените function() на function(e), и нажатая клавиша находится в e.key

(после фрагмента запуска нажмите на белый прямоугольник под кнопкой запуска и нажмите клавиши)

[ 119]
var shouldHandleKeyDown = true;
document.onkeydown = function(e) {
  if (!shouldHandleKeyDown) return;
  shouldHandleKeyDown = false;
  console.log(e.key);
      // HANDLE KEY DOWN HERE
}

document.onkeyup = function(){
  shouldHandleKeyDown = true;
}

0
ответ дан Kamil Kiełczewski 17 January 2019 в 07:14
поделиться

Я бы игнорировал события onkeydown и просто использовал onkeyup. Таким образом, событие запускается только после того, как пользователь поднимает палец, обеспечивая только одно движение за нажатие клавиши.

Чтобы определить, какая клавиша была нажата в вашем обработчике событий, передайте событие в вашу функцию. Здесь - ссылка на значения ключей, поэтому вы можете сделать что-то вроде:

document.onkeyup = function(event) {
    var keycode = event.keyCode;

    if (keycode === 38) {
        moveUp();
    }
}
0
ответ дан pseudobbs 17 January 2019 в 07:14
поделиться

Нет единственного хорошего способа решения этой проблемы, в основном это зависит от того, что вы будете делать с этими ключевыми входами.

Например, если он предназначен для управления постоянно обновляемой анимацией, то простые семафоры в словаре с {left: bool, right: bool, up: bool, down: bool} устанавливаются на true в keydown и на false в ] keyup , и этого достаточно для проверки каждого кадра.

const directions = {
  up: false,
  right: false,
  down: false,
  left: false
};
onkeydown = e => {
  const key = e.key.replace('Arrow', '').toLowerCase();
  if(key in directions) {
    e.preventDefault();
    directions[key] = true;
  }
};
onkeyup = e => {
  const key = e.key.replace('Arrow', '').toLowerCase();
  if(key in directions) {
    e.preventDefault();
    directions[key] = false;
  }
};
const w = canvas.width = innerWidth;
const h = canvas.height = innerHeight;
const ctx = canvas.getContext('2d');
const character = {
  x: w/2,
  y: h/2,
  update: function() {
    const speed = 2;
    // this is where we will check our keyboard's status
    // we do it every frame
    let dir_x = 0,
      dir_y = 0;
    dir_x += directions.left ? -1 : 0;
    dir_x += directions.right ? 1 : 0;
    dir_y += directions.up ? -1 : 0;
    dir_y += directions.down ? 1 : 0;
    this.x += dir_x * speed;
    this.y += dir_y * speed;
  },
  draw: function() {
    ctx.fillRect(this.x - 20, this.y-20, 40, 40);
  }
};

function anim() {
  character.update();
  ctx.clearRect(0,0,w, h);
  character.draw();
  requestAnimationFrame(anim);
}
anim();
:root,body{margin:0px}
<canvas id="canvas"></canvas>

Однако, если вы не держите непрерывный цикл анимации и вам действительно нужно это событие для запуска сначала, затем в обработчике клавиш вам может понадобиться добавить логику

...
if(key in directions) {
  e.preventDefault();
  const changed = directions[key] !== true;
  directions[key] = true;
  if(changed) {
    triggerChange(key);
  }
}

, где triggerChange(key) будет функцией, готовой для запуска вашего сольного действия.

const directions = {
  up: false,
  right: false,
  down: false,
  left: false
};

function triggerChange(dir) {
  character.update();
}

onkeydown = e => {
  const key = e.key.replace('Arrow', '').toLowerCase();
  if (key in directions) {
    e.preventDefault();
    const changed = directions[key] !== true;
    directions[key] = true;
    if (changed) {
      triggerChange(key);
    }
  }
};
onkeyup = e => {
  const key = e.key.replace('Arrow', '').toLowerCase();
  if (key in directions) {
    e.preventDefault();
    directions[key] = false;
  }
};

const w = canvas.width = innerWidth;
const h = canvas.height = innerHeight;
const ctx = canvas.getContext('2d');
const character = {
  x: w / 2,
  y: h / 2,
  update: function() {
    const speed = 5;
    // this is where we will check our keyboard's status
    // we do it every frame
    let dir_x = 0,
      dir_y = 0;
    dir_x += directions.left ? -1 : 0;
    dir_x += directions.right ? 1 : 0;
    dir_y += directions.up ? -1 : 0;
    dir_y += directions.down ? 1 : 0;
    this.x += dir_x * speed;
    this.y += dir_y * speed;
  },
  draw: function() {
    ctx.fillRect(this.x - 20, this.y - 20, 40, 40);
  }
};

function anim() {
  // it is now keydown that is responsible for character.update()
  ctx.clearRect(0, 0, w, h);
  character.draw();
  requestAnimationFrame(anim);
}
anim();
:root,body{margin:0}
<canvas id="canvas"></canvas>

0
ответ дан Kaiido 17 January 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: