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

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轴次序高,接收触摸信息,信息被吞并,这样就达到了上面闯关游戏的效果。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值