zoukankan      html  css  js  c++  java
  • cocos2dx:如何快速屏蔽触摸

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

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

    做法有几种:

    第一种方案是:每一个继承自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(this, numeric_limits <int> ::min() , true);//使用int最小值做最高优先级,并且吞掉事件true  
    14.     CCLayer::registerWithTouchDispatcher();  
    15. }  
    16.    
    17. bool NoTouchLayer::ccTouchBegan (CCTouch *pTouch, CCEvent *pEvent){     
    18.     returntrue;  
    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的小屋” 博客,请务必保留此出处http://4137613.blog.51cto.com/4127613/845269

  • 相关阅读:
    BZOJ 1143 [CTSC2008]祭祀river
    BZOJ 3997 [TJOI2015]组合数学
    BZOJ 3996 [TJOI2015]线性代数
    BZOJ 4553 [Tjoi2016&Heoi2016]序列
    微信开发之密文模式 mcrypt_module_open 走不过
    JS JSON & ARRAY 遍历
    linux ftp服务器配置(Ubuntu)
    thinkphp 吐槽篇
    游戏--疯狂猜字随机混乱正确答案逻辑
    PHP 批量去除BOM头;此文转载;
  • 原文地址:https://www.cnblogs.com/secbook/p/2655389.html
Copyright © 2011-2022 走看看