思路:
1.首先在一个layer中创建好菜单界面。
2.在实例化这个layer的scene 里面创建一个Menu(button),并定义好Menu的回调函数,来响应这个layer。
3.再重新自定义一个回调函数(我定义的是一个虚函数),这个函数用来计算layer菜单界面的位置,通过CCNOde类的schedule函数来调用这个回调执行相应操作。
注:
schedule函数是一种回调更新机制,使用此函数调用某回调函数后,在固定时间内自动调用这个回调,直至unschedule
手动结束,还有一种选择回调机制,要使用的自己去看,这里不再叙述。
其它的不多说,上代码:
文件中涉及到的资源,均留空,请自行替换。有错误的地方请指正或自行修改。
定义到两个类:
class CUIScrollMenuLayer ;
class
CGameScene ;
g_wResManager.GetSprite(6,20); 这是我读取资源的方式,把所有图先加载到内存,在使用的时候直接取资源。
返回的是CCSprite类型,以下
涉及到地方,请自行修改。
以下内容,仅供参考!
---------------ScrollMenuLayer.h--------------------------------
class CUIScrollMenuLayer : public CCLayer
{
public:
CREATE_FUNC(CUIScrollMenuLayer);
virtual bool init();
void menuStandUpCallback(CCObject* pSender);
void menuSetCallback(CCObject* pSender);
void menuBackHallCallback(CCObject* pSender);
private:
void CreateScrollMenu();
};
-----------------ScrollMenuLayer.cpp----------------------------------
bool CUIScrollMenuLayer::init()
{
bool res = false;
if(!CCLayer::init())
return res;
do
{
// 背景
CCSprite* pBackSprite = g_wResManager.GetSprite(1,1);
if(pBackSprite)
{
CCSize size(pBackSprite->getContentSize().width*pBackSprite->getScale(),
pBackSprite->getContentSize().height*pBackSprite->getScale());
pBackSprite->setAnchorPoint(CCPointZero);
pBackSprite->setPosition(CCPointZero);
this->addChild(pBackSprite);
setContentSize(size);
}
CreateScrollMenu();
res = true;
} while (0);
return res;
}
void CUIScrollMenuLayer::menuStandUpCallback(CCObject* pSender)
{
}
void CUIScrollMenuLayer::menuSetCallback(CCObject* pSender)
{
}
void CUIScrollMenuLayer::menuBackHallCallback(CCObject* pSender)
{
CCDirector::sharedDirector()->popScene();
}
void CUIScrollMenuLayer::CreateScrollMenu()
{
CCSize size = CCDirector::sharedDirector()->getWinSize();
CCMenuItemSprite* pMenuStandup = CCMenuItemSprite::create(
g_wResManager.GetSprite(7,16),
g_wResManager.GetSprite(7,17),
this,
menu_selector(CUIScrollMenuLayer::menuStandUpCallback));
pMenuStandup->setAnchorPoint(CCPointZero);
CCMenuItemSprite* pMenuSet = CCMenuItemSprite::create(
g_wResManager.GetSprite(6,20),
g_wResManager.GetSprite(6,19),
this,
menu_selector(CUIScrollMenuLayer::menuSetCallback));
pMenuSet->setAnchorPoint(CCPointZero);
CCMenuItemSprite* pMenuBack = CCMenuItemSprite::create(
g_wResManager.GetSprite(6,21),
g_wResManager.GetSprite(7,8),
this,
menu_selector(CUIScrollMenuLayer::menuBackHallCallback));
pMenuBack->setAnchorPoint(CCPointZero);
CCMenu* pFriendProMenu = CCMenu::create(pMenuStandup,pMenuSet,pMenuBack, NULL);
pFriendProMenu->setAnchorPoint(CCPointZero);
pFriendProMenu->setPosition(ccp(7,50));
pFriendProMenu->alignItemsVertically();
this->addChild(pFriendProMenu, 1);
}
-----------------CGameScene .h------------------------------
class CGameScene : public cocos2d::CCLayer{public:
CGameScene();
virtual bool init();
CREATE_FUNC(CGameScene);
static cocos2d::CCScene* scene();
void menuScrollButtonCallback(CCObject* pSender); // button 和回调函数
private:
CUIScrollMenuLayer* m_pScrollMenuLayer;
CCMenu* m_pScrollMenuButton;
bool m_bScrollMenuIsActivate;
CCPoint m_nScrollMenuPoint;
CCPoint m_nScrollButtonPoint;
void CreateScrollMenu();
virtual void ScrollUpdate(float delta); // schedule 调用的回调函数
}
-----------------CGameScene .cpp------------------------------
CGameScene::CGameScene()
{
m_pScrollMenuLayer = NULL;
m_bScrollMenuIsActivate = false;
m_nScrollMenuPoint.setPoint(0,0);
m_nScrollButtonPoint.setPoint(0,0);
}
CCScene* CGameScene::scene()
{
CCScene * scene = NULL;
do {
scene = CCScene::create();
CC_BREAK_IF(! scene);
CGameScene *layer = CGameScene::create();
CC_BREAK_IF(! layer);
scene->addChild(layer);
} while (0);
return scene;
}
bool CGameScene::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init());
CreateScrollMenu();
bRet = true;
}while (0);
return bRet;
}
void CGameScene::menuScrollButtonCallback(CCObject* pSender)
{
this->schedule(schedule_selector(CGameScene::ScrollUpdate));
}
void CGameScene::CreateScrollMenu()
{
CCSize size = CCDirector::sharedDirector()->getWinSize();
m_pScrollMenuLayer = CUIGameScrollMenuLayer::create();
if(m_pScrollMenuLayer)
{
m_nScrollMenuPoint.setPoint(0,size.height-m_pScrollMenuLayer->getContentSize().height);
m_pScrollMenuLayer->setAnchorPoint(CCPointZero);
m_pScrollMenuLayer->setPosition(m_nScrollMenuPoint);
this->addChild(m_pScrollMenuLayer,2);
CCMenuItemSprite *pBackItem = CCMenuItemSprite::create(
g_wResManager.GetSprite(7,37),
g_wResManager.GetSprite(7,38),
this,
menu_selector(CGameScene::menuScrollButtonCallback));
if(pBackItem)
{
m_pScrollMenuButton = CCMenu::create(pBackItem, NULL);
if(m_pScrollMenuButton)
{
CCSize menuSize(m_pScrollMenuButton->getContentSize().width*m_pScrollMenuButton->getScale(),
m_pScrollMenuButton->getContentSize().height*m_pScrollMenuButton->getScale());
m_pScrollMenuButton->setContentSize(menuSize);
m_pScrollMenuButton->setAnchorPoint(CCPointZero);
m_nScrollButtonPoint.setPoint(m_pScrollMenuLayer->getContentSize().width+13,
m_pScrollMenuLayer->getContentSize().height+170);
m_pScrollMenuButton->setPosition(m_nScrollButtonPoint);
this->addChild(m_pScrollMenuButton, 2);
}
}
}
}
void CGameScene::ScrollUpdate(float delta)
{
if(m_bScrollMenuIsActivate)
{
int32 nX = m_pScrollMenuLayer->getPositionX();
int32 nButtonX = m_pScrollMenuButton->getPositionX();
if ((m_nScrollMenuPoint.x-nX)+10 >= m_pScrollMenuLayer->getContentSize().width)
{
int32 nDistance = m_pScrollMenuLayer->getContentSize().width - (m_nScrollMenuPoint.x-nX);
m_pScrollMenuLayer->setPositionX(nX - nDistance);
m_pScrollMenuButton->setPositionX(nButtonX - nDistance);
m_bScrollMenuIsActivate = false;
this->unschedule(schedule_selector(CGameScene::ScrollUpdate));
}
else
{
m_pScrollMenuLayer->setPositionX(nX - 10);
m_pScrollMenuButton->setPositionX(nButtonX - 10);
}
}
else
{
int32 nX = m_pScrollMenuLayer->getPosition().x;
int32 nButtonX = m_pScrollMenuButton->getPositionX();
if(nX+10 >= m_nScrollMenuPoint.x)
{
int32 nDistance = m_nScrollMenuPoint.x - nX;
m_pScrollMenuLayer->setPositionX(nX + nDistance);
m_pScrollMenuButton->setPositionX(nButtonX + nDistance);
m_bScrollMenuIsActivate = true;
this->unschedule(schedule_selector(CGameScene::ScrollUpdate));
}
else
{
m_pScrollMenuLayer->setPositionX(nX + 10);
m_pScrollMenuButton->setPositionX(nButtonX + 10);
}
}
}
OK,完成!下面上两张图看看效果:
这是控制按钮:
![]()
显示的是这样:
![]()
收缩的按每次10个点向左收缩,收缩后是这样:
![]()