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++卷》‍

本书交流讨论网站http://www.cocoagame.net

更多精彩视频课程请关注智捷课堂Cocos课程http://v.51work6.com

欢迎加入Cocos2d-x技术讨论群257760386

《Cocos2d-x实战 C++卷》现已上线各大商店均已开售‍

京东http://item.jd.com/11584534.html

亚马逊http://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

当当http://product.dangdang.com/23606265.html

互动出版网http://product.china-pub.com/3770734

《Cocos2d-x实战 C++卷》源码及样章下载地址

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

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

欢迎关注智捷iOS课堂微信公共平台

时间: 2024-08-07 01:28:26

Cocos2d-x实例:设置背景音乐与音效-设置场景实现的相关文章

Cocos2d-x实例:设置背景音乐与音效-HelloWorld场景实现

HelloWorld场景就是游戏中的主菜单场景.HelloWorld.h文件代码如下 #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include "SimpleAudioEngine.h" ① #include "SettingScene.h" class HelloWorld : public cocos2d::Layer { public: static cocos2d::Scen

Cocos2d-x实例:设置背景音乐与音效- AppDelegate实现

为了进一步了解背景音乐和音效播放的我们通过一个实例给大家介绍一下.如下图所示有两个场景HelloWorld和Setting.在HelloWorld场景点击"游戏设置"菜单可以切换到Setting场景在Setting场景中可以设置是否播放背景音乐和音效设置完成后点击"OK"菜单可以返回到HelloWorld场景.    我们需要在AppDelegate中实现背景音乐播放暂停与继续函数AppDelegate.h文件代码如下 #ifndef _APP_DELEGATE_H

Cocos2d-x使用UserDefault数据持久化实例:保存背景音乐和音效设置

UserDefault可以实现数据的存储但是它的使用不能泛滥具体讲一般情况下不会使用它保存大量的数据它没有SQL语句那样的灵活.UserDefault除了保存游戏设置外还有可以长期保持游戏精灵等对象的状态. 我们通过一个实例介绍一下在游戏项目中如何使用UserDefault.如图所示在Setting场景中可以设置是否播放背景音乐和音效现在我们将它完善将选择的状态保存到UserDefault中. 设置背景音乐与音效上图HelloWorld场景.下图Setting场景我们需要定义两个宏作为键其中SO

dreamweaver cs6怎么设置背景音乐有哪些方式

dreamweaver cs6设置背景音乐方法步骤: 一.代码指定方式 1.代码指定方式是指直接在页面的HTML代码内设置背景音乐.现实中通常使用标记来实现. 标记的语法格式如下: src:背景音乐文件地址; loop:设置播放次数,循环播放为-1; delay:播放音乐的延时; volume:背景音乐的音量; balance:背景音乐的左右均衡. 2.具体例子: 新建一个HTML空白页 3.打开代码视图,在中输入代码,详见下图: 4.根据代码中的条件输入完全,详见下图: 5.按F12预览就可以

dreamweaver cs6怎么设置背景音乐教程图解

  一.代码指定方式 1.代码指定方式是指直接在页面的HTML代码内设置背景音乐.现实中通常使用标记来实现. 标记的语法格式如下: src:背景音乐文件地址; loop:设置播放次数,循环播放为-1; delay:播放音乐的延时; volume:背景音乐的音量; balance:背景音乐的左右均衡. 2.具体例子: 新建一个HTML空白页 3.打开代码视图,在中输入代码,详见下图: 4.根据代码中的条件输入完全,详见下图: 5.按F12预览就可以了. 但是必须注意的是,插入的音乐文件要小,为了照

教你在PowerPoint演示文稿设置背景音乐的方法

  第1步,选中第一张幻灯片,单击"插入"选项卡,单击"声音"按钮,选择"文件中的声音". 第2步,弹出"插入声音"对话框.在"査找范围"中进入声音文件所在的分区和文件夹,然后选中需要的背景音乐,单击"确定"按钮. 第3步,弹出询问对话框,询问何时开始播放背景音乐.这里设置开始放映幻灯片时就播放背景音乐,则单击"自动"按钮,在第一张幻灯片中会出现一个喇叭符号. 通过前

音效设置-android音乐播放器设置音效

问题描述 android音乐播放器设置音效 我在做一个音乐播放器,有一个功能是音效设置,我在网上翻了一下没有找到类似的技术.希望大家知道的能帮忙解决一下. 解决方案 Android有一个系统控制音效的 AudioManager: 可以根据 AudioManager 的对象获取音效服务:

android-在屏幕左边的顶部设置 TextView,底部设置 ImageView

问题描述 在屏幕左边的顶部设置 TextView,底部设置 ImageView <LinearLayout android:layout_width="fill_parent" android:layout_height="0.0dip" android:layout_marginBottom="1.0dip" android:layout_marginRight="1.0dip" android:layout_weig

asp.net 网站运行很慢 很慢 为什么会这样 应该设置什么? 怎么设置呢?

问题描述 asp.net 网站运行很慢 很慢 为什么会这样 应该设置什么? 怎么设置呢? asp.net 网站运行很慢很慢 是什么原因? 应该设置什么? 怎么设置呢? 解决方案 这个原因多了去了,比如感染了360等流氓软件,甚至是cpu散热不好.重装系统看看,再不行就是硬件问题. 解决方案二: 是啊,这个原因多了去了,再问一下,你网站快过没有?所有人浏览你网站都慢吗?电信.移动都很慢吗?不是的话,那问题不在服务器.你服务器放在哪儿呢?国外?是的话,那正常.如果在国内,你可以访问一下同IP段其他网