您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx 玩转音乐播放

2015-08-26 20:28 555 查看
PlayMusic.cpp



#include "PlayMusic.h"
#include "SimpleAudioEngine.h"
#include "iconv/iconvString.h"//报错请查下面看注意事项
#include "SystemHeader.h"//报错请查下面看注意事项
USING_NS_CC;
using namespace CocosDenshion;
//根据不同的平台使用的预编译索引不同音频文件
#if   (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#define EFFECT_FILE   "effect2.ogg"
#elif (CC_TARCET_PLATFORM == CC_PLATFORM_MARMALADE)
#define EFFECT_FILE   "effect1.raw"
#else
#define EFFECT_FILE   "sound/FX088.mp3"
#endif

#if (CC_TARGET_PLATEFOM == CC_PLATFORM_WIN32)
#define  MUSIC_FILE   "music.mid"
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY)
#define MUSIC_FILE    "background.ogg"
#else
#define MUSIC_FILE    "sound/BACK_MUSIC.mp3"
#endif

std::string items[] = {
"播放背景音乐", "停止背景音乐", "暂停背景音乐", "继续播放背景音乐", "后退背景音乐", "背景音乐是否播放", "播放音效", "重复播放音效", "停止音效播放", "释放音效", "增加背景音乐音量", "减少背景音效音量", "增加音效音量", "减少音效音量", "暂停音效", "继续播放音效", "暂停所有音效", "继续所有音效", "停止所有音效"
};
unsigned int PlayMusic::effectId = 0;
Scene* PlayMusic::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create();

// 'layer' is an autorelease object
PlayMusic *layer = PlayMusic::create();

// add layer as a child to scene
scene->addChild(layer);

// return the scene
return scene;
}

// on "init" you need to initialize your instance
bool PlayMusic::init()
{
//////////////////////////////
// 1. super init first
if (!Layer::init())
{
return false;
}
code_convert_init();
//
CCMenu * m_pItmeMenu = CCMenu::create();
CCSize size = CCDirector::sharedDirector()->getWinSize();
int m_nTestCount = sizeof(items) / sizeof(items[0]);

for (int i = 0; i<=18;i++)
{
LabelTTF * label = LabelTTF::create(gbktoutf8(items[i].c_str()), "", 20);
label->setColor(Color3B::GREEN);
MenuItemLabel * pMenuItem = MenuItemLabel::create(label, CC_CALLBACK_1(PlayMusic::menuBack,this));
m_pItmeMenu->addChild(pMenuItem, i);
pMenuItem->setPosition(CCPointMake(0, (size.height*0.5  - (i + 1) * 30)));
}
addChild(m_pItmeMenu, 0, 100);

//    预加载音乐和音效
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);
SimpleAudioEngine::sharedEngine()->preloadEffect(EFFECT_FILE);

//    设置默认音量
SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);

// CCUserDefault::sharedUserDefault()->setStringForKey("name", "baibai");
SaveStringToXML("name", "baibai");
CCUserDefault::sharedUserDefault()->flush();//写了东西要提交

// std::string name = CCUserDefault::sharedUserDefault()->getStringForKey("name");
std::string name = LoadStringFromXML("name");
log("name: %s ", name.c_str());
log("%s", FileUtils::getInstance()->getWritablePath().c_str());

Size winSize = CCDirector::getInstance()->getWinSize();
Point pCenter = Point(winSize.width / 2, winSize.height / 2);
ControlPotentiometer* potentiometer = ControlPotentiometer::create("potentiometerTrack.png"
, "potentiometerProgress.png"
, "potentiometerButton.png");
potentiometer->setPosition(Point(winSize.width / 2 - 200, winSize.height / 2));
//监听进度值改变事件
potentiometer->addTargetWithActionForControlEvents(this, cccontrol_selector(PlayMusic::onValueChange), Control::EventType::VALUE_CHANGED);
this->addChild(potentiometer);

ControlSlider* slider = ControlSlider::create("sliderTrack.png", "sliderProgress.png", "sliderThumb.png");
slider->setPosition(Point(winSize.width / 2-200, winSize.height / 2 - 80));
//设置滑动条的范围
slider->setMinimumValue(0.0f);
slider->setMaximumValue(1.0f);
//设置滑动条当前值
slider->setValue(0.5f);
slider->addTargetWithActionForControlEvents(this, cccontrol_selector(PlayMusic::sliderChange), Control::EventType::VALUE_CHANGED);
this->addChild(slider);

//得到窗口的大小
///CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//设置ControlSwitch控件打开的文字No"
Label* On = Label::create("ON", "fonts/arial.ttf", 16);
//设置ControlSwitch控件关闭时的文字"OFF"
Label* Off = Label::create("OFF", "fonts/arial.ttf", 16);
//设置ControlSwitch控件打开的文字的颜色
On->setColor(ccc3(0, 0, 0));
//设置ControlSwitch控件关闭时的颜色
Off->setColor(ccc3(0, 0, 0));
//创建ControlSwitch控件
ControlSwitch *switchControl = ControlSwitch::create(
Sprite::create("switch-mask.png"),
Sprite::create("switch-on.png"),
Sprite::create("switch-off.png"),
Sprite::create("switch-thumb.png"),
On,
Off
);
//设置ControlSwitch控件的位置
switchControl->setPosition(Point(winSize.width / 2-200, winSize.height / 2 + 80));
// 注册valuechange消息,当valuechange时,调用switchValueChanged函数
switchControl->addTargetWithActionForControlEvents(this,
cccontrol_selector(PlayMusic::switchValueChanged),
Control::EventType::VALUE_CHANGED);
//添加ControlSwitch控件
addChild(switchControl);
return true;
}
void PlayMusic::switchValueChanged(Ref* psender, Control::EventType event)
{
if (event == Control::EventType::VALUE_CHANGED)
{
ControlSwitch* control = (ControlSwitch*)psender;
if (control->isOn())
{
SaveBooleanToXML("SOUND_KEY", true);
SaveBooleanToXML("MUSIC_KEY", true);
//  CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("BACK_MUSIC.wav", true);
//  CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeAllEffects();
//log("Switch if ON");
}
else
{
SaveBooleanToXML("SOUND_KEY", false);
SaveBooleanToXML("MUSIC_KEY", false);
//  CocosDenshion::SimpleAudioEngine::sharedEngine()->stopBackgroundMusic("BACK_MUSIC.wav");
//  CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseAllEffects();
//log("Swith is Off");
}
}
else
{
log("other events");
}
}

void PlayMusic::sliderChange(Ref* psender, Control::EventType event)
{
ControlSlider* slider = (ControlSlider*)psender;
String* valueStr = String::createWithFormat("%f", slider->getValue());
CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume((float)slider->getValue());
//log("setBackgroundMusicVolume=%f", CocosDenshion::SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume());
//log(valueStr->getCString());
}

void PlayMusic::onValueChange(Ref* psender, Control::EventType event)
{
ControlPotentiometer* potentiometer = (ControlPotentiometer*)psender;
String* valueStr = String::createWithFormat("%f", potentiometer->getValue());
CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume((float)potentiometer->getValue());
//log("onValueChange=%f", (float)potentiometer->getValue());
// log("setBackgroundMusicVolume=%f",CocosDenshion::SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume());
//  log(valueStr->getCString());
}
void PlayMusic::menuBack(Ref * pSender)
{

CCMenuItem * pMenuItem = (CCMenuItem *)(pSender);
int nIdx = pMenuItem->getZOrder();
switch (nIdx) {
case 0:
//             播放背景音乐
SimpleAudioEngine::sharedEngine()->playBackgroundMusic(MUSIC_FILE, true);
break;
case 1:
//             停止背景音乐
SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
break;
case 2:
//              暂停背景音乐
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
break;
case 3:
//             继续播放背景音乐
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
break;
case 4:
//             后退背景音乐
SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
break;
case 5:
//              背景音乐是否正在播放
if (SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying()) {
CCLOG("playing");
}
else
CCLOG("no play");
break;
case 6:
//             播放音效,并且得到此音效的ID
SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE);
break;
case 7:
//             重复播放音效
effectId =SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE, true);
break;
case 8:
//            停止播放音效
SimpleAudioEngine::sharedEngine()->stopEffect(effectId);
break;
case 9:
//            释放音效
SimpleAudioEngine::sharedEngine()->unloadEffect("effect1.wav");
break;
case 10:
//            增加背景音乐音量
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() + 0.1f);
break;
case 11:
//             减少背景音乐音量
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() - 0.1f);
break;
case 12:
//            增加背景音效音量
SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() + 0.1f);
break;
case 13:
//            减少背景音效音量
SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() - 0.1f);
break;
case 14:
//             暂停音效
SimpleAudioEngine::sharedEngine()->pauseEffect(effectId);
break;
case 15:
//            继续 播放音效
SimpleAudioEngine::sharedEngine()->resumeEffect(effectId);
break;
case 16:
//            暂停所有音效
SimpleAudioEngine::sharedEngine()->pauseAllEffects();
break;
case 17:
//             继续所有音效
SimpleAudioEngine::sharedEngine()->resumeAllEffects();
break;
case 18:
//            停止所有音效
SimpleAudioEngine::sharedEngine()->stopAllEffects();
break;

default:
break;
}

}


PlayMusic.h

#ifndef _PLAY_MUSIC_H_
#define _PLAY_MUSIC_H_
#include "cocos2d.h"
#include "cocos-ext.h"

using namespace cocos2d;
using namespace cocos2d::extension;
class PlayMusic : public cocos2d::Layer
{
public:
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::Scene* createScene();
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();

// a selector callback

// implement the "static create()" method manually
CREATE_FUNC(PlayMusic);
void menuBack(Ref * pSender);
void onValueChange(Ref* psender, Control::EventType event);
void sliderChange(Ref* psender, Control::EventType event);
void switchValueChanged(Ref* psender, Control::EventType event);
static unsigned int effectId;
protected:

};

#endif


注意事项:

1、如果#include “iconv/iconvString.h”这里报错,请参照我另一篇文章 cocos2d-x 3.4 中文乱码解决之道

2、如果#include “SystemHeader.h”这里报错,请参照我下一篇文章,也可以去掉报错的地方,这里是保存音乐设置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息