久しぶりのCocos2d-x記事です。
Cocos2d-xでゲームを開発していく上で、便利なライブラリを自分用に作っていたのですが、これを紹介したいと思います。
その名も「GameHelper2dx」!!(大袈裟)
実は GitHub にて公開しております。(安定版はタグが付いたものをご使用ください)
https://github.com/tokineco/GameHelper2dx
C++自体は経験が浅いのでまだまだなところもありますが、とりあえずは「おたのプリンセス!」での利用実績があるので、動作的には多分大丈夫だと思います。
さて、この「GameHelper2dx」なのですが、目玉は「AudioManager」となります。(というか、ほとんどこれ)
README.mdにその概要と実装方法の記述はしておりますが、この記事で簡単に説明したいと思います。
何ができるの?
- BGMのフェードイン、フェードアウト
- BGMの区間ループ
- ファイルの拡張子を自動判別
- 定義ファイルを使うことで、ファイル差し替え等の仕様変更に強くなる
- SEのチャンク指定
- その他、便利なクラスもご用意!
Cocos2d-xで使用可能なAudio系ツールといえば、「CRI ADX2」や「Cricket Audio」が有名ですが、Cocos2d-xに内蔵されている”AudioEngine”でとりあえず上記の機能は満たすことができました。
注意点
- C++用
- Cocos2d-x 3.8 以上が必要
- バグがあっても責任は負えません。そういうときはプルリクをいただければ嬉しいかも?(Git初心者感)
シンプルな使い方(BGM再生)
とりあえず、AudioManagerだけ使いたい場合は、自分のプロジェクトに組み込んだ後、
1 |
#include "lib/GameHelper2dx/AudioManager.h" |
で、ヘッダファイルをincludeします。(この場合、Classes/lib/GameHelper2dx/にAudioManager.hとAudioManager.cppを格納しています)
シンプルにBGMを再生したい場合は、
1 |
AudioManager::getInstance()->playBgm("bgm/title", 1.5f); |
とすれば、Resources/bgm/title(.拡張子) が 1.5秒のフェードインで再生されます。この時、拡張子はあってもなくても構いませんが、省略すると存在するファイルを判別して再生するようにしています。
(iOSでは m4a > caf > mp3 > wav、Androidでは m4a > ogg > mp3 > wav、Windowsでは mp3 > ogg の優先順位で再生されます)
定義ファイルの使い方
別に定義ファイル(JSON)を作成し、事前にそれを読み込んでおくことで、キー名のみで再生が可能になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "BGM":{ "title":"bgm/title", "game_happy":["bgm/game01", 20.129, 79.990] } , "SE": { "ui_ok":"sounds/ui_ok", "ui_cancel":"sounds/ui_cancel" } } |
また、BGM内のvalue部分を
[“ファイルパス”, ループ区間開始位置(秒),ループ区間終了位置(秒)]
とすると、区間ループに対応します。
作成できたら任意の場所に配置して、初期段階(AppDelegate.cpp等)で読み込みます。
1 2 |
// オーディオ定義ファイルの読み込み AudioManager::getInstance()->readAudioListFile("data/audio.json"); |
あとは、キー名だけを指定すれば再生が可能です。
1 |
AudioManager::getInstance()->playBgm("game_happy", 1.5f); |
こうすることで、ディレクトリパスが変わったり、ファイルの差し替え等があってもこの定義ファイルを修正するだけで対応することができるようになります。
この他にも、引数を加える事で再生ボリュームやループ設定も可能です。プリロード、ポーズ、リジューム再生等も一通り揃えています。
SE再生
これもBGMと同じように、
1 |
AudioManager::getInstance()->playSe("ui_ok"); |
で再生ができます。
ここで、引数にチャンク番号(0~7)をセットすることもできます。
1 |
AudioManager::getInstance()->playSe("ui_ok", 1); |
例えば、ほぼ同時に同じ音が流れる場合(コインの大量取得とか)、チャンクを指定しないと呼びだされた数だけ「ティローン!」が平行して再生されます。
チャンクを指定すると、同じチャンク番号で再生された音は再生しなおしになり、「テテテテテティローン!」という感じで再生されます。演出によって使い分けてください。
おまけ
C++をよく使う方はすでに用意しているかもしれませんが、文字列からの型変換やsplit、replace、trimを実装した「Converter」と、計算系(今はランダム値を返すだけ)の「MathHelper」があります。
他に「SDKBOXHelper」もありますが、これは個人的にWindowsで開発しているため、SDKBOXによるWindows環境エラーを吸収したものになります。SDKBOXやそのプラグインが無ければ入れてもエラーになりますので、SDKBOXHelperはプロジェクトから外し、参考に留めてもらえればと思います。
- 投稿タグ
- AudioEngine, Cocos2d-x