弹入和弹出菜单为了使动作更平滑,涉及到动作组合。(CCMoveTo 、CCEaseExponentialOut)(菜单背景图位置仅为示范例子,还需调整)
以菜单的背景图为例:
//生成菜单背景图 CCSprite* MainMenuBG = CCSprite::create("menu_bg.png"); MainMenuBG->setPosition(ccp(visibleSize.width/2 +10,visibleSize.height +20)); this->addChild(MainMenuBG,0); MainMenuBG->setTag(menu_bg_tag); //定义背景层 弹入弹出 //MainMenuBG Moveout CCMoveTo* MainMenuBGMoveout = CCMoveTo::create(3.0f,ccp(visibleSize.width/2,visibleSize.height/2)); CCEaseExponentialOut* MainMenuBGExponentialOut = CCEaseExponentialOut::create(MainMenuBGMoveout); //MainMenuBG Movein MainMenuBG = (CCSprite*)this->getChildByTag(menu_bg_tag); CCPoint MainMenuBGHidepoint = ccp(visibleSize.width/2,visibleSize.height + MainMenuBG->getContentSize().height/2); CCMoveTo* MainMenuBGMovein=CCMoveTo::create(3.0f,MainMenuBGHidepoint); CCEaseExponentialIn* MainMenuBGExponentialIn = CCEaseExponentialIn::create(MainMenuBGMovein); //调用顺序复合动作 CCRepeatForever* rept0= CCRepeatForever::create(CCSequence::create(MainMenuBGExponentialOut,MainMenuBGExponentialIn,NULL)); MainMenuBG->runAction(rept0);
==================
源码如下:
///////////////////////////////////////////// /*HelloWorldScene.h*/ #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" class HelloWorld : public cocos2d::CCLayer { public: // Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp,so we recommend returning the class instance pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); //定义菜单项 bool MainMenu(); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); }; #endif // __HELLOWORLD_SCENE_H__ ////////////////////////////////////////////////////////////////// /* HelloWorldScene.cpp */ #include "HelloWorldScene.h" USING_NS_CC; enum{ menu_pause_tag =1,menu_bg_tag=2 }; CCScene* HelloWorld::scene() { // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); scene->addChild(layer,999); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); ///////////////////////////// // 2. add a menu item with "X" image,which is clicked to quit the program // you may modify it. // add a "close" icon to exit the progress. it's an autorelease object CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png","CloseSelected.png",this,menu_selector(HelloWorld::menuCloseCallback)); pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2,origin.y + pCloseItem->getContentSize().height/2)); // create menu,it's an autorelease object CCMenu* pMenu = CCMenu::create(pCloseItem,NULL); pMenu->setPosition(CCPointZero); this->addChild(pMenu,1); ///////////////////////////// // 3. add your codes below... //调用菜单 MainMenu(); return true; } void HelloWorld::menuCloseCallback(CCObject* pSender) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); #else CCDirector::sharedDirector()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif #endif } bool HelloWorld::MainMenu() { CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); // //设定菜单项 MenuItem CCMenuItemImage *item0 = CCMenuItemImage::create( "menu_restart_normal_CN.png","menu_restart_pressed_CN.png",menu_selector(HelloWorld::menuCloseCallback)); //MenuItem 1 CCMenuItemImage *item1 = CCMenuItemImage::create( "menu_resume_normal_CN.png","menu_resume_pressed_CN.png",menu_selector(HelloWorld::menuCloseCallback)); //MenuItem 2 CCMenuItemImage *item2 = CCMenuItemImage::create( "menu_quit_normal_CN.png","menu_quit_pressed_CN.png",menu_selector(HelloWorld::menuCloseCallback)); //MenuItem 3 CCMenuItemImage *item3 = CCMenuItemImage::create( "CloseNormal.png",menu_selector(HelloWorld::menuCloseCallback)); //根据菜单项生成主菜单 CCMenu *MainMenu = CCMenu::create(item0,item1,item2,item3,NULL); MainMenu->alignItemsVerticallyWithPadding(15.0f); MainMenu->setPosition(ccp(visibleSize.width/2,visibleSize.height)); MainMenu->setTag(menu_pause_tag); this->addChild(MainMenu,1); //生成菜单背景图 CCSprite* MainMenuBG = CCSprite::create("menu_bg.png"); MainMenuBG->setPosition(ccp(visibleSize.width/2 +10,0); MainMenuBG->setTag(menu_bg_tag); //定义弹出 菜单弹入弹出效果 //MainMenu moveout CCMoveTo* MainMenuMoveOut = CCMoveTo::create(3.0f,visibleSize.height/2)); CCEaseExponentialOut* MainMenuExponentialOut = CCEaseExponentialOut::create(MainMenuMoveOut); //MainMenu movein MainMenu = (CCMenu*)this->getChildByTag(menu_pause_tag); CCPoint MainMenuHidepoint = ccp(visibleSize.width/2,visibleSize.height + MainMenu->getContentSize().height/2); CCMoveTo* MainMenuMovein=CCMoveTo::create(3.0f,MainMenuHidepoint); CCEaseExponentialIn* MainMenuExponentailIn = CCEaseExponentialIn::create(MainMenuMovein); // //定义背景层 弹入弹出 //MainMenuBG Moveout CCMoveTo* MainMenuBGMoveout = CCMoveTo::create(3.0f,visibleSize.height/2)); CCEaseExponentialOut* MainMenuBGExponentialOut = CCEaseExponentialOut::create(MainMenuBGMoveout); //MainMenuBG Movein MainMenuBG = (CCSprite*)this->getChildByTag(menu_bg_tag); CCPoint MainMenuBGHidepoint = ccp(visibleSize.width/2,MainMenuBGHidepoint); CCEaseExponentialIn* MainMenuBGExponentialIn = CCEaseExponentialIn::create(MainMenuBGMovein); //调用弹入 弹出动作 CCRepeatForever* rept1= CCRepeatForever::create(CCSequence::create(MainMenuExponentialOut,MainMenuExponentailIn,NULL)); MainMenu->runAction(rept1); CCRepeatForever* rept0= CCRepeatForever::create(CCSequence::create(MainMenuBGExponentialOut,NULL)); MainMenuBG->runAction(rept0); return true; }