cocos2dx 3.X 触摸吞噬功能

对话框是什么,大家应该比较清楚。模态对话框就是当前对话框出现的时候不能对当前对话框以外的元素进行操作的一种对话框。

cocos里面是不自带对话框的,所以需要自己制作。一般都是新建一个层,覆盖在当前场景之上。

但是这时候常常会有一个问题,就是覆盖之后,下层的点击操作依然会被相应。

这个问题我以前的做法比较naive(当然也是一种方法),就是每次把下层场景的控件都传到上层中然后 setEnable(false) 掉。但是。。。太麻烦了。

今天才知道可以在上层对话框层实现触摸吞噬,就是将所有触摸操作拦截在当前层不让其在下层有所响应。

3.X 中,因为事件处理机制的变化,需要实现一个监听器(listener)对当前层触摸操作监听并阻止其向下层传播的过程。

代码如下(一般是写在对话框层的 init 函数中)。如果在对话框层中加入,listener 需要固定在
this 上;如果在对话框下一层加入 listener 则要把对话框层的实例(也就不是 ths了)固定 listener:

	auto listener = EventListenerTouchOneByOne::create();
	listener->setSwallowTouches(true);
	listener->onTouchBegan = [](Touch* touch, Event* event)
	{
		return true;
	};
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

讲解一下。也可以看这里

  1. setSwallowTouches 是限制本层是不是要拦截所有触摸事件,true 就是要拦截;
  2. onTouchBegan 一般是用来处理触摸事件,这里将其写空,只是让它 return 一个值。

    (1)如果返回true,则本层的Touch事件可以被触发,并阻挡向后层传递自己可以用,不让下层用);

    (2)如果返回false,本层的后续Touch事件不能被触发,并向后传递。

  3. addEventListenerWithSceneGraphPriority 是添加监听器的函数,当然也可以写作 addEventListenerWithFixedPriority。区别就是:

    (1)addEventListenerWithSceneGraphPriority 的事件监听器优先级是0,而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的;

    (2)另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。

  4. _eventDispatcher 是cocos内置的事件分发器,无需声明直接使用就好。
时间: 2024-08-08 11:47:24

cocos2dx 3.X 触摸吞噬功能的相关文章

Cocos2dx 3.2 节点之间相互通信与设置触摸吞噬的方法

实际开发中,我们经常会遇到这样的情况.我们有一个层layer1,这个层包含一个menu层,menu1层里又包含了一个节点按钮button1.现在需要实现一个效果:点击button1弹出一个对话框,这个对话框里也包含一个menu2和一个按钮button2,点击button2能够关闭这个对话框.这个情况很普遍,在游戏ui中我们有大量的二级弹窗都需要用到这种效果(在这里我们不考虑直接在layer2里removefromparent,这样就不能达成学习目的了).我们可以用三种方法实现这个效果,分别是:

cocos2d-x 扩充引擎基类功能 引起的头文件重复包含问题的分析

c++ 头文件包含 原因的分析:   c++  头文件的循环引用是指: .h 里面的里面的头文件的相互包含的,引起的重复引用的问题.cpp 里面包含头文件是不存在重复引用的问题(因为CPP没有#ifndef #define #endif 这个). 关键的原因是:#ifndef #define #endif 引起的.  翻译一下就是  如果没有定义 包含, 如果定义了 就不包含了. 由于 宏是全局唯一的,所以只会包含一次.这就是引起重复包含的原因.这些问题的解决办法:http://my.oschi

cocos2dX 事件之触摸事件和触摸事件集合

今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 现在的手机游戏交互基本上都是通过触摸交互的, 所以大家明白这节的重要性了吧, 本节篇幅比较大, 所以我就不扯闲话了 先来看看常用函数: 触摸事件: addTargeteDelegate( 谁使用, 优先级, 是否拦截触摸消息); //注册单点触摸 virtual bool ccTouchBegan(CCTouch * touch,CCEvent * event); //触摸开始 virtual void ccTouchMoved(

关于在Cocos2dx中注册触摸事件——Lua

关于在Cocos2dx中注册触摸事件,之前一直对此一知半解,这两天在看引擎的源码,趁此机会写下来... 以下纯属个人理解,如有不对欢迎指正... 在引擎的CCLayer类中声明了有四个方法: 1 virtual bool onTouchBegan(Touch *touch, Event *unused_event); 2 virtual void onTouchMoved(Touch *touch, Event *unused_event); 3 virtual void onTouchEnde

开启cocos2dx 3.0的Console功能

下面内容用于自己知识的备忘,想看具体内容,请參照例如以下地址. 原英文文地址: http://discuss.cocos2d-x.org/t/cocos3-0-tutorial-console-tutorial/14283?username_filters=Lef 注意点: 1.在windows平台下,连接本地时,IP应该为:127.0.0.11234,即 telnet 127.0.0.1 1234: 在Mac平台下,才是telnet  0.0.0.0 1234.这一点,原作者没有写清楚. 2.

cocos2dx中的触摸事件及触摸优先级

1.只有CCLayer及其派生类才有触摸功能. 2.开启触摸 setTouchEnable(true); 3.设置触摸模式,单点,多点(仅IOS支持) setTouchMode(kCCTouchesOneByOne);//单点触摸 4.需要重载(override)的四个触摸事件函数 bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);//点触事件,返回false,表示触摸事件不往下传递了 void ccTouchMoved(CCTouch *p

cocos2dx for lua 截屏功能

cocos2dx的utils类中包含截图功能,使用方法如下: cc.utils:captureScreen(function(successed,outputFile)--第一个参数是截图成功或者失败的回调函数 if successed then--如果成功,返回true,否则返回nil local sp = cc.Sprite:create(outputFile) end end,"captureTexture.png")第二个参数是保存文件名 看cocos源代码,截图文件会将保存在

cocos2d-x像素级触摸处理

最近研究了一下像素级的触摸处理,有时候我们用一个不规则的图形作为一个按钮,这个不规则的图形是一张矩形的png图片,很可能图片的实际有效的显示内容只占整个png图片的很小一部分,剩下的大部分都是png图片的透明区域,我们想把这部分透明区域过滤掉,实现一个触摸到真实的内容才会有按钮响应的效果. 刚开始试图通过CCSprite直接获取到纹理的像素信息,但是cocos2d-x并没有给我们提供直接通过CCSprite获取像素信息的接口,研究了几个网上的Demo,发现通过使用RenderTexture重绘可

关于Cocos2dx 3.6 触摸事件 中 setSwallowTouches 的疑惑

假设Layer1的ZOrder大于Layer2的ZOder,则 Layer1和Layer2的触摸事件回调函数调用情况如下 Layer1 setSwallow:          false     false      true     true Layer1 touchBegan ret:    false     true     false      true -------------------------------------------------------------- La