2012-09-05 1 views
14

thể trùng lặp:
JavaScript move delay and multiple keystrokesLàm thế nào để sửa chữa chậm trễ trong javascript KeyDown

Tôi mới và học HTML5 canvas cùng với javascript. Tôi đã tạo một sự kiện để di chuyển một đối tượng sang trái và phải, và sự cố của tôi là sự chậm trễ bất cứ khi nào bạn giữ phím hoặc chuyển sang một khóa khác. Tôi biết có thiếu mã của tôi dưới đây hãy giúp tôi. Cảm ơn bạn trước.

c.addEventListener('keydown',this.check,true); 
    function check(el) { 
    var code = el.keyCode || el.which; 
    if (code == 37 || code == 65){ 
    x -=1; 
    } 

    if (code == 39 || code == 68){ 
    x += 1; 
    } 

    el.preventDefault(); 
} 
+1

Việc chậm trễ lặp lại là một môi trường hệ điều hành, không phải là một điều Javascript –

Trả lời

28

Thay vì cố gắng phản ứng trực tiếp với sự kiện phím tắt, tôi khuyên bạn nên sử dụng các sự kiện keydown và keyup để duy trì danh sách các phím hiện tại. Sau đó, thực hiện "vòng lặp trò chơi" để kiểm tra mỗi x mili giây mà các phím sẽ bị hỏng và cập nhật màn hình cho phù hợp.

var keyState = {};  
window.addEventListener('keydown',function(e){ 
    keyState[e.keyCode || e.which] = true; 
},true);  
window.addEventListener('keyup',function(e){ 
    keyState[e.keyCode || e.which] = false; 
},true); 

x = 100; 

function gameLoop() { 
    if (keyState[37] || keyState[65]){ 
     x -= 1; 
    }  
    if (keyState[39] || keyState[68]){ 
     x += 1; 
    } 

    // redraw/reposition your object here 
    // also redraw/animate any objects not controlled by the user 

    setTimeout(gameLoop, 10); 
}  
gameLoop(); 

Bạn sẽ nhận thấy điều này cho phép bạn xử lý nhiều khóa cùng một lúc, ví dụ: nếu người dùng nhấn mũi tên trái và lên cùng nhau và sự cố chậm trễ giữa các sự kiện quan trọng tiếp theo khi phím bị khóa đi vì tất cả những gì bạn thực sự quan tâm là liệu một keyup có xảy ra hay không.

Tôi nhận ra bạn có thể không được thực hiện một trò chơi, nhưng "trò chơi vòng lặp" này khái niệm nên làm việc cho bạn như thể hiện trong bản demo này rất đơn giản: http://jsfiddle.net/nnnnnn/gedk6/

+1

Không có gì. (Lưu ý rằng có nhiều kỹ thuật phức tạp hơn mà các lập trình viên trò chơi nghiêm túc sẽ sử dụng để kiểm soát tốc độ của vòng lặp trò chơi, nhưng bạn có thể sử dụng Google nếu bạn quan tâm - câu trả lời này được dự định là phần giới thiệu đơn giản cho vòng lặp trò chơi và khóa- các khái niệm trạng thái để giúp bạn vượt qua vấn đề hiện tại của mình.) – nnnnnn

+0

@nnnnnn Đoạn mã này trở thành giải pháp cho vấn đề tôi đang gặp phải. Cảm ơn mã! Tuy nhiên, có cách nào tôi có thể phát hiện một 'keyup' (để tôi có thể kích hoạt một chức năng khác)? – AKG

+2

@AKG - Vâng, ví dụ tôi đưa ra đã có trình xử lý khóa, vì vậy bạn có thể thêm cuộc gọi vào chức năng của mình tại đó. Hoặc chỉ cần thêm một trình xử lý khóa thứ hai. – nnnnnn