Следующий код создает холст с шаром в центре, когда вызывается метод init()
, используя setInterval
. Когда происходит событие keydown()
, шар перемещается по осям X и Y (в зависимости от того, какую клавишу нажал пользователь). Я пытаюсь понять, что происходит, когда нажата клавиша.Понимание Javascript asynchronous setInterval in canvas
Имеет ли setInterval
остановку, когда клавиша нажата, чтобы обновить значение ключа (keyLeft
, keyRight
и т.д.), а затем возобновляется и принимает обновленные значения во внимание
ИЛИ
ли код внутри ключевое событие выполняется, пока выполняется setInterval
?
Я читал, что setInterval
является асинхронным, а ключевые события синхронны, и поскольку Javascript является одиночным, второй вариант не может быть правдой, верно? Я мог бы действительно использовать ваши знания по этому вопросу.
<canvas id="canvas" style="border: 1px solid black" width="400" height="400"></canvas>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
var Ball = {
positionX: 200,
positionY: 200,
keyLeft: false,
keyRight: false,
keyUp: false,
keyDown: false,
init: function() {
this.canvas = document.getElementById('canvas');
this.ctx = this.canvas.getContext('2d');
setInterval(Ball.draw, 10);
},
circle: function (x, y, fill) {
this.ctx.beginPath();
this.ctx.arc(x, y, 20, 0, Math.PI * 2, false);
if (fill) {
this.ctx.fill();
} else {
this.ctx.stroke();
}
},
draw: function() {
Ball.ctx.clearRect(0, 0, 400, 400);
if (Ball.keyLeft) Ball.positionX -= 5;
else if (Ball.keyRight) Ball.positionX += 5;
if (Ball.keyUp) Ball.positionY -= 5;
else if (Ball.keyDown) Ball.positionY += 5;
Ball.circle(Ball.positionX, Ball.positionY, true);
}
}
Ball.init();
$('body').keydown(function (e) {
var key = e.keyCode;
if (key == 37) {
Ball.keyLeft = true;
} else if (key == 39) {
Ball.keyRight = true;
}
if (key == 38) {
Ball.keyUp = true;
} else if (key == 40) {
Ball.keyDown = true;
}
});
</script>
'e.which' является более удобным для браузера, просто говоря. –