cocos2d-x 屏蔽场景的Touch事件

cocos2d-x有个问题,即使暂停CCScene运行,触摸仍然有效,有些菜单和按钮仍然会被触发。

所以有的时候我们要手动屏蔽触摸,尤其是在弹出计费画面的,或者使用一些本平台自带控件的时候。

做法有几种:

第一种方案是:每一个继承自CCLayer的类都可以关闭触摸,使用这个函数

setIsTouchEnabled(false);

在暂停sence时,我们只需要关闭那些主要的CCLayer即可,也就是当前CCScene的主CCLayer和相关的CCMenu等。

但这种方法,有时候会造成莫名其妙的crash。调试发现,如果在同一个frame的同一个函数中,先关闭再恢复触摸,就可能造成crash。crash的原因是引擎在派发触摸事件时,发现响应对象的列表为空,直接触发断言。

第二种方案是:写一个CCLayer,把所有优先级调至最高,并直接覆盖到当前CCSence主CCLayer上。

经过试验,这种方式非常简单有效,重用性也很高。

class NoTouchLayer : public cocos2d::CCLayer{
public:
 // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
 virtual bool init();

// implement the "static node()" method manually
LAYER_NODE_FUNC(NoTouchLayer);

virtualvoid registerWithTouchDispatcher();

virtualbool ccTouchBegan (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtualvoid ccTouchMoved (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtualvoid ccTouchEnded (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);

};

实现方法

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

setIsTouchEnabled(true);

return true;
}

void NoTouchLayer::registerWithTouchDispatcher(){
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, numeric_limits <int> ::min() , true);

//使用int最小值做最高优先级,并且吞掉事件true

CCLayer::registerWithTouchDispatcher();
}

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

void NoTouchLayer::ccTouchMoved (CCTouch *pTouch, CCEvent *pEvent){  }

void NoTouchLayer::ccTouchEnded (CCTouch *pTouch, CCEvent *pEvent){  }
这个类的使用也很简单,直接addChild,removeChild即可。注意清理,注意addChild的时候要给一个足够大的z轴深度值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值