首页 > 代码库 > cocos2d-x 弹入、弹出效果(以菜单为例子)
cocos2d-x 弹入、弹出效果(以菜单为例子)
弹入和弹出菜单为了使动作更平滑,涉及到动作组合。(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",
this,
menu_selector(HelloWorld::menuCloseCallback));
//MenuItem 1
CCMenuItemImage *item1 = CCMenuItemImage::create(
"menu_resume_normal_CN.png",
"menu_resume_pressed_CN.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
//MenuItem 2
CCMenuItemImage *item2 = CCMenuItemImage::create(
"menu_quit_normal_CN.png",
"menu_quit_pressed_CN.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
//MenuItem 3
CCMenuItemImage *item3 = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
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,visibleSize.height +20));
this->addChild(MainMenuBG,0);
MainMenuBG->setTag(menu_bg_tag);
//定义弹出 菜单弹入弹出效果
//MainMenu moveout
CCMoveTo* MainMenuMoveOut = CCMoveTo::create(3.0f,ccp(visibleSize.width/2,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,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* rept1= CCRepeatForever::create(CCSequence::create(MainMenuExponentialOut,MainMenuExponentailIn,NULL));
MainMenu->runAction(rept1);
CCRepeatForever* rept0= CCRepeatForever::create(CCSequence::create(MainMenuBGExponentialOut,MainMenuBGExponentialIn,NULL));
MainMenuBG->runAction(rept0);
return true;
}
cocos2d-x 弹入、弹出效果(以菜单为例子)