Вот что вам нужно сделать концептуально (я думаю, это называется псевдокодом):
Начните с чего-то вроде этого:
var PIXEL_DELTA = 10; // Distance to move in pixels
var leftPressed = 0,
upPressed = 0,
downPressed = 0,
rightPressed = 0;
Затем при каждом событии keydown
проверьте, является ли нажатой клавиша left
, up
и т. Д., И измените ее значение с 0
на PIXEL_DELTA
.
При каждом событии keyup
выполняйте один и тот же тест и возвращайте правильную переменную обратно в 0
.
Затем, в вашем движущемся коде (реальном коде): (Этот код адаптирован из удивительного примера Crescent Fresh):
function move() {
var dot = document.getElementById('dot'),
deltaX = rightPressed - leftPressed,
deltaY = downPressed - upPressed;
if(deltaX) {
dot.style.left = (parseInt(dot.style.left, 10) || 0) + deltaX + 'px';
}
if (deltaY) {
dot.style.top = (parseInt(dot.style.top, 10) || 0) + deltaY + 'px';
}
}
Браузер будет (должен) запускать отдельное событие keydown
/ keyup
для каждой клавиши, даже если они нажаты "одновременно".
Рабочий пример
Crescent Fresh собрал полный пример на JSBin . Обязательно посетите редактируемую версию , а также поиграйте с кодом.