Cocos2dx声音系统和数据存储学习笔记

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文件的保存路径,用以查看文件内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值