2011-07-31 10 views
14

समाप्त हो गई हो, मैं एक गेम बना रहा हूं जिसमें एक वैव फ़ाइल क्लिक पर खेलती है - इस मामले में यह एक बंदूक ध्वनि "बैंग" है।एचटीएमएल 5 ऑडियो - क्लिक पर बार-बार ध्वनि चलाएं, भले ही पिछली पुनरावृत्ति

समस्या यह है कि यदि मैं तेज़ी से क्लिक करता हूं, तो यह प्रत्येक क्लिक के लिए एक बार ध्वनि नहीं चलाएगा - ऐसा लगता है जैसे ध्वनि बजाने के दौरान क्लिक को नजरअंदाज कर दिया जाता है, और एक बार ध्वनि समाप्त होने के बाद, यह फिर से क्लिक सुनना शुरू कर देता है । देरी के बारे में एक सेकंड लंबी लगती है, तो आप जान सकते हैं कि किसी को प्रति सेकंड 4 या 5 बार क्लिक करता है, मैं 5 बनूंगी, नहीं 1.

चाहते यहाँ मेरी HTML है:

<audio id="gun_sound" preload> 
    <source src="http://www.seancannon.com/_test/audio/gun_bang.wav" /> 
</audio> 

यहाँ मेरी जे एस है:

$('#' + CANVAS_ID).bind(_click, function() { 
    document.getElementById('gun_sound').play(); 
    adj_game_data(GAME_DATA_AMMO_ID, -1); 
    check_ammo(); 
}); 

विचार?

उत्तर

15

एक बार gun_bang.wav प्रीलोड हो जाने पर, आप उस ध्वनि से जुड़े नए तत्वों को गतिशील रूप से बना सकते हैं, ऑडियो चला सकते हैं, और फिर ऑडियो समाप्त होने पर उन्हें हटा सकते हैं।

function gun_bang(){ 
     var audio = document.createElement("audio"); 
     audio.src = "http://www.seancannon.com/_test/audio/gun_bang.wav"; 
     audio.addEventListener("ended", function() { 
      document.removeChild(this); 
     }, false); 
     audio.play(); 
    } 

    $('#' + CANVAS_ID).bind(_click, function() { 
     gun_bang(); 
     adj_game_data(GAME_DATA_AMMO_ID, -1); 
     check_ammo(); 
    }); 
+0

यह आशाजनक लग रहा है। मेरा एकमात्र डर यह है कि तत्व बनाते समय क्लिक और ऑडियो के बीच विलंबता होगी। क्या मुझे अभी भी अपने शुरुआती 'ऑडियो' टैग की आवश्यकता है? मुझे लगता है कि यह कैसे preloaded है? – AlienWebguy

+0

हां सभी भय डूब गए, धन्यवाद! अब JQuery इन कार्यों का समर्थन कब शुरू करेगा ताकि मैं '$ ('selector') कर सकूं। Play()' और क्या नहीं? – AlienWebguy

+1

यह एक ओवरकिल है। बस 'currentTime' को' 0' पर सेट करें: http://stackoverflow.com/a/7005562/352796 – katspaugh

11

मैं जानता हूँ कि यह एक बहुत ही देर से जवाब है, मैं तो बस चाहता था, लेकिन एक समाधान मैंने पाया के लिए मांग है कि मेरे मामले में सबसे अच्छा एक ध्वनि पहले से लोड करने के लिए और फिर नोड हर बार मैं खेलना चाहता हूँ क्लोन था यह, यह मुझे तो यह और भी खेलने के लिए करता है, तो पिछले समाप्त नहीं किया गया है की अनुमति देता है:

var sound = new Audio("click.mp3"); 
sound.preload = 'auto'; 
sound.load(); 

function playSound(volume) { 
    var click=sound.cloneNode(); 
    click.volume=volume; 
    click.play(); 
} 
+0

वाह धन्यवाद, मेरा बिल्कुल भी नहीं खेलेंगे, यह तय है। –

+0

यह बहुत अच्छा है। क्या वही काम करने के लिए वैसे भी है लेकिन एकाधिक एमपी 3 का उपयोग कर रहे हैं? – gravityboy

+0

@jmservera यह अच्छा है, लेकिन प्रत्येक नए क्लिक में एक HTTP अनुरोध है :( –

1

आप अपनी खुद की कार्यक्रम विशेष क्लिक तर्क के साथ निम्न लपेट सकते हैं, लेकिन निम्नलिखित 3 बंदूक एक ही समय में लग रहा है दर्शाता है। यदि आप किसी भी प्रकार की देरी चाहते हैं, तो आप एक मामूली नींद() फ़ंक्शन पेश कर सकते हैं (इसके लिए कई क्लेज हैक्स आसानी से पाए जाते हैं), या आप बाद वाले लोगों को कॉल करने के लिए setTimeout() का उपयोग कर सकते हैं।

<audio id="gun_sound" preload="preload"> 
    <source src="http://www.seancannon.com/_test/audio/gun_bang.wav" /> 
</audio> 

<script type="text/javascript"> 
jQuery(document).ready(function($){ 

    $('#gun_sound').clone()[0].play(); 
    $('#gun_sound').clone()[0].play(); 
    $('#gun_sound').clone()[0].play(); 

}); 
</script> 
+0

एचटीएमएल 5 में प्ले बटन पर क्लिक करने से पहले ऑडियो लोड करें 'प्रीलोड = "प्रीलोड"? –

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