デフォルトではサウンドも音楽も両サイドのスピーカーからフルボリュームで再生されます。3Dっぽくない。
だけど、ゲーム内で、画面の右側にある物体から効果音が出てるなら、右のスピーカーから音が出て欲しいですよね?
プレイヤーの背後のオブジェクトが音を出しているなら、背後のスピーカーから音が出て欲しい(5.1ch のサラウンドシステムはお持ち?)。
さて、どうすればいいのかな?
sf::Listener::setPosition (10.f, 0.f, 5.f);2Dのゲームなら、高さの概念がないので Y座標はいつも同じです(多分 0 で固定)。
sf::Listener::setDirection (1.f, 0.f, 0.f);このサンプルでは、リスナーは純粋に X軸のプラス方向を向いて立ってます。 つまり、たとえば、効果音が 座標(15, 0, 5) から発せられている場合、右のスピーカーから音が出ます。
sf::Listener::setUpVector(1.f, 1.f, 0.f);
sf::Listener::setGlobalVolume (50.f);ボリューム値の範囲は [0 ~ 100] です。たとえば 50 に設定すると音量は半分になります。
sound.setPosition (2.f, 0.f, -5.f);設定する値はデフォルトでは絶対座標です。
sound.setRelativeToListener (true);相対座標の設定にしておくと、リスナー自身が音を出すような場合にコードがわかりやすくなります (足音とか、ピストルを撃つとか)。
sound.setMinDistance (5.f); // 最短距離 sound.setAttenuation (10.f); // 減衰しやすさ「最短距離」の値は、音が最大のボリュームで聴こえる距離です。 なので、たとえば爆発音のような大きな音は、この値を大きく設定しておきましょう。遠くからでも聴こえるように。
MinDistance :最短距離。setMinDistance() でセット
Attenuation :減衰しやすさ。setAttenuation() でセット
Distance :音源とリスナーとの距離
Volume factor :減衰率。範囲は [0~1]です。この値がボリュームに掛け算されます。
Volume factor =
MinDistance /
(
MinDistance +
Attenuation * ( max(Distance, MinDistance) - MinDistance )
)