您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x屏蔽一个场景上面的触摸信息

2013-08-22 16:06 141 查看
Colin-Liao 个人原创,欢迎转载,转载请注明地址。Colin-Liao的专栏地址http://blog.csdn.net/focusdeveloper

在很多情况下,有的童鞋想要一个场景不能够触摸,听起来很简单,可以把场景上面的node(layer,scene,menu等,CCNode本生不接收触摸)全部设置为不可以触摸。那这样就太麻烦了,我们可以创建一个不可以触摸的层,让他将这个场景覆盖掉。下面我们来说说这个思路:
不可触摸场景头文件:

#include <iostream>
#include "cocos2d.h"
USING_NS_CC;

class NoTouchLayer:public CCLayer {
public:
CREATE_FUNC(NoTouchLayer);
virtual bool init();

virtual bool ccTouchBegan (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void registerWithTouchDispatcher();
};
不可触摸场景源文件:

#include "NoTouchLayer.h"

bool NoTouchLayer::init()
{
if (!CCLayer::init()) {
return false;
}

this->setTouchEnabled(true);

return true;
}

bool NoTouchLayer::ccTouchBegan (CCTouch *pTouch, CCEvent *pEvent){
return true;
}

void NoTouchLayer::registerWithTouchDispatcher()
{
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, -128, true);

}


可以看到这里创建了一个能够接收触摸信息的layer,并且将他的触摸优先级设置为-128,这是为什么呢,因为在cocos2d-x中CCMenu的优先级是最高的也就是-128,我们的这个layer在最上面一层所以即使下面有菜单对象,也不能响应。当两个layer的触摸优先级一样的时候,就得看他们的z轴次序,z轴次序越高越先接收触摸信息,越低则越晚接收触摸信息。当两个优先级不一样时,优先级高的先接收,优先级低的后接收(数值表现为越小越高)。

根据这个原理我们想要这个NoTouchLayer下面的菜单能够接收消息呢,那我们把NoTouchLayer的优先级设置为-127(别忘了他是用来屏蔽的),菜单能接收信息,其他层同样不能接收。这样菜单都能接收消息,如果想要菜单下面的菜单也能接收消息,可以看看我写的上一片文章http://blog.csdn.net/focusdeveloper/article/details/10182183
玩过闯关游戏的童鞋都知道,当一关游戏结束的时候会弹出一个layer上面可以选者是否继续,下一关很多菜单,以前能够操作的界面虽然能够看到但是不能操作了,那就是在上面加了一个不可以触摸的层。只是这个层上面加了几个菜单。我们把不可以触摸层的触摸接收顺序设置为-128,这时菜单的触摸接收优先级也是-128,谁会先接收触摸呢?
当然是菜单了,上面已经讲过如果他们优先级相同,那么他们的z轴越高越先接收,菜单加在不可触摸层之上,所以z轴次序高,接收触摸信息,信息被吞并,这样就达到了上面闯关游戏的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ Cocos2d-x 界面 随笔