2012-09-05 12 views
14

संभव डुप्लिकेट जावास्क्रिप्ट में देरी ठीक करने के लिए:
JavaScript move delay and multiple keystrokesकैसे keydown

मैं नए और जावास्क्रिप्ट के साथ एक साथ एचटीएमएल 5 कैनवास सीख रहा हूँ। मैंने ऑब्जेक्ट को बाएं और दाएं स्थानांतरित करने के लिए एक ईवेंट बनाया है, और जब भी आप कुंजी पकड़ते हैं या दूसरी कुंजी पर स्विच करते हैं तो मेरी समस्या विलंब होती है। मुझे पता है कि नीचे दिए गए मेरे कोड पर गायब है कृपया मेरी मदद करें। पहले ही, आपका बहुत धन्यवाद।

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

दोहराने देरी एक OS की स्थापना, नहीं एक जावास्क्रिप्ट बात –

उत्तर

28

बल्कि keydown घटना के लिए सीधे प्रतिक्रिया करने के लिए कोशिश कर रहा से, मैं तुम्हें एक सूची है जो की कुंजी वर्तमान में नीचे हैं बनाए रखने के लिए keydown और KeyUp घटनाओं का उपयोग सुझाव देना चाहेंगे। फिर एक "गेम लूप" लागू करें जो प्रत्येक एक्स मिलीसेकंड की जांच करता है जो कुंजी नीचे हैं और तदनुसार डिस्प्ले अपडेट करें।

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(); 

आप इस आप एक साथ कई चाबियाँ संभाल, जैसे, उपयोगकर्ता बाएं प्रेस और ऊपर एक साथ तीर, और जब एक कुंजी के दबे बाद keydown घटनाओं के बीच देरी की समस्या हो जाता है तो देता है कि ध्यान देंगे जब से आप वास्तव में परवाह करते हैं, तो एक कुंजीपटल हुआ है या नहीं।

मुझे पता है आप एक खेल को लागू नहीं किया जा सकता है, लेकिन इस "खेल लूप" अवधारणा के रूप में यह बहुत ही सरल डेमो में दिखाया गया है आप के लिए काम करना चाहिए: http://jsfiddle.net/nnnnnn/gedk6/

+1

है आपका स्वागत है। (ध्यान दें कि ऐसी जटिल तकनीकें हैं जो गंभीर गेम-कोडर गेम लूप की गति को नियंत्रित करने के लिए उपयोग करेंगे, लेकिन यदि आप रुचि रखते हैं तो आप Google को उन लोगों को कर सकते हैं - यह उत्तर गेम लूप और कुंजी- राज्य की अवधारणाएं आपको अपनी वर्तमान समस्या से दूर करने के लिए।) – nnnnnn

+0

@nnnnnn यह कोड स्निपेट मेरे पास होने वाली समस्या का समाधान बन गया है। कोड के लिए धन्यवाद! हालांकि, क्या कोई तरीका है कि मैं 'कीप' का पता लगा सकता हूं (ताकि मैं एक और फ़ंक्शन को आग लगा सकूं)? – AKG

+2

@AKG - ठीक है, मैंने जो उदाहरण दिया है, उसके पास पहले से ही एक कीप हैंडलर है, इसलिए आप वहां अपने फ़ंक्शन में एक कॉल जोड़ सकते हैं। या बस एक दूसरा कीप हैंडलर जोड़ें। – nnnnnn

संबंधित मुद्दे