2011-05-03 12 views
5

मैं एक ब्राउज़र गेम में एक चरित्र को स्थानांतरित करने के लिए एक कोड लिख रहा हूं। मैं पिक्सल प्राप्त करने में कामयाब रहा, इसे प्रति सेकंड क्षैतिज और लंबवत दोनों स्थानांतरित करना चाहिए।सरल जावास्क्रिप्ट लूप जो प्रत्येक दूसरे को दोहराता है

pxsecx एक ही है, लेकिन खड़ी

मूल रूप से यह + = उन्हें वर्तमान क्षैतिज और ऊर्ध्वाधर स्थिति में होना चाहिए पिक्सेल की संख्या में यह प्रति सेकंड pxsecy क्षैतिज चाल करना चाहिए।

मुझे लूप को हर सेकेंड को दोहराने की आवश्यकता है जब तक कि तत्व स्थिति नई स्थिति (न्यूएक्स) को पूरा न करे।

यह जहाँ तक मैं चले गए हैं है:

<body onmousedown="showCoords(event)"> 
<script type="text/javascript"> 
function showCoords(evt){ 
    oldx = parseInt(document.getElementById("character").style.left); 
    oldy = parseInt(document.getElementById("character").style.top); 

    width = parseInt(document.getElementById("character").style.width); 
    height = parseInt(document.getElementById("character").style.height); 

    newx = evt.pageX - width/2; 
    newy = evt.pageY - height/2; 

    disx = newx - oldx; 
    disy = newy - oldy; 

    diag = parseInt(Math.sqrt(disx*disx + disy*disy)); 

    speed = 50; 

    secs = diag/speed; 

    pxsecx = disx/secs; 
    pxsecy = disy/secs; 

    while(document.getElementById("character").style.left<newx) 
     { 
     document.getElementById("character").style.left += pxsecx; 
     document.getElementById("character").style.top += pxsecy; 
     } 
} 
</script> 

सब कुछ है, जबकि मैं कहाँ पता नहीं कैसे यह हर दूसरे काम करने के क्या करना है जब तक काम करता है। मैं इसे यहां परीक्षण कर रहा हूं: http://chusmix.com/game/movechar.php

मैं इसे दोहराने के लिए कैसे दोहरा सकता हूं ताकि यह काम करता हो? इसलिए आप इस एक छोटे से फिर से लिखने की आवश्यकता होगी

धन्यवाद

उत्तर

9

जावास्क्रिप्ट, मुख्य रूप से अतुल्यकालिक है। setTimeout एक निश्चित समय के बाद एक समारोह निष्पादित करता है। इसलिए, आप यह कर सकते हैं:

(function move() { 
    var character=document.getElementById("character"); 
    if(character.style.left<newx) { 
     character.style.left += pxsecx; 
     character.style.top += pxsecy; 
     setTimeout(move, 1000); 
    } 
})(); 
+0

आपके उत्तर के लिए धन्यवाद, आप कृपया मुझे बताओ कैसे यह मेरी स्क्रिप्ट में शामिल करने के लिए कर सकता है। मैंने कोशिश की लेकिन मैं जावास्क्रिप्ट पर भयानक हूँ। क्या आप सिर्फ अंतिम कोड पेस्ट कर सकते हैं? मुझे नहीं पता कि इसे कैसे शामिल किया जाए। बहुत बहुत धन्यवाद – lisovaccaro

+0

बस इसके साथ अपने वर्तमान 'while' लूप को प्रतिस्थापित करें। – icktoofay

+0

क्या इससे कोई फर्क नहीं पड़ता कि आपके द्वारा कथन में तुलना की जाने वाली मान एक ही प्रकार की नहीं हैं। 'अगर (" 100px "<432) 'हमेशा झूठी वापसी लगता है। यह कामकाजी कोड प्रतीत नहीं होता है हालांकि यह करीब है। क्या आप दोबारा जांच सकते हैं? मुझे लगता है कि एक बार आपके प्रकार एक जैसे हैं, यह काम करेगा, लेकिन इस वर्तमान प्रारूप में नहीं। – jmort253

0

आप जावास्क्रिप्ट setTimeout() फ़ंक्शन चाहते हैं। यह हर एन मिलीसेकंड्स को एक समारोह कहते हैं।

+1

मिलीसेकंड, माइक्रोसेकंड नहीं। – icktoofay

+0

जबकि आप उस कोडिंग को पूरा करने के लिए सेटटाइमआउट का उपयोग कर सकते हैं, तो आपको सेटइंटरवाल की तलाश करनी चाहिए जो आपके लिए करता है। – erm3nda

+0

यह गलत है। 'setTimeout' एक फ़ंक्शन * केवल एक बार * को आमंत्रित करता है। बार-बार आह्वान करने के लिए, 'setInterval' का उपयोग करें। – Tom

6

आप समारोह setInterval(function, interval)

// To start the loop 
var mainLoopId = setInterval(function(){ 
    // Do your update stuff... 
    move(); 
}, 40); 

// To stop the loop 
clearInterval(mainLoopId);` 
+0

अंतराल (इस उदाहरण में 40 द्वारा दिखाया गया), मिलीसेकंड का प्रतिनिधित्व करता है। – vedi0boy

0

मैं एक coffescript वर्ग समय छोरों को संभालने के लिए बनाया का उपयोग कर सकते हैं, शायद यह किसी के लिए उपयोगी होगा। सार को

# Classe TimeLoop, execute a function every x miliseconds 
# 
# @example How o create a loop 
# myLoop = new TimeLoop((-> alert("loop"),1000) 
# myLoop.start() 
# 
class window.TimeLoop 
    constructor: (@function,@miliseconds) -> 

    # Start loop. 
    # 
    start: -> @loop = setInterval @function, @miliseconds 

    # Stop loop. 
    # 
    stop: -> clearInterval(@loop) 

लिंक: https://gist.github.com/germanotm/6ee68f804860e2e77df0

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