追記:使用している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の完成です
メニューを設置するたびに音読みこんでー鳴らしてーとかやんなくてだいぶ楽かと。
記述ミスやらバグとかなにかあれば、教えていただけると幸いです〜