2012-04-30 16 views
8

मैं एक खेल बना रहा हूं, जिसमें ध्वनि अक्सर खेला जाता है। मैंने देखा कि खेला जाने पर एक आवाज फिर से खेल नहीं पाएगी। उदाहरण के लिए, खिलाड़ी दीवार से टकराता है, एक "थंप" ध्वनि खेला जाता है। लेकिन, अगर खिलाड़ी एक दीवार से टकराता है, और फिर जल्दी से दूसरी दीवार के साथ टकराता है, तो केवल एक "थंप" ध्वनि खेला जाता है, और मेरा मानना ​​है कि ऐसा इसलिए होता है क्योंकि पहली आवाज खत्म नहीं होती है। क्या यह सच है? मुझे इससे कैसे बचना चाहिए? मैं ध्वनि तीन बार पहले से लोड होने, हमेशा कि ध्वनि की एक अलग प्रतिलिपि खेलने के बारे में सोचा है, लेकिन इस बल्कि मूर्ख लगता है ...एचटीएमएल 5 में, क्या मैं एक ही समय में एक ही ध्वनि को एक से अधिक बार खेल सकता हूं?

हल:

बाहर कर देता है मैं सही है ... आप को पहले से लोड की जरूरत किया गया था ध्वनि के कई संस्करण और फिर गोलाकार रूप से उन्हें खेलते हैं।

कोड:

var ns = 3; //The number of sounds to preload. This depends on how often the sounds need to be played, but if too big it will probably cause lond loading times. 
var sounds = []; //This will be a matrix of all the sounds 

for (i = 0; i < ns; i ++) //We need to have ns different copies of each sound, hence: 
    sounds.push([]); 

for (i = 0; i < soundSources.length; i ++) 
    for (j = 0; j < ns; j ++) 
     sounds[j].push(new Audio(sources[i])); //Assuming that you hold your sound sauces in a "sources" array, for example ["bla.wav", "smile.dog" "scream.wav"] 

var playing = []; //This will be our play index, so we know which version has been played the last. 

for (i = 0; i < soundSources.length; i ++) 
    playing[i] = 0; 

playSound = function(id, vol) //id in the sounds[i] array., vol is a real number in the [0, 1] interval 
{ 
    if (vol <= 1 && vol >= 0) 
     sounds[playing[id]][id].volume = vol; 
    else 
     sounds[playing[id]][id].volume = 1; 

    sounds[playing[id]][id].play(); 
    ++ playing[id]; //Each time a sound is played, increment this so the next time that sound needs to be played, we play a different version of it, 

    if (playing[id] >= ns) 
     playing[id] = 0; 
} 
+0

ऑडियो चलाने के लिए आप क्या उपयोग कर रहे हैं? मुझे लगता है कि यह '

+0

'ध्वनि = नया ऑडियो (" souce.wav "); sound.play(); ' – corazza

उत्तर

2

लोड ध्वनि कई बार polyphony अनुकरण करने के लिए। उन्हें राउंड-रॉबिन फैशन में चलाएं। matthewtoledo.com पर अपना डेमो देखें। विशेष रूप से, फ़ंक्शन _initSoundBank()

+0

तो मूल रूप से, मैं सही था? – corazza

+0

हाँ। यह मुझे मिला सबसे अच्छा तरीका है। अगर किसी के पास बेहतर समाधान है, तो मैं वास्तव में जानना चाहूंगा। – mrbinky3000

+0

ओह हाँ, यह काम करता है! कोड टोस्ट करेगा ... – corazza

1

हां, एक <audio> ऑब्जेक्ट एक समय में केवल एक ट्रैक चला सकता है। इस बात पर विचार करें कि <audio> ऑब्जेक्ट में currentTime विशेषता है जो ऑडियो ट्रैक की वर्तमान स्थिति इंगित करती है: यदि <audio> ऑब्जेक्ट एकाधिक ट्रैक चला सकता है, तो currentTime क्या मूल्य दर्शाता है?

Is playing sound in Javascript performance heavy? पर इस समस्या के सुपरसेट के लिए मेरा समाधान देखें। (मूल रूप से, एक ही ध्वनि के साथ डुप्लिकेट <audio> टैग जोड़ें।)

+0

आह! मुझे पता था कि किसी ने मेरे सिर में उस विचार को लगाया था ... धन्यवाद;) – corazza

0

हालांकि यह केवल फ़ायर्फ़ॉक्स और क्रोम में कार्यान्वित किया जाता है अभी, भविष्य में आप WebAudio API, जो विशेष रूप गेम्स और ऑडियो अनुप्रयोगों के लिए डिज़ाइन किया गया है का उपयोग करना चाहिए ब्राउज़र में

वहां आप किसी भी ध्वनि को कई बार वापस चला सकते हैं और इसके साथ कई अन्य मजेदार सामान भी कर सकते हैं।

कि के लिए एक अच्छा ट्यूटोरियल यहाँ है: http://www.html5rocks.com/en/tutorials/webaudio/games/

4

आप ऑडियो तत्व क्लोन कर सकते हैं। मुझे नहीं पता कि क्या आप उन्हें एक साथ एक से अधिक बार खेल सकते हैं, लेकिन यहां एक बार से अधिक बार डाउनलोड किए बिना आप ध्वनि को एक से अधिक बार कैसे खेल सकते हैं।

var sound = document.getElementById("incomingMessageSound") 
var sound2 = sound.cloneNode() 
sound.play() 
sound2.play() 

मैं इस क्रोम, जो केवल जगह मैं यह आवश्यक है के लिए काम करता है। शुभकामनाएँ!

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