LoginSignup
3
3

More than 5 years have passed since last update.

CCMenuで効果音を鳴らす!(継承版)

Last updated at Posted at 2014-01-16

追記:使用している2dxバージョンは cocos2d-x-2.2.1

CCMenuで音を鳴らすとかでググると、ドサッとでてきますよね

sample.cpp

// initあたりで
void Sample::init()
{
    // 読み込んでおく
    SimpleAudioEngine::sharedEngine()->preloadEffect("tap.mp3");

    // menu作成
    CCMenuItemFont* hoge = CCMenuItemFont::create("tap", this, menu_selector(Sample::tapHoge));
    CCMenuItemFont* fuga = CCMenuItemFont::create("tap", this, menu_selector(Sample::tapFuga));
    CCMenu* menu = CCMenu::create(hoge, fuga, NULL);
    this->addChild(menu);
}

void Sample::tapHoge(CCNode* sender)
{
    // 音を鳴らす
    SimpleAudioEngine::sharedEngine()->playEffect("tap.mp3", false);
    // 以下に処理
}
void Sample::tapFuga(CCNode* sender)
{
    // 音を鳴らす
    SimpleAudioEngine::sharedEngine()->playEffect("tap.mp3", false);
    // 以下に処理
}

さっくり書いちゃうとこんな感じでしょうか
これはこれで十分ですけど、メニューアイテムが多くなってきたときに、
まぁわりとめんどい。
処理先のメソッドに書き忘れたりして…

それを回避する一つの方法として、タップ時の処理先を一つに限定して
tagとかで判定する方法もありますね

void Simple::tapMenu(CCNode* sender)
{
    // 音をならす
    SimpleAudioEngine::sharedEngine()->playEffect("tap.mp3", false);

    //処理わけ
    switch (sender->getTag()) {
        case 0:
            // それのしょり
            break;
        case 1:
            // それのしょり
            break;
        default:
            break;
    }
}

こういう感じ。
もちろん CCMenuItem に予めtagを設定しておく必要があります
さらに enum とかで定義してればみわけもつきやすくなるでしょう
ただ、これも10個(そんな画面あるか?)とかなってくると
やっぱりそれなりに長くなります。

(僕が提案する方法やったって、この長さは変わんないわ…(;´∀`))
不愉快です!(笑)

ということで、ここからが漸く本題ですが
んじゃ、画面で制御して鳴らすんではなくて、
CCMenuの方でタップされたらなるようにしましょうよ
っていうこと
CCMenuを継承してCCMenuSoundというものを作ってみました

CCMenuSound.h

#include "cocos2d.h"

class CCMenuSound : public cocos2d::CCMenu
{
public:
    CCMenuSound();
    virtual ~CCMenuSound();

    static CCMenuSound* create(const char* soundName, cocos2d::CCMenuItem* item, ...);
    virtual void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);

    void setSound(const char* sound);

protected:
private:
    const char* m_sound;

};

CCMenuSound.cpp
#include "CCMenuSound.h"

#include "SimpleAudioEngine.h"

USING_NS_CC;
using namespace std;
using namespace CocosDenshion;

CCMenuSound::CCMenuSound()
{
}
CCMenuSound::~CCMenuSound()
{   
}

CCMenuSound* CCMenuSound::create(const char *soundName, CCMenuItem *item, ...)
{
    va_list args;
    va_start(args,item);
    CCArray* pArray = NULL;
    if( item )
    {
        pArray = CCArray::create(item, NULL);
        CCMenuItem *i = va_arg(args, CCMenuItem*);
        while(i)
        {
            pArray->addObject(i);
            i = va_arg(args, CCMenuItem*);
        }
    }   
    CCMenuSound* pRet = new CCMenuSound();
    pRet->initWithArray(pArray);
    pRet->setSound(soundName);
    va_end(args);
    return pRet;
}

void CCMenuSound::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
    SimpleAudioEngine::sharedEngine()->playEffect(m_sound, false);
    CCMenu::ccTouchEnded(touch, event);
}

void CCMenuSound::setSound(const char *sound)
{
    m_sound = sound;
    SimpleAudioEngine::sharedEngine()->setEffectsVolume(.5);
    SimpleAudioEngine::sharedEngine()->preloadEffect(m_sound);
}

使う場合は…一番最初のやつを例になおすと

CCMenuSound使い方
    CCMenuSound* menuSound = CCMenuSound::create("tap.mp3", hoge, fuga, NULL);

これで、タップしたら音がなるCCMenuの完成です
メニューを設置するたびに音読みこんでー鳴らしてーとかやんなくてだいぶ楽かと。

記述ミスやらバグとかなにかあれば、教えていただけると幸いです〜

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3