閱讀388 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Cocos2d-x實例:設置背景音樂與音效-設置場景實現

設置場景SettingSetting.h文件代碼如下
#ifndef __Setting_SCENE_H__
#define __Setting_SCENE_H__


#include "cocos2d.h"
#include "SimpleAudioEngine.h"


class Setting : public cocos2d::Layer
{
	bool isEffect;														①
public:
    static cocos2d::Scene* createScene();
    virtual bool init();  
	virtual void onEnter();
	virtual void onEnterTransitionDidFinish();
	virtual void onExit();
	virtual void onExitTransitionDidStart();
	virtual void cleanup();
    
    void menuSoundToggleCallback(cocos2d::Ref* pSender);
	void menuMusicToggleCallback(cocos2d::Ref* pSender);
	void menuOkCallback(cocos2d::Ref* pSender);
    
    CREATE_FUNC(Setting);
};


#endif // __Setting_SCENE_H__


#define __HELLOWORLD_SCENE_H__




上述代碼第①是定義布爾類型成員變量isEffect它用來保存現在是否允許音效事實上是否允許音效和背景音樂播放狀態應該持久化到文件中由於我們還沒有介紹數據持久化所以我們采用isEffect變量記錄狀態當我們在後麵的章節學習完成數據持久化後再保存它們狀態。其它的代碼與HelloWorld場景代碼非常相似這裏不再贅述。Setting.cpp文件代碼如下
#include "SettingScene.h"


USING_NS_CC;
using namespace CocosDenshion;


… …
bool Setting::init()
{
    if ( !Layer::init() )
    {
        return false;
    }


	log("Setting init");
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();


    Sprite *bg = Sprite::create("setting-back.png");
    
    bg->setPosition(Point(origin.x + visibleSize.width/2,
                             origin.y + visibleSize.height /2));
    this->addChild(bg);


	//音效
    auto soundOnMenuItem = MenuItemImage::create(
                             "on.png",
                             "on.png");
    auto soundOffMenuItem = MenuItemImage::create(
                             "off.png",
                             "off.png");
    
    auto soundToggleMenuItem = MenuItemToggle::createWithCallback(
								CC_CALLBACK_1(Setting::menuSoundToggleCallback, this), 
												soundOffMenuItem,
												soundOnMenuItem, 
												NULL);
	soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818, 220)));
    
    //背景音樂
    auto musicOnMenuItem  = MenuItemImage::create(
                             "on.png",
                             "on.png");
	auto musicOffMenuItem  = MenuItemImage::create(
                             "off.png",
                             "off.png");
    auto musicToggleMenuItem = MenuItemToggle::createWithCallback(
								CC_CALLBACK_1(Setting::menuMusicToggleCallback, this),
                                                    musicOffMenuItem,
                                                    musicOnMenuItem,
                                                    NULL );
	musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818, 362)));


    //Ok按鈕
	auto okMenuItem  = MenuItemImage::create( 
                             "ok-down.png",
                             "ok-up.png",
							 CC_CALLBACK_1(Setting::menuOkCallback, this));


	okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(600, 510)));


    Menu* mn = Menu::create(soundToggleMenuItem, musicToggleMenuItem,okMenuItem, NULL);
	mn->setPosition(Point::ZERO);
    this->addChild(mn);


    return true;
}


void Setting::menuOkCallback(Ref* pSender)
{
	Director::getInstance()->popScene();
	if (isEffect) {
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");					①
	}
}


void Setting::menuSoundToggleCallback(Ref* pSender)							②
{
	auto soundToggleMenuItem = (MenuItemToggle*)pSender;
	log("soundToggleMenuItem %d", soundToggleMenuItem->getSelectedIndex());


	if (isEffect) {
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");					③
	}


	if (soundToggleMenuItem->getSelectedIndex() == 1) {//選中狀態Off -> On				④
		isEffect = false;
	} else {
		isEffect = true;
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");					⑤
	}
}


void Setting::menuMusicToggleCallback(Ref* pSender)							⑥
{
   	auto musicToggleMenuItem = (MenuItemToggle*)pSender;
	log("musicToggleMenuItem %d", musicToggleMenuItem->getSelectedIndex());
	
	if (musicToggleMenuItem->getSelectedIndex() == 1) {//選中狀態Off -> On				⑦
		SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Synth.mp3");
	} else {
		SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3");
	}
	if (isEffect) {
		SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");					⑧
	}
}


void Setting::onEnter()
{
	Layer::onEnter();
	log("Setting onEnter");
}


void Setting::onEnterTransitionDidFinish()
{
	Layer::onEnterTransitionDidFinish();
	log("Setting onEnterTransitionDidFinish");	
	isEffect = true;
	//播放
	SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3", true);		⑨
}


void Setting::onExit()
{
	Layer::onExit();
	log("Setting onExit");	
}


void Setting::onExitTransitionDidStart()
{
	Layer::onExitTransitionDidStart();
	log("Setting onExitTransitionDidStart");
}


void Setting::cleanup()
{
	Layer::cleanup();
	log("Setting cleanup");	
	//停止
	SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Synth.mp3");			⑩
}


上述代碼第①、③、⑧行是在判斷isEffect為true音效播放開關打開情況下播放音效。
代碼第②行menuSoundToggleCallback是用戶點擊音效開發按鈕時候回調函數其中第④行代碼是判斷是否按鈕狀態從Off -> On如果是則將開關變量isEffect 設置為false否則為true而且通過第⑤行代碼SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav")播放一次音效。
代碼第⑥行menuMusicToggleCallback是用戶點擊背景音樂按鈕時候回調函數其中第⑦行代碼是判斷是否按鈕狀態從Off -> On如果是則停止播放背景音樂否則為開始播放。

第⑧行代碼是onEnterTransitionDidFinish()函數中播放背景音樂。第⑨行代碼是cleanup()函數中停止播放背景音樂。



更多內容請關注最新Cocos圖書《Cocos2d-x實戰 C++卷》
本書交流討論網站https://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程https://v.51work6.com
歡迎加入Cocos2d-x技術討論群257760386


《Cocos2d-x實戰 C++卷》現已上線各大商店均已開售

京東https://item.jd.com/11584534.html

亞馬遜https://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

當當https://product.dangdang.com/23606265.html

互動出版網https://product.china-pub.com/3770734

《Cocos2d-x實戰 C++卷》源碼及樣章下載地址

源碼下載地址https://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

樣章下載地址https://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

歡迎關注智捷iOS課堂微信公共平台


最後更新:2017-04-03 05:39:44

  上一篇:go Pushlet 性能測試計劃v1預覽
  下一篇:go 關於MySQL與SQLLite的Group By排序原理的區別