Cocos2d-x 实现模态对话框


模态对话框(其本身是一个Layer)是指只有该对话框能够响应触摸操作,而其它层不能响应此触摸操作。模态对话框一般在场景中的最上层。


模态对话框会有两种触摸代理,一种是对话框该层本身,还有一种是CCMenu。cocos2d-x使用优先级来管理触摸代理,优先级数越小,响应优先级越高。对于同一个触摸,如果有优先级数字更小的代理响应了,则优先级数字更大代理不再响应此触摸。


要想拦截模态对话框下的层(包括菜单)对触摸消息不响应, 我们必须将的模态对话框优先级设置小于-128 ,并且如果此触摸只要被响应了就会吞噬掉(CCTouchDispatcher::addTargetedDelegate中第三个参数设置为true),则在此对话框中的触摸不会被下一层响应到。这样就可以成功的拦截按钮的消息传到模态对话框的下层。但是这样也意味着当前模态对话框的菜单消息(-128)也被拦截了,所以我们需要手动将消息传给模态对话框上的按钮进行处理---主动调用模态对话框中CCMenu的触摸方法


设置模态对话框响应触摸(TargetedTouch)优先级数比-128小就行了。重写定向触摸响应方法,包括:

ccTouchBegan,  ccTouchEnded,  ccTouchMoved 和  ccTouchCancelled,并在这些方法中主动调用CCMenu的相应响应方法。


代码实现:

1、注意模态对话框也是一个层,所以也是继承自CCLayer。

当然,由于出现模态对话框的时候,都会有一个半透明灰色的背景,如果你是用图片来作为背景的话,就继承自CCLayer就ok了。但是也可以继承自CCColorLayer 这样有个好处,可以直接设置不透明度和背景颜色 ,比如半透明的灰色:

    setColor(ccc3(255,0,0));
    setOpacity(128);

2、.h文件

void onEnter();
	void onExit();
    
	virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
	virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
	virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
    virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
    
	cocos2d::CCMenu *m_pMenu; // 模态对话框菜单
	bool m_bTouchedMenu;// 记录菜单点击

3、.m文件

void PauseGameDialogLayer::onEnter()
{
	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(
                                                                            this,//在那个类中实现触屏回调函数
                                                     kCCMenuHandlerPriority - 1, // -128-1 = -129优先级  
                                                                            true);//触摸时间是否被该目标截获  
}

void PauseGameDialogLayer::onExit()
{
	BaseLayer::onExit();
	CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}

bool PauseGameDialogLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
	m_bTouchedMenu = m_pMenu->ccTouchBegan(pTouch, pEvent);
	return true;
}

void PauseGameDialogLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
	if (m_bTouchedMenu) {
		m_pMenu->ccTouchMoved(pTouch, pEvent);
	}
}

void PauseGameDialogLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
	if (m_bTouchedMenu) {
		m_pMenu->ccTouchEnded(pTouch, pEvent);
		m_bTouchedMenu = false;
	}
}

void PauseGameDialogLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
	if (m_bTouchedMenu) {
		m_pMenu->ccTouchEnded(pTouch, pEvent);
		m_bTouchedMenu = false;
	}
}

4、接下来就可以在init方法中创建CCMenu--模态对话框中的菜单啦!大笑







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值