cocos2d-x自定义菜单之窗口收缩菜单

思路:
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,完成!下面上两张图看看效果:

这是控制按钮:

cocos2d-x自定义菜单之窗口收缩菜单 - 该用户已被删除 - 序

显示的是这样:

cocos2d-x自定义菜单之窗口收缩菜单 - 该用户已被删除 - 序
 

收缩的按每次10个点向左收缩,收缩后是这样:

cocos2d-x自定义菜单之窗口收缩菜单 - 该用户已被删除 - 序
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值