ここではプログラムを組む上での注意点を説明していく。
今回は汎用的なサウンドの使い方であり特殊処理に関しては触れないものとする。
##フレームワーク化する
実際の開発ではCRIの関数をそのまま呼び出すことはほとんどなく
SoundManagerを作ってその中にCRIの関数を書くことになる。
ゲームのサウンドは特殊なことを行う場合以外は、BGM、SE、VOICEの再生と停止、音量設定くらいしかない。
しかし直接CRIの関数呼び出してやると1つの動作をさせるのに何行も書かなくてはいけなくなってしまうので
これらをフレームワーク化することで利便性を高める。
##サウンドマネージャーに必要なメソッド
サウンドマネージャーはシングルトンで構築し、どこからでもアクセスできるようにしておく。
必要になりそうな汎用的なメソッドを以下に並べる。
- Initialize
- Finalize
- Load
- Unload
- PlayBGM
- StopBGM
- IsPlayingBGM
- SetVolumeBGM
- GetVolumeBGM
- PlaySE
- StopSE
- IsPlayingSE
- SetVolumeSE
- GetVolumeSE
- PlayVoice
- StopVoice
- IsPlayingVoice
- SetVolumeVoice
- GetVolumeVoice
- StopAll
- Suspend
- Resume
各メソッドの説明とメソッド内での注意点を記載する。
##Initialize
初期化処理を記述する。
ターゲットプラットフォーム用の初期化
プラットフォームごとに初期化方法が異なるため、CRIのサンプルを元に正しい初期化処理を行う。
####BGM、SE、VOICEそれぞれのプレイヤー数の確保
プレイヤー1つにつき1つ音を鳴らすことができる。
プレイヤーが8つある場合は、同時に8音鳴らせるということになる。
プレイヤー数はゲームによって異なるが、汎用的な数を設定するのであれば
BGMは1、SEは8、ボイスは4あれば十分である。
また、今回のBGMは1つしか再生しないことを前提に説明を進めていく。
####フェード設定
サウンドのフェードイン、フェードアウトを行う場合、CRIではプレイヤーごとにフェード設定をしてやる必要がある。
大抵の場合フェード処理は必要になってくるため、全てのプレイヤーにフェード設定をしておいたほうが無難である。
AttachFaderというメソッドでフェードを有効にするが、デフォルトでフェードインとフェードアウト500ミリ秒設定になっているため、SEとVOICEのフェードイン時間は0に設定したほうがよい。
####ACFファイルの読み込み
全体設定であるACFファイルを読み込んでおく
####必要なACBファイルの読み込み
ゲーム内で読み替えを行わず、最初から最後まで使用するものは初期化の時点で読み込んでおく
##Finalize
終了処理を記述する。
読み込んだファイルの解放、プレイヤーの解放、ADX2の解放で終わるはず。
##Load
ACBファイルの読み込むを行う。
ここで行うのは読み替えを行うもので、最初から最後まで使用するものはInitializeで済ませてよい。
##Unload
ACBファイルの解放を行う。
ここで行うのは読み替えを行うもので、最初から最後まで使用するものはFinalizeで済ませてよい。
##PlayBGM
BGMの再生を行う。
####引数
- BGM名 or BGMのインデックス
- ディレイ(開始までのWait時間、デフォルトで0秒)
- フェードイン時間(デフォルトで0.5秒)
- フェードアウト時間(デフォルトで0.5秒)
####注意点
- 現在再生されているBGM名が指定された場合は何もしないようにする。
- CRIはフェード機能を有効にしている時、BGM1を再生中にBGM2を再生しようとした場合、自動的にフェードで切り替えを行ってくれるため、フェードインやフェードアウトの時間は0にしないほうがよい。
##StopBGM
BGMの停止を行う
####引数
- フェードアウト時間(デフォルトで0.5秒)
####注意点
フェード時間が0より大きい値が指定されている状態で停止後に即時にリソースを解放している場合、フリーズの原因となることがあるため、即時解放のときはフェードアウト時間を0にしてやる必要がある。
##IsPlayingBGM
BGMの再生中の有無を取得する。
状態がPrepかPlayingのときは再生中と判断するのがよい。
##SetVolumeBGM
BGMの音量を設定する
##GetVolumeBGM
BGMの音量を取得する
##PlaySE
SEの再生を行う。
####引数
- SE名 or SEのインデックス
- 再生するプレイヤーのインデックス(-1を指定すると空いているプレイヤーを使用する)
- ループの有無
- ディレイ(開始までのWait時間、デフォルトで0秒)
####戻り値
再生するプレイヤーのインデックス、空いているプレイヤーがなかった場合は-1。
####注意点
- 初期化の段階で行っているので問題ないと思うが、フェードインの時間は0秒にしておく。
##StopSE
SEの停止を行う
####引数
- 停止するプレイヤーのインデックス(-1が指定された場合は全てのSEを停止)
- フェードアウト時間(デフォルトで0.5秒)
####注意点
BGMと同じ
##IsPlayingSE
プレイヤーのインデックスを指定するところ以外は、BGMと同じ
####引数
- プレイヤーのインデックス
##SetVolumeSE
SEの音量を設定する
##GetVolumeSE
SEの音量を取得する
##PlayVoice
Voiceの再生を行う。
####引数
- Voice名 or Voiceのインデックス
- キャラクター名 or キャラクターのインデックス
- 再生するプレイヤーのインデックス(-1を指定すると空いているプレイヤーを使用する)
- ディレイ(開始までのWait時間、デフォルトで0秒)
####戻り値
再生するプレイヤーのインデックス、空いているプレイヤーがなかった場合は-1。
####注意点
- 初期化の段階で行っているので問題ないと思うが、フェードインの時間は0秒にしておく。
- 読み込んでいないキャラクターを指定された場合は、再生タイミングで読み込むようにする。ただし、際限なく読み込んでしまうとメモリを圧迫してしまうため、一定以上の読み込みを行ったら古いものから解放するようにしておくとよい。
##StopVoice
Voiceの停止を行う
####引数
- 停止するプレイヤーのインデックス(-1が指定された場合は全てのVoiceを停止)
- フェードアウト時間(デフォルトで0.5秒)
####注意点
SEと同じ
##IsPlayingVoice
SEと同じ
####引数
- プレイヤーのインデックス
##SetVolumeVoice
Voiceの音量を設定する
##GetVolumeVoice
Voiceの音量を取得する