1、演示背景音乐和音效控制示例:
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// 关闭菜单
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width / 2,
origin.y + closeItem->getContentSize().height / 2));
// 创建菜单
auto menu = Menu::create(closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);
// 预加载背景音乐和音效
SimpleAudioEngine::getInstance()->preloadBackgroundMusic(MUSIC_FILE);
SimpleAudioEngine::getInstance()->preloadEffect(EFFECT_FILE);
// 背景音乐控制标签
auto lblMusic = Label::createWithSystemFont("背景音乐控制", "Arial", 32);
lblMusic->setPosition(visibleSize.width * 0.25, visibleSize.height * 0.9);
this->addChild(lblMusic);
// 播放背景音乐
auto playMusic = Button::createWithText("播放");
playMusic->onTriggered([] {
SimpleAudioEngine::getInstance()->playBackgroundMusic(MUSIC_FILE);
});
playMusic->setPosition(visibleSize.width * 0.10, visibleSize.height * 0.8);
this->addChild(playMusic);
// 停止背景音乐
auto stopMusic = Button::createWithText("停止");
stopMusic->onTriggered([] {
SimpleAudioEngine::getInstance()->stopBackgroundMusic();
});
stopMusic->setPosition(visibleSize.width * 0.25, visibleSize.height * 0.8);
this->addChild(stopMusic);
// 回放背景音乐
auto rewindMusic = Button::createWithText("回放");
rewindMusic->onTriggered([] {
SimpleAudioEngine::getInstance()->rewindBackgroundMusic();
});
rewindMusic->setPosition(visibleSize.width * 0.40, visibleSize.height * 0.8);
this->addChild(rewindMusic);
// 暂停背景音乐
auto pauseMusic = Button::createWithText("暂停");
pauseMusic->onTriggered([] {
SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
});
pauseMusic->setPosition(visibleSize.width * 0.10, visibleSize.height * 0.65);
this->addChild(pauseMusic);
// 继续背景音乐
auto resumeMusic = Button::createWithText("暂停");
resumeMusic->onTriggered([] {
SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
});
resumeMusic->setPosition(visibleSize.width * 0.25, visibleSize.height * 0.65);
this->addChild(resumeMusic);
// 音效控制标签
auto lblSound = Label::createWithSystemFont("音效控制", "Arial", 32);
lblSound->setPosition(visibleSize.width * 0.75, visibleSize.height * 0.9);
this->addChild(lblSound);
// 播放音效
auto playEffect = Button::createWithText("播放");
playEffect->onTriggered([this] {
const float pitch = _sliderPitch->getValue();
const float pan = _sliderPan->getValue();
const float gain = _sliderGain->getValue();
_soundId = SimpleAudioEngine::getInstance()->playEffect(EFFECT_FILE, false, pitch, pan, gain);
});
playEffect->setPosition(visibleSize.width * 0.60, visibleSize.height * 0.8);
this->addChild(playEffect);
// 暂停音效
auto pauseEffect = Button::createWithText("暂停");
pauseEffect->onTriggered([this] {
SimpleAudioEngine::getInstance()->pauseEffect(_soundId);
});
pauseEffect->setPosition(visibleSize.width * 0.75, visibleSize.height * 0.8);
this->addChild(pauseEffect);
// 继续音效
auto resumeEffect = Button::createWithText("继续");
resumeEffect->onTriggered([this] {
SimpleAudioEngine::getInstance()->resumeEffect(_soundId);
});
resumeEffect->setPosition(visibleSize.width * 0.90, visibleSize.height * 0.8);
this->addChild(resumeEffect);
// 停止音效
auto stopEffect = Button::createWithText("停止");
stopEffect->onTriggered([this] {
SimpleAudioEngine::getInstance()->stopEffect(_soundId);
});
stopEffect->setPosition(visibleSize.width * 0.60, visibleSize.height * 0.70);
this->addChild(stopEffect);
// 循环播放音效
auto playEffectInLoop = Button::createWithText("循环播放");
playEffectInLoop->onTriggered([this] {
const float pitch = _sliderPitch->getValue();
const float pan = _sliderPan->getValue();
const float gain = _sliderGain->getValue();
SimpleAudioEngine::getInstance()->playEffect(EFFECT_FILE, true, pitch, pan, gain);
});
playEffectInLoop->setPosition(visibleSize.width * 0.75, visibleSize.height * 0.70);
this->addChild(playEffectInLoop);
// 暂停所有音效
auto pauseAllEffect = Button::createWithText("暂停所有");
pauseAllEffect->onTriggered([this] {
SimpleAudioEngine::getInstance()->pauseAllEffects();
});
pauseAllEffect->setPosition(visibleSize.width * 0.55, visibleSize.height * 0.60);
this->addChild(pauseAllEffect);
// 继续所有音效
auto resumeAllEffect = Button::createWithText("继续所有");
resumeAllEffect->onTriggered([this] {
SimpleAudioEngine::getInstance()->resumeAllEffects();
});
resumeAllEffect->setPosition(visibleSize.width * 0.75, visibleSize.height * 0.60);
this->addChild(resumeAllEffect);
// 停止所有音效
auto stopAllEffect = Button::createWithText("停止所有");
stopAllEffect->onTriggered([this] {
SimpleAudioEngine::getInstance()->stopAllEffects();
});
stopAllEffect->setPosition(visibleSize.width * 0.92, visibleSize.height * 0.60);
this->addChild(stopAllEffect);
// 音量调整标签
auto lblMusicVolume = Label::createWithSystemFont("音量", "Arial", 24);
lblMusicVolume->setPosition(visibleSize.width * 0.08, visibleSize.height * 0.45);
this->addChild(lblMusicVolume);
// 音量大小调整滑块
_sliderMusicVolume = AudioSlider::create();
_sliderMusicVolume->setValue(0.00f, 1.00f, 1.0f);
_sliderMusicVolume->setSliderPosition(0.28, 0.45);
// 绑定音量事件处理函数,当滑块被拖动时被调用
_sliderMusicVolume->getSlider()->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::musicValueChanged), Control::EventType::VALUE_CHANGED);
this->addChild(_sliderMusicVolume);
// 音效调整标签
auto lblEffectsVolume = Label::createWithSystemFont("音效", "Arial", 24);
lblEffectsVolume->setPosition(visibleSize.width * 0.60, visibleSize.height * 0.45);
this->addChild(lblEffectsVolume);
// 音效大小调整滑块
_sliderEffectsVolume = AudioSlider::create();
_sliderEffectsVolume->setValue(0.00f, 1.00f, 1.0f);
_sliderEffectsVolume->setSliderPosition(0.80, 0.45);
// 绑定音量事件处理函数,当滑块被拖动时被调用
_sliderEffectsVolume->getSlider()->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::effectsValueChanged), Control::EventType::VALUE_CHANGED);
this->addChild(_sliderEffectsVolume);
// 高音调整标签
auto lblPltich = Label::createWithSystemFont("高音", "Arial", 24);
lblPltich->setPosition(visibleSize.width * 0.60, visibleSize.height * 0.35);
this->addChild(lblPltich);
// 高音大小调整滑块
_sliderPitch = AudioSlider::create();
_sliderPitch->setValue(-0.50f, 2.00f, 1.0f);
_sliderPitch->setSliderPosition(0.80, 0.35);
this->addChild(_sliderPitch);
// 立体效果调整标签
auto lblPan = Label::createWithSystemFont("立体效果", "Arial", 24);
lblPan->setPosition(visibleSize.width * 0.60, visibleSize.height * 0.25);
this->addChild(lblPan);
// 立体效果调整滑块
_sliderPan = AudioSlider::create();
_sliderPan->setValue(-1.00f, 1.00f, 0.0f);
_sliderPan->setSliderPosition(0.80, 0.25);
this->addChild(_sliderPan);
// 音量调整标签
auto lblGain = Label::createWithSystemFont("音量", "Arial", 24);
lblGain->setPosition(visibleSize.width * 0.60, visibleSize.height * 0.15);
this->addChild(lblGain);
// 音量调整滑块
_sliderGain = AudioSlider::create();
_sliderGain->setValue(0.00f, 1.00f, 1.0f);
_sliderGain->setSliderPosition(0.80, 0.15);
this->addChild(_sliderGain);
Button类中定义了两个私有变量,_child表示一个标签,_onTriggered表示触碰标签时就会触发的函数,在构造函数中创建了单点触摸事件监听器,并在事件分发器中添加了一个场景优先事件监听器,当标签被触碰时会响应单点触摸事件。在onTouchBegin中响应函数中,对被触摸的标签进行缩放,用于屏幕显示触碰效果,onTouchEnd响应函数中调用了自定义的_onTriggered函数,需要将触碰标签所需要执行的代码写在_onTrigggered函数中,onTouchCancelled响应函数将被触碰的标签缩放回原来的大小
2、演示用户数据存储示例:
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// 关闭菜单
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width / 2,
origin.y + closeItem->getContentSize().height / 2));
// 创建菜单
auto menu = Menu::create(closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);
auto label = Label::createWithSystemFont("用户数据存储测试(请查看控制台)", "Arial", 28);
this->addChild(label, 0);
label->setPosition(Vec2(visibleSize.width / 2, visibleSize.height - 50));
// ①设置用户数据
UserDefault::getInstance()->setStringForKey("string", "value1");
UserDefault::getInstance()->setIntegerForKey("integer", 10);
UserDefault::getInstance()->setFloatForKey("float", 2.3f);
UserDefault::getInstance()->setDoubleForKey("double", 2.4);
UserDefault::getInstance()->setBoolForKey("bool", true);
log("********************** 第一次设置的用户数据 ***********************");
// ②打印之前设置的数据值
std::string ret = UserDefault::getInstance()->getStringForKey("string");
log("string is %s", ret.c_str());
double d = UserDefault::getInstance()->getDoubleForKey("double");
log("double is %f", d);
int i = UserDefault::getInstance()->getIntegerForKey("integer");
log("integer is %d", i);
float f = UserDefault::getInstance()->getFloatForKey("float");
log("float is %f", f);
bool b = UserDefault::getInstance()->getBoolForKey("bool");
if (b)
{
log("bool is true");
}
else
{
log("bool is false");
}
// ③通过Key修改用户数据
UserDefault::getInstance()->setStringForKey("string", "value2");
UserDefault::getInstance()->setIntegerForKey("integer", 11);
UserDefault::getInstance()->setFloatForKey("float", 2.5f);
UserDefault::getInstance()->setDoubleForKey("double", 2.6);
UserDefault::getInstance()->setBoolForKey("bool", false);
// ④将XML数据保存到文件中。
UserDefault::getInstance()->flush();
log("********************** 修改之后的用户数据 ***********************");
// ⑤再次获取用户数据并打印
ret = UserDefault::getInstance()->getStringForKey("string");
log("string is %s", ret.c_str());
d = UserDefault::getInstance()->getDoubleForKey("double");
log("double is %f", d);
i = UserDefault::getInstance()->getIntegerForKey("integer");
log("integer is %d", i);
f = UserDefault::getInstance()->getFloatForKey("float");
log("float is %f", f);
b = UserDefault::getInstance()->getBoolForKey("bool");
if (b)
{
log("bool is true");
}
else
{
log("bool is false");
}
// ⑥获取XML文件的默认地址
std::string filePath = UserDefault::getInstance()->getXMLFilePath();
log("XML文件保存路径:%s", filePath.c_str());
init函数中的代码分为几个步骤:
(1)编号①的代码获取UserDefault的单例对象并设置了一些各种类型的数据
(2)编号②的代码从UserDefault对象中获取之前设置的数据值打印在控制台
(3)编号③的代码使用UserDefault对象通过Key修改用户数据
(4)编号④的代码调用flush将XML数据保存到文件中
(5)编号⑤的代码再次获取用户数据并打印
(6)编号⑥的代码获取XML文件的保存路径,用以查看文件内容