cocos2dx 玩转音乐播放
2015-08-26 20:28
555 查看
PlayMusic.cpp
PlayMusic.h
注意事项:
1、如果#include “iconv/iconvString.h”这里报错,请参照我另一篇文章 cocos2d-x 3.4 中文乱码解决之道
2、如果#include “SystemHeader.h”这里报错,请参照我下一篇文章,也可以去掉报错的地方,这里是保存音乐设置
#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”这里报错,请参照我下一篇文章,也可以去掉报错的地方,这里是保存音乐设置
相关文章推荐
- Cocos2d-x中背景音乐和音效使用实例
- Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
- Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例
- Cocos2d-x UI开发之文本类使用实例
- Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法
- Cocos2d-x UI开发之菜单类使用实例
- Cocos2d-x UI开发之CCControlButton控件类实例
- Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系
- Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
- Cocos2d-x学习笔记之CCLayerColor层的使用实例
- Cocos2d-x Schedule定时器的使用实例
- Cocos2d-x中使用CCScrollView来实现关卡选择实例
- Cocos2d-x中CCEditBox文本输入框的使用实例
- cocos2d-x学习笔记之CCLayer、CCLayerColor、CCLayerGradient、CCLayerMultiplex场景层介绍
- Cocos2d-x UI开发之CCControlSlider控件类使用实例
- Cocos2d-x学习笔记之开发环境搭建
- Cocos2d-x学习笔记之Hello World!
- Cocos2d-x的内存管理总结
- Cocos2d-x 3.0中集成社交分享ShareSDK的详细步骤和常见问题解决
- Cocos2d-x入门教程(详细的实例和讲解)