cocos2d-x:如何快速屏蔽触摸

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

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

做法有几种:

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

 
  1. setIsTouchEnabled(false);

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

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

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

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

 
  1. classNoTouchLayer:publiccocos2d::CCLayer{
  2. public:
  3. //Here'sadifference.Method'init'incocos2d-xreturnsbool,insteadofreturning'id'incocos2d-iphone
  4. virtual boolinit();
  5. //implementthe"staticnode()"methodmanually
  6. LAYER_NODE_FUNC(NoTouchLayer);
  7. virtualvoidregisterWithTouchDispatcher();
  8. virtualboolccTouchBegan(cocos2d::CCTouch*pTouch,cocos2d::CCEvent*pEvent);
  9. virtualvoidccTouchMoved(cocos2d::CCTouch*pTouch,cocos2d::CCEvent*pEvent);
  10. virtualvoidccTouchEnded(cocos2d::CCTouch*pTouch,cocos2d::CCEvent*pEvent);
  11. };


 
  1. boolNoTouchLayer::init(){
  2. if(!CCLayer::init())
  3. {
  4. returnfalse;
  5. }
  6. setIsTouchEnabled(true);
  7. returntrue;
  8. }
  9. voidNoTouchLayer::registerWithTouchDispatcher(){
  10. CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,numeric_limits<int>::min(),true);//使用int最小值做最高优先级,并且吞掉事件true
  11. CCLayer::registerWithTouchDispatcher();
  12. }
  13. boolNoTouchLayer::ccTouchBegan(CCTouch*pTouch,CCEvent*pEvent){
  14. returntrue;
  15. }
  16. voidNoTouchLayer::ccTouchMoved(CCTouch*pTouch,CCEvent*pEvent){
  17. }
  18. voidNoTouchLayer::ccTouchEnded(CCTouch*pTouch,CCEvent*pEvent){
  19. }

这个类的使用也很简单,直接addChild,removeChild即可。注意清理,注意addChild的时候要给一个足够大的z轴深度值。

本文出自 “老G的小屋” 博客,请务必保留此出处http://4137613.blog.51cto.com/4127613/845269

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值