因为要做出这个效果搞了好几天终于想到一个比较好的办法,参考了喔喔回家游戏
.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);
}