var canvas = document.getElementById('gameCanvas');
var ctx = canvas.getContext('2d');
var xPosition = 0;
var yPosition = 0;
var frameLength = 20;
function gameLoop(){
gameUpdate();
setTimeout(function(){gameLoop()}, frameLength);
}
function gameUpdate(){
ctx.clearRect(0, 0, 480, 640);
window.addEventListener('keydown', function(event){switch(event.keyCode){case 38: yPosition -= 1; break; case 40: yPosition += 1; break;}}, false);
ctx.fillRect(xPosition, yPosition, 50, 50);
}
$(document).ready(function() {
gameLoop();
});
화살표 키를 사용하여 캔버스에서 사각형을 이동하려고합니다. X 및 Y 위치는 변수 xPosition 및 yPosition입니다. 지금은 Y 방향을 엄격하게 다루기 때문에 "keydown"에 대한 eventlistener에 의해 트리거되는 스위치 기능이 있습니다. 예를 들어, 아래쪽 화살표 키를 누르면 Y 값이 fillRect(X, Y, originX, OriginY)
으로 증가합니다. 그러면 전역 변수가 변경되고 새 좌표로 새 사각형이 Canvas에 그려집니다. GameLoop 재설정, 헹굼 반복. 그것이 내가 이론으로 작동하는 것을인지하는 방법입니다.이벤트가 발생하지 않고 각 루프 이후에 var yPosition이 증가하는 이유는 무엇입니까?
그러나 아무 이유없이 내가 아무 것도하지 않더라도 스크립트를 실행 시키면 길어질수록 "위"가 위로 또는 아래로 누르면 점프가 점프됩니다. 즉, 누를 때마다 setTimeout 루프 횟수에 의해 결정되는 많은 픽셀이 캔버스에서 시작됩니다. 왜 이것이, 어떻게 그것을 해결할 수 있습니까?
루프를 거칠 때마다 이벤트 수신기를 추가 할 필요가 없습니다. $ (document) .ready에서 처리하면 괜찮을 것입니다. – ericjbasti
이유에 대해 ** add ** EventListener라고 부릅니다 - 이전에 추가 한 이벤트 리스너를 제거하지 않습니다 !! – Pointy
'gameLoop'을'function'으로 둘러 쌀 필요가 없습니다.'setTimeout (gameLoop, frameLength);'라고 쓰십시오. –