いちおくまんえん

最近はcocos2d-xでゲームアプリ「いちおくまんえん」の制作がメインです。 あとアニメも少々・・

タイトル画面作成④ タップでSEを鳴らす

BGMも鳴らせるようになったので少しゲームらしくなった「いちおくまんえん」ですが、まだタイトル画面です(;´∀`)

そろそろ物語のプロローグくらい表示させたいですね。
よーし、今日は頑張ってプロローグまで作っちゃうぞ(っ・ω・)っ

ということでプロローグに移動するまでになにをするか。
タイトル画面にMenuでボタン作ってそのボタンのイベントで次の画面に遷移を実装。
とかでも良かったんですが、画面全体どこタップしてもゲームを開始する。
という感じにしたかったので、レイヤーのタッチ機能を有効化して実装します。
今回はまだプロローグ画面を作ってないのでタップの取得とSEの再生までやります。

いやー、簡単なことなんですがめっちゃハマりました∑(゚Д゚)

散々cocos2d-xのversion2系で書いてたのでいつも通り書こうとしたら、version3系だと勝手が違う・・。

いやーCCSpriteとかいろんなクラスのCCが取れたとかそんな程度で、他の所でもメソッド名が多少変わった程度なんですけどね。

なのでそこまで苦労せず書けてるわけですが、勘違いから半日近くハマってました。

// ヘッダー
// タップでゲーム開始させる
virtual bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event) override;

// 実装
    // init()とかで
    // SEプリロード
    SimpleAudioEngine::getInstance()->preloadEffect(SE_TOUCH_NORMAL);
    // シングルタップのみ受付
    setTouchEnabled(true);
    setTouchMode(Touch::DispatchMode::ONE_BY_ONE);


bool TitleScene::onTouchBegan(Touch *touch, Event *event)
{
    CCLOG("TitleScene::onTouchBegan()");
    SimpleAudioEngine::getInstance()->playEffect(SE_TOUCH_NORMAL);
    return false;
}

はまってたところ

/** how the touches are dispathced */
enum class DispatchMode {
    /** All at once */ // マルチタップのこと
    ALL_AT_ONCE,
    /** one by one */ // シングルタップのこと
    ONE_BY_ONE,
};

何も調べず俺ルール脳内変換
ALL_AT_ONCE→全てを1つに→同時に何個来ようが1つしか処理しない→シングルタップ
ONE_BY_ONE→1つは1つ→同時に何個来ても1つずつ受け取って処理してあげる→マルチタップ

きっと正しい解釈
ALL_AT_ONCE→みんな一緒に→複数をまとめて取り扱います→マルチタップ
ONE_BY_ONE→1つずつ→複数きても1つずつしか処理しません→シングルタップ


ええ、ALL_AT_ONCEがシングルタップと信じつづけて四苦八苦してました・・。
おかげさまで色んな所のソースを確認することになったので便利なメソッドを知る良い機会になったので良しとします(*‘ω‘ *)

SE鳴らす部分はBGMと大して変わらないのでスルーしようかと思いましたが、一応

virtual unsigned int playEffect(const char* pszFilePath, bool bLoop = false,
                                    float pitch = 1.0f, float pan = 0.0f, float gain = 1.0f);

こういう実装になっているのでBGMと使い方は変わらないですが、BGMより多いオプションが指定できます。

pitch,pan,gainについては過去に記事書いてるのでそちらを参考に。
参考にならないと思いますが(゚A゚;)

今回のコミットログ
https://github.com/yasuhiro-matsuda/ichi_okuman_yen/commit/f1f58620a4b54270fd0bb4e65db42639df3cd2c0