cocos2d-x学习笔记番外篇05:如何快速屏蔽触摸

简介:

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

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

做法有几种:

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

 
  1. setIsTouchEnabled(false); 

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

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

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

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

 
  1. class NoTouchLayer : public cocos2d::CCLayer{ 
  2. public
  3. // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone 
  4. virtual bool init();   
  5.      
  6.     // implement the "static node()" method manually 
  7.     LAYER_NODE_FUNC(NoTouchLayer); 
  8.      
  9.     virtualvoid registerWithTouchDispatcher(); 
  10.      
  11.     virtualbool ccTouchBegan (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 
  12.     virtualvoid ccTouchMoved (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 
  13.     virtualvoid ccTouchEnded (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 
  14.      
  15. }; 


 
  1. bool NoTouchLayer::init(){  
  2.     if (!CCLayer::init() )  
  3.     {  
  4.     return false;  
  5.     }  
  6.       
  7.     setIsTouchEnabled(true);  
  8.       
  9.     return true;  
  10. }  
  11.    
  12. void NoTouchLayer::registerWithTouchDispatcher(){  
  13.     CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(thisnumeric_limits <int> ::min() true);//使用int最小值做最高优先级,并且吞掉事件true  
  14.     CCLayer::registerWithTouchDispatcher();  
  15. }  
  16.    
  17. bool NoTouchLayer::ccTouchBegan (CCTouch *pTouch, CCEvent *pEvent){     
  18.     return true;  
  19. }  
  20.    
  21. void NoTouchLayer::ccTouchMoved (CCTouch *pTouch, CCEvent *pEvent){  
  22.   
  23.   
  24. }  
  25.   
  26.   
  27. void NoTouchLayer::ccTouchEnded (CCTouch *pTouch, CCEvent *pEvent){  
  28.   
  29.   
  30. }  

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






 本文转自 老G 51CTO博客,原文链接:http://blog.51cto.com/goldlion/845269,如需转载请自行联系原作者


相关文章
|
存储 iOS开发
SwiftUI极简教程17:Gestures手势的使用
SwiftUI极简教程17:Gestures手势的使用
1026 0
SwiftUI极简教程17:Gestures手势的使用
|
编解码 人工智能 计算机视觉
一段蛋疼的代码:超不清视频播放器
一幅图像全部转成字符序列后,就可以直接在控制台输出了。对于一个视频来说,只需要将每一帧都转换后输出,并按照一定的时间间隔清屏、输出下一帧,即可达到我们的需要的效果。
|
监控 API iOS开发
iOS触动精灵模拟触控类外挂原理分析
一、外挂功能: 类似于模拟按键,该类型外挂主要用于通过图像识别,利用luac脚本对图像进行识别。而后再通过私有api实现触屏操作的功能。     二、外挂特征 外挂安装后,会有下面三个主要程序,touchsprite,tsevent,tsdeamon. 其中,touchsprite 为gui的界面程序,其主要功能为提供交互界面由用户选择加载的脚本。(脚本保存在/Us
4225 0
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity 中如何让 Toggle组件 实现多选一的效果
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。
【Unity3D 灵巧小知识点】☀️ | Unity 中如何让 Toggle组件 实现多选一的效果
|
前端开发 图形学
Unity 之大屏幕多点触控插件 TouchScript 9.0 入门指南(上)
在端游上大家应该多数都使用过的EasyTouch插件,在EasyTouch 5.0.17 最新版本扩展方法中我有过简单的介绍,今天说一下另一款触摸插件,它非常适合做展示类大屏幕的多点触控TouchScript,在Unity上的AssetStore也是五...
3440 0