設置場景(Setting),Setting.h文件代碼以下:
php
[html] view plaincopyhtml
#ifndef __Setting_SCENE_H__ 函數
#define __Setting_SCENE_H__ 學習
#include "cocos2d.h" 網站
#include "SimpleAudioEngine.h" this
class Setting : public cocos2d::Layer spa
{ .net
bool isEffect; ① code
public: orm
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文件代碼以下:
[html] view plaincopy
#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()函數中中止播放背景音樂。
更多內容請關注Cocos2d-x系列圖書《Cocos2d-x實戰(卷Ⅰ):C++開發》
本書交流討論網站:http://www.cocoagame.net
歡迎加入cocos2d-x技術討論羣:25776038六、327403678