はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX 細かい修正まとめ

あいさつ

もう11月も終わってしまいますね。
つまり私の開発も一区切り付けねばなりませんが、
つく気配がなく焦っているはかせです。
今回は細かいけどやっといたほうが良さげなことまとめです。

やったこと

・音をループさせる
・音を止めたら次再生するときは最初から再生する
・音量を調節できるようにする
・ウィンドウのアクティブが切れても操作できるようにする

どれもそんな難しいことはしてないです。

音をループさせる

今まで私のゲームのBGMはループしてませんでした。
なので一曲分終わると後は無音でした。寂しいのでループさせましょう

//ループフラグを立てる
mDsBuffer->Play(0, 0, DSBPLAY_LOOPING);

Play関数にループフラグを指定しました。これだけです。
ただ「DirectSound loop」とかで調べると真っ先にMSDNのサイトが出てきて
DirectSoundはループ等を直接サポートしません的なサイトが出てくるので
騙されたって感じでしたw

音を止めたら次再生するときは最初から再生する

SEとかBGMとかって次再生するときはまた最初からがいいですよね。
これは音の再生位置を先頭に持っていくことで実現できます。

//再生位置を先頭へ
mDsBuffer->SetCurrentPosition(0);

引数はバイト単位のオフセットだそうです。
先頭に持っていきたいのでオフセットは0でおkです。

音量を調節できるようにする

BGMとSEが同じ音量って嫌ですよね。
どっちかが大きくて小さいほうが聞きやすいです。

//音量調節可能を示すフラグ
dsBufferDesc.dwFlags = DSBCAPS_CTRLVOLUME;
//音量をセットする
mDsBuffer->SetVolume(volume);

音のバッファを作るときに音量調節可能を示すフラグを
立てとけば変えれるっぽいです。

volumeの値は-10000~10000の間で設定するみたいです。
この値に関しては私もネットで見ただけなのでなぜこの値なのかはわかっていません。
(分かる方いましたら教えてくださいm(__)m)

ウィンドウのアクティブが切れても操作できるようにする

ウィンドウのアクティブが切れたときってのは、
ウィンドウがバックグラウンドに行った時です。

私のプログラムの入力取得は以下の記事に載っています。
hakase0274.hatenablog.com

書いてあるので詳細は省きますが、
私はウィンドウが前面にいる時のみ入力を取っています。
こうしないと他の画面操作してる時でもゲームの自機とか動いちゃいますからね。

ただこの設定には困ったことがあってウィンドウがバックグラウンド行くと、
バイスが勝手に解放されちゃうんですよねw

なんでプレイ中にググったりすると次の瞬間には操作できなくなってるんですね。
まぁアプリ再起動で直るんですが、ちゃんと対策しておきましょう。

対策といってもキーボードの状態を取得して、
解放されていたらデバイスを再取得すればいいだけの話です。

//デバイス状態取得
if(FAILED(mInputDevice->GetDeviceState(sizeof(mInputBuffer), (LPVOID)&mInputBuffer)))
{
	//入力受付
	mInputDevice->Acquire();
}

キーボードの状態はGetDeviceState関数の成否でわかります。
失敗したならデバイスは解放されています。
バイスの取得はAcquire関数でできます。

あとはこれを毎フレーム評価して実行すれば対策完了です。

あとがき

今回は細かいけどやったほうがいいやつまとめでした。
サンプルとかをコピペしてるとやってなかったりして地味に困るやつですよね。

ゲームの手触り感ってこういう細かいところが結構重要だったりするので
妥協せずやりたいところです。

それでは今回はこの辺でノシ

今回作ったものはgithubに上げました
github.com