cocos2d-x 禁用触摸(如何快速屏蔽触摸)Cocos2d-x从3.0版本以来,触摸机制有所改变,虽然实现的道理没有变,不过我今天还是写出这篇文章,就当是简单的复习一下3.0的事件分发机制吧,同时把自己在研究的过程中遇到的问题分享出来。这里采用的方法是最简单,最直接的方法,整体的思路是这样的。设置触摸监听器吞噬触摸,然后在回调函数onTouchBegan中返回true,同时确保这个层的触摸优先级大于你要屏蔽的层的优先级。也许这种方法不能满足你得需求,那就请自行研究或者看下其他博客,或者给我留言共同探讨吧。在实现中我们肯定会遇到的就是屏蔽菜单,让菜单变的不可点击,那我就写一个简单的场景,里边加入菜单,然后加入一个层来屏蔽掉下层的触摸。

  1. bool CreateGame::init()
  2. {
  3. if(!Layer::init())
  4. return false;
  5. //UI
  6. auto size = Director::getInstance()->getWinSize();
  7. Vector<MenuItem *> itemVector;
  8. for(int i=1;i<4;i++)
  9. {
  10. auto item = MenuItemImage::create("no_people.png","people.png");
  11. item->setTag(i);
  12. itemVector.pushBack(item);
  13. }
  14. auto menu1 = Menu::createWithArray(itemVector);
  15. menu1->alignItemsHorizontallyWithPadding(10);
  16. menu1->setPositionY(size.height*0.75);
  17. this->addChild(menu1);
  18. auto swallowTouch = SwallowTouch::create();
  19. this->addChild(swallowTouch);
  20. return true;
  21. }

这里在最后添加了一个层,这个层就是用来屏蔽触摸的,大家要注意添加这个层的位置,这个层是最后添加进来的,也就是说它要显示的话是显示在最前边的,这个和接下来的屏蔽触摸有联系。以下是这个层的init函数。

  1. bool SwallowTouch::init()
  2. {
  3. if(!LayerColor::initWithColor(Color4B(100,100,100,100)))
  4. return false;
  5. auto label = Label::createWithTTF("touch!","fonts/Marker Felt.ttf",32);
  6. label->setPosition(Point(350,800));
  7. this->addChild(label);
  8. auto callback = [](Touch * ,Event *)
  9. {
  10. return true;
  11. };
  12. auto listener = EventListenerTouchOneByOne::create();
  13. listener->onTouchBegan = callback;
  14. listener->setSwallowTouches(true);
  15. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
  16. //_eventDispatcher->addEventListenerWithFixedPriority(listener,-1);
  17. return true;
  18. }

代码很简单,只是添加了一个事件监听器,设置这个事件监听器吞噬掉触摸,在onTouchBegan回调函数中返回了true。最主要的东西是将事件监听器添加到分发器中的代码,这里可以选择俩种方式来做,如果选择的是第一种,第二个参数是要求我们来将这个事件监听器和一个node绑定,什么是和node绑定,就是这个node对触摸的处理是和这个listener一样的,比如触摸的优先级,接受到触摸以后的处理代码,或者说这个listener来处理node接受到得触摸消息。这个时候Listener的优先级就是绑定的node的显示优先级,就是谁显示在场景的前面,谁先接受到触摸消息,所以在主场景的代码中,我们要把创建这个layer的代码放到后边,这样的话才会优先级高,才会首先收到触摸消息。

然后来看第二种方法,addEventListenerWithFixedPriority函数的调用没有去绑定一个node,这个时候它的优先级就是通过第二个参数去传递的,我们通过改变这个优先级可以看下最后的效果,如果我设置为-1是可以成功屏蔽下层的菜单点击的,如果设置为0,那么程序运行会报错,如果设置为1,是屏蔽不掉下层的触摸的。这是因为0这个优先级是被占用了得,我们设置优先级不能设置为0,而要想屏蔽菜单的点击功能,必须设置优先级小于0,以下是这三个值的效果。

因为没有绑定那个LayerColor,所以是没有那个灰度的效果的。如果我只是要屏蔽下层按钮的点击,大可以将代码写到一个类中去完成,其实你也看到了,listener的作用就是事件监听,你可以给它绑定一个node,这个时候它的优先级就是node的显示优先级了,如果是手动设置优先级,不要设置为0的优先级就好了,这个时候当触摸分发的时候,会根据优先级关系来决定listener是否能接受的到触摸,写到一个类中的代码如下:

  1. bool CreateGame::init()
  2. {
  3. if(!Layer::init())
  4. return false;
  5. //UI
  6. auto size = Director::getInstance()->getWinSize();
  7. Vector<MenuItem *> itemVector;
  8. for(int i=1;i<4;i++)
  9. {
  10. auto item = MenuItemImage::create("no_people.png","people.png");
  11. item->setTag(i);
  12. itemVector.pushBack(item);
  13. }
  14. auto menu1 = Menu::createWithArray(itemVector);
  15. menu1->alignItemsHorizontallyWithPadding(10);
  16. //设置菜单为不可点击
  17. //menu1->setEnabled(false);
  18. menu1->setPositionY(size.height*0.75);
  19. auto item = (MenuItem *)menu1->getChildByTag(1);
  20. item->selected();
  21. this->addChild(menu1);
  22. auto layer = LayerColor::create(Color4B(100,100,100,100));
  23. auto callback = [](Touch * ,Event *)
  24. {
  25. return true;
  26. };
  27. auto listener = EventListenerTouchOneByOne::create();
  28. listener->onTouchBegan = callback;
  29. listener->setSwallowTouches(true);
  30. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,layer);
  31. //_eventDispatcher->addEventListenerWithFixedPriority(listener,-1);
  32. this->addChild(layer);
  33. return true;
  34. }

最后有一点需要注意的是,如果是固定优先值的监听器添加到一个节点(addEventListenerWithFixedPriority),那当这个节点被移除时必须同时手动移除这个监听器,但是添加显示优先监听器到节点(addEventListenerWithSceneGraphPriority)就不用这么麻烦,监听器和节点是绑定好的,一旦节点的析构函数被调用,监听器也会同时被移除。如果我们屏蔽了触摸,在某个逻辑处需要将这种触摸屏蔽去掉,比如就是做一个弹出对话框,用户点击了关闭按钮就应该将对下层的屏蔽去掉了,那么很显然,如果使用的是固定优先级,只是remove掉这个对话框最后是不能去除屏蔽的,因为事件监听器你并没有去掉啊,当有触摸事件过来的时候照样会分发给它事件的,所以解决办法不用说了吧。

cocos2d-x 禁用触摸相关推荐

  1. cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate

    cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate    以下内容转载自:http://blog.sin ...

  2. opensuse 禁用触摸板

    打字时经常被触摸板干扰 禁用触摸板synclient TouchpadOff=1 启用触摸板synclient TouchpadOff=0 如果触摸板无效  反正我就无效 vi /etc/X11/xo ...

  3. ubuntu16.04禁用触摸板

    root权限下: sudo rmmod psmouse    这个是禁用触摸板 sudo modprobe psmouse 这个是启用触摸板

  4. win10禁用触摸键盘_如何在Windows 8和10中永久禁用触摸键盘

    win10禁用触摸键盘 You may have noticed that, mysteriously, Windows' Touch Keyboard icon keeps appearing in ...

  5. linux 笔记本禁用触摸板

    命令行下输入如下命令即可: $ rmmod psmouse ubuntu下要加sudo前缀. 每次使用命令行禁用比较麻烦,直接开机禁用触摸板比较省事.下面介绍开机禁用触摸板. 1.将驱动模块加入bla ...

  6. Linux下笔记本禁用触摸板

    转自http://hi.baidu.com/hixiaoqi/item/fb01b340a31797eba5c06683 Ubuntu Linux下笔记本禁用触摸板的方法在笔记本电脑上打字,总是不小心 ...

  7. thinkpad如何禁用触摸板(触控板)或指点杆

    T61T400T410T420X220禁用触摸板大家平时使用大部分时间都是用鼠标,即使没有鼠标,也有小红帽,而且打字的时候很容易会受到触摸板的干扰,所以我就想把触摸板禁用.但是在论坛上搜索了一下,发现 ...

  8. Google Chrome禁用触摸板滑动前进后退

    今天给大家分享一下如何然让Google Chrome禁用触摸板滑动前进后退.本来这个是一个不错的功能,但是甲方在使用触摸屏的电脑浏览页面的时候准备用滑动去切换轮播,但是出现了退出了当前页面回到首页的现 ...

  9. 联想Y400怎么样在插入鼠标时自动禁用触摸板

    刚买了小Y,但是在联想的最新驱动上没有看到"插入鼠标时禁用触摸板"的选项 上网搜了下解决方案,可以通过修改注册表的方法解决 打开"注册表编辑器".依次展开 HK ...

最新文章

  1. 前端、云与人工智能的碰撞 | GDG广州
  2. Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
  3. java and asp.net
  4. spring + mina 作为客户端解析H2协议的使用总结
  5. 文件共享服务器连接数问题,共享服务器上连接数量的设置
  6. 串行通信的波特率高速和低速区别
  7. 电脑内存占用莫名很高_CPU占用高,电脑莫名卡顿?万能的重启拯救不了就用这3招,妥了!...
  8. 广州计算机自考独立办学,广东省06年自学考试独立办班广州考点办学计划的通知...
  9. activemq中怎么知道推送消息是否成功_ActiveMQ安装试用示列
  10. RK3399Pro Android Rock-X 人工智能开发系列(1)
  11. 沐雪微信平台---企业微信营销专家
  12. 微信公众号-关注取消关注后图文和普通消息自动回复
  13. 【Unity3D日常开发】应粉丝邀约,写一篇单例模式在Unity的实际应用,记得一键三连哦
  14. 软件项目管理 第六章 成本计划
  15. 机器学习课堂笔记-作业二基本实现思路
  16. 弗洛伊德的乌龟和兔子(循环检测
  17. Windows安装--cerebro
  18. 读一本好书,享一段时光
  19. 预失真算法matlab实现,2013-全国研究生数学建模B题-seleh模型预失真MATLAB仿真代码...
  20. 包含重复元素的全排列

热门文章

  1. [pillow]透明图片和不透明图片叠加合成--添加透明度
  2. Spring-IOC 解耦详解
  3. 2018深信服java笔试题_深信服2018春招笔试题解
  4. 去公司面试,记录下的hadoop最新面试题
  5. sge安装 centos 安装 gridengine
  6. 行程卡是怎么记录行程的?
  7. 如何利用word制作三线表
  8. python中del什么意思_python del函数是什么以及如何使用?
  9. window检测到计算机,Windows检测到一个硬盘问题怎么办
  10. 参考文献中期刊/会议如何缩写