cocos2d-x 3.x学习之弹出音乐音效勾选框及滑动条

因为要做出这个效果搞了好几天终于想到一个比较好的办法,参考了喔喔回家游戏

.h文件中含有这些函数和变量的声明

static Scene *createScene();
virtual bool init();
CREATE_FUNC(Start);
void start();
void setLayer();
void helpLayer();
void setMusic(Ref *pSender);
void setEffect(Ref *pSender);
void setBack();
void helpBack();
void sliderCallback(Ref *pSender);
Menu *menu;
Sprite *setBG;
Sprite *helpBG;
Size visibleSize;
.cpp文件中各函数的实现

Scene * Start::createScene(){
    auto scene = Scene::create();
    auto layer = Start::create();
    scene->addChild(layer);
    return scene;
}
bool Start::init(){
    if (!Layer::init()) {
        return false;
    }
    visibleSize = Director::getInstance()->getVisibleSize();
    auto bg = Sprite::create("bg2.png");
    bg->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
    this->addChild(bg);
    //蝴蝶帧动画
    auto frameCache = SpriteFrameCache::getInstance();
    frameCache->addSpriteFramesWithFile("hudie.plist", "hudie.png");
    Vector<SpriteFrame*>frameArray;
    for (int i = 0; i <= 8; i++) {
        auto frame = frameCache->getSpriteFrameByName(StringUtils::format("%d.png",i).c_str());
        frameArray.pushBack(frame);
    }
    auto animation = Animation::createWithSpriteFrames(frameArray);
    animation->setLoops(-1);
    animation->setDelayPerUnit(0.1f);
    auto animate = Animate::create(animation);
    auto repeatForever = RepeatForever::create(animate);
    auto moveto1 = MoveTo::create(2.0, Vec2(150, visibleSize.height - 150));
    auto moveto2 = MoveTo::create(1.0, Vec2(300, 280));
    auto sequence = Sequence::create(moveto1,moveto2, NULL);
    //蝴蝶飞
    auto butterfly = Sprite::createWithSpriteFrame(frameCache->getSpriteFrameByName("1.png"));
    butterfly->setScale(2.0f);
    butterfly->setPosition(Vec2(visibleSize.width - 150, visibleSize.height - 150));
    this->addChild(butterfly);
    butterfly->runAction(repeatForever);
    butterfly->runAction(sequence);
    //三个按钮
    auto startButton = MenuItemImage::create("play.png", "play.png", CC_CALLBACK_0(Start::start, this));
    startButton->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2 + 100));
    auto setButton = MenuItemImage::create("set.png", "set.png",CC_CALLBACK_0(Start::setLayer, this));
    setButton->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
    auto helpButton = MenuItemImage::create("help.png", "help.png", CC_CALLBACK_0(Start::helpLayer, this));
    helpButton->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2 - 100));
    menu = Menu::create(startButton,setButton,helpButton, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu);
    //下雪的粒子效果
    auto snow = ParticleSnow::create();
    snow->setPosition(Vec2(visibleSize.width / 2, visibleSize.height));
    this->addChild(snow);
    SimpleAudioEngine::getInstance()->playBackgroundMusic("backmusic.mp3",true);
    
    return true;
}
void Start::start(){
    auto scene = Select::createScene();
    auto transition = TransitionCrossFade::create(2.0, scene);
    Director::getInstance()->replaceScene(transition);
}
void Start::setLayer(){
    menu->setEnabled(false);
    setBG = Sprite::create("mianban.png");
    setBG->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2 - 200));
    this->addChild(setBG);
    //背景音乐的勾选
    auto onMusic = MenuItemImage::create("duihao1.png", "duihao1.png");
    auto offMusic = MenuItemImage::create("duihao2.png","duihao2.png");
    auto music = MenuItemToggle::create(onMusic);
    music->addSubItem(offMusic);
    music->setCallback(CC_CALLBACK_1(Start::setMusic, this));
    music->setPosition(Vec2(setBG->getContentSize().width / 2 - 70, setBG->getContentSize().height / 2 + 100));
    auto menu1 = Menu::create(music, NULL);
    menu1->setPosition(Vec2::ZERO);
    setBG->addChild(menu1);
    auto musicLabel = Label::createWithTTF("Music", "fonts/Marker Felt.ttf", 30);
    musicLabel->setColor(Color3B::BLUE);
    musicLabel->setPosition(Vec2(setBG->getContentSize().width / 2 - 160, setBG->getContentSize().height / 2 + 100));
    setBG->addChild(musicLabel);
    
    //音效的勾选
    auto onEffect = MenuItemImage::create("duihao1.png","duihao1.png");
    auto offEffect = MenuItemImage::create("duihao2.png","duihao2.png");
    auto effect = MenuItemToggle::create(onEffect);
    effect->addSubItem(offEffect);
    effect->setCallback(CC_CALLBACK_1(Start::setEffect, this));
    effect->setPosition(Vec2(setBG->getContentSize().width / 2 + 150, setBG->getContentSize().height / 2 + 100));
    auto menu2 = Menu::create(effect, NULL);
    menu2->setPosition(Vec2::ZERO);
    setBG->addChild(menu2);
    auto effectLabel = Label::createWithTTF("Effect", "fonts/Marker Felt.ttf", 30);
    effectLabel->setColor(Color3B::BLUE);
    effectLabel->setPosition(Vec2(setBG->getContentSize().width / 2 + 60, setBG->getContentSize().height / 2 + 100));
    setBG->addChild(effectLabel);
    //创建控制音量大小的滑动条
    auto slider = Slider::create();
    //滑动条的背景纹理
    slider->loadBarTexture("SliderBar.png");
    //滑动条的滑动球
    slider->loadSlidBallTextures("aaa.png", "aaa.png", "aaa.png");
    slider->setPosition(Vec2(setBG->getContentSize().width / 2, setBG->getContentSize().height / 2 - 50));
    slider->setScale9Enabled(true);
    slider->setContentSize(Size(300, 40));
    slider->setPercent(70);
    slider->addEventListener(CC_CALLBACK_1(Start::sliderCallback, this));
    setBG->addChild(slider);
    
    //确定取消按钮
    auto okButton = Button::create("ok.png","ok.png");
    okButton->addClickEventListener(CC_CALLBACK_0(Start::setBack, this));
    okButton->setPosition(Vec2(setBG->getContentSize().width / 2, 100));
    setBG->addChild(okButton);
    auto moveto = MoveTo::create(0.8, Vec2(visibleSize.width / 2, visibleSize.height / 2));
    setBG->runAction(moveto);
}
void Start::helpLayer(){
    //帮助面板
    helpBG = Sprite::create("help_mianban.png");
    helpBG->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2 - 200));
    //菜单设置为false,无法点击
    menu->setEnabled(false);
    this->addChild(helpBG);
    auto okButton = Button::create("ok.png","ok.png");
    //按钮点击事件
    okButton->addClickEventListener(CC_CALLBACK_0(Start::helpBack, this));
    //位置应该是面板为参考系
    okButton->setPosition(Vec2(helpBG->getContentSize().width / 2, 100));
    helpBG->addChild(okButton);
    //点击之后
    auto moveto = MoveTo::create(0.8, Vec2(visibleSize.width / 2, visibleSize.height / 2));
    helpBG->runAction(moveto);
}
void Start::setBack(){
    //面板消失后菜单是可点击的
    menu->setEnabled(true);
    setBG->removeFromParent();
}
void Start::helpBack(){
    //同理
    menu->setEnabled(true);
    helpBG->removeFromParent();
}
void Start::setMusic(Ref *pSender){
    //音乐勾选框设置音乐事件
    auto toggle = (MenuItemToggle*)pSender;
    if (toggle->getSelectedIndex() == 1) {
        //暂停背景音乐
        SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
    }else{
        //恢复背景音乐
        SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
    }
}
void Start::setEffect(Ref *pSender){
    //音效勾选框设置音乐事件
    auto toggle = (MenuItemToggle*)pSender;
    if (toggle->getSelectedIndex() == 1) {
        //通过UserDefault保存记忆音效的Key,
        UserDefault::getInstance()->setBoolForKey("offEffect", true);
    }else{
        UserDefault::getInstance()->setBoolForKey("offEffect", false);
    }
}
void Start::sliderCallback(Ref *pSender){
    auto slider = (Slider*)pSender;
    //滑动条百分比
    SimpleAudioEngine::getInstance()->setBackgroundMusicVolume((float)slider->getPercent() / 100.0);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值