2012-06-24 44 views
12

爲了我遊戲的需要,我需要2D聲音。這意味着發射器應放置在2D平面上的某個位置。如何在Javascript中實現這種效果?我需要使用特殊的聲音格式還是可以控制揚聲器的音量?Javascript中的空間(2D)聲音

我認爲我可以達到每個揚聲器都有2個音量的程度,但我對如何在Javascript中應用不同音量的相同聲音毫無頭緒。

+2

''遊戲?聲音從哪裏來?一個'

+4

閱讀:[Web Audio API](http://www.w3.org/TR/webaudio/) –

+0

@ŠimeVidas的確如此。 – corazza

回答

7

準確描述這種包括演示一種製品,可以發現here

爲了防止腐爛的鏈接,我會引用下面

最相關的部分幸運的是,網絡音頻API帶有內置硬件加速音頻定位功能,是十分方便的使用。

的核心思想是體現在下面的代碼:

PositionSample.prototype.changePosition = function(position) { 
    // Position coordinates are in normalized canvas coordinates 
    // with -0.5 < x, y < 0.5 
    if (position) { 
    if (!this.isPlaying) { 
     this.play(); 
    } 
    var mul = 2; 
    var x = position.x/this.size.width; 
    var y = -position.y/this.size.height; 
    this.panner.setPosition(x * mul, y * mul, -0.5); 
    } else { 
    this.stop(); 
    } 
}; 

在上述第一連桿的工作演示的完整源代碼可以發現here

Offtopic:我認爲重寫用手援引的條款這裏自定義的答案,但似乎相對無意義的,因爲文章已經足夠清晰,做重複工作更顯得毫無意義


兼容性明智,只有閃光燈和前面提到的代碼的組合提供了一個真正的跨瀏覽器定位/平移音頻解決方案(因爲閃光燈在某些移動設備上不可用)。理想情況下,我建議不要使用音頻API,如果這可以規避,因爲規範中的事情不會改變,因此可能會破壞您的代碼(+這不是不可能在移動設備上以任何方式工作)。唯一的情況是使用更高級的網絡音頻api是有意義的,如果你期望在你的遊戲上至少工作6到18個月(因爲這可能會讓實現甚至穩定到可用點) 。

+0

我不關心兼容性,但我希望我的代碼不要包含任何Flash。 – corazza

+0

哈哈,在這種情況下,上述解決方案對你來說是完美的耶:D(我想這意味着你只是從它學習,這是偉大的:D) –

+0

男人,你真的想賣你的「解決方案」。這只是+ 50分,放鬆一下。放鬆。 – MMeah

2

我們在工作中使用了SoundManager2,這是一個非常簡單的交鑰匙解決方案和記錄良好的API。

http://www.schillmania.com/projects/soundmanager2/

實施例:

soundManager.createSound({ 
id:'mySound1', 
url:'../mpc/audio/CHINA_1.mp3' 
}); 
soundManager.play('mySound1'); 

BSD許可:http://www.schillmania.com/projects/soundmanager2/license.txt

+4

對於聲音平移,您可以只錄制左聲道或右聲道並在兩者之間淡入。任何聲音編輯器都會允許。它需要兩個文件,但它是一個解決方案。 – MMeah

+0

2個文件之間的漸變不需要精確的時序匹配,有時不容易完成? – wizzard0

+0

網絡音頻API確實有很多有用的工具,儘管你當然不能使用soundmanager庫來處理那些嚴肅的事情。(請參閱我的答案中的文章,並稍微向上滾動以獲取某些時間解釋) –