2012-06-24 13 views
12

Dla potrzeb mojej gry potrzebuję dźwięku 2D. Oznacza to, że emmiter powinien być umieszczony gdzieś na płaszczyźnie 2D. Jak osiągnąć ten efekt w JavaScript? Czy muszę używać specjalnego formatu dźwięku lub czy mogę kontrolować głośność w głośnikach?Dźwięk przestrzenny (2D) w JavaScript

Myślę, że mogę dojść do punktu, w którym mam 2 tomy dla każdego głośnika, ale nie mam pojęcia, jak zastosować różne woluminy dla tego samego dźwięku w Javascript.

+2

Gra ''? Skąd pochodzi dźwięk? Element '

+4

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

+0

@ ŠimeVidas, w rzeczy samej. – corazza

Odpowiedz

7

się artykuł opisujący dokładnie ten tym demo można znaleźć here.

Aby zapobiec martwy link będę cytował najbardziej odpowiednich części poniżej

szczęście Web Audio API pochodzi z wbudowaną sprzętową akceleracją pozycyjnych funkcji audio, które są dość proste w użyciu.

Istotą wykazano w poniższym kodzie:

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

pełny kod źródłowy demo roboczego w pierwszym linku powyżej można znaleźć here.

Offtopic: Uważałem przepisanie cytowany artykuł sił jako niestandardową odpowiedź tutaj, ale wydawało się, że stosunkowo bezcelowe jak artykuł jest już więcej niż wystarczająco jasny i robi podwójnej pracy wydaje się bezcelowe


Kompatybilność, tylko kombinacja lampy błyskowej i wspomnianego wcześniej kodu zapewnia prawdziwe rozwiązanie przesuwania i przesuwania dźwięku w przeglądarce (ponieważ lampa błyskowa nie jest dostępna na niektórych urządzeniach mobilnych). Idealnie odradzałbym korzystanie z audio API, jeśli można go obejść, ponieważ nie jest mało prawdopodobne, że sytuacja ulegnie zmianie w specyfikacji, co może złamać twój kod (+ jest mało prawdopodobne, aby nie działało to w żaden sposób na urządzeniach mobilnych). Jedynym scenariuszem, w którym wykorzystanie bardziej zaawansowanych api interfejsu audio w Internecie jest sensowne, jest oczekiwanie, że będziesz pracował co najmniej przez kolejne 6 do 18 miesięcy w grze (ponieważ jest to prawdopodobny czas, w którym implementacje będą nawet stabilne do użytecznego punktu) .

+0

Nie dbam o kompatybilność, chociaż chciałbym, aby mój kod nie zawierał żadnego Flasha. – corazza

+0

Haha, w takim przypadku powyższe rozwiązanie jest po prostu idealne dla ciebie tak: D (myślę, że to znaczy, że robisz to tylko po to, żeby się uczyć, co jest wspaniałe: D) –

+0

Człowieku, naprawdę próbujesz sprzedać swoje "rozwiązanie" ". To tylko + 50 punktów, uspokój się. Zrelaksować się. – MMeah

2

Używaliśmy SoundManager2 w pracy, na to było naprawdę łatwe rozwiązania pod klucz i dobrze udokumentowane API.

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

Przykład:

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

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

+4

Aby uzyskać panoramę dźwiękową, możesz nagrać tylko lewy lub prawy kanał i stopniowo przechodzić między nimi. Każdy edytor dźwięku na to pozwoli. Wymaga dwóch plików, ale jest to rozwiązanie. – MMeah

+0

Czy przejście między 2 plikami nie wymaga dokładnego dopasowania czasu, co czasem nie jest łatwe? – wizzard0

+0

Web audio API ma do tego sporo użytecznych narzędzi, chociaż oczywiście nie można używać biblioteki soundmanager do poważnych rzeczy.(Zobacz artykuł w mojej odpowiedzi i przewiń w górę o wyjaśnienia dotyczące czasu). –