cocos2d-x触摸事件优先级的探究与实践
如何让自定义Layer触发触摸事件?
bool LayerXXX::init()
{
this->setTouchEnabled(true); CCTouchDispatcher* td = CCDirector::sharedDirector()->getTouchDispatcher();
td->addTargetedDelegate(this, , true); //kCCMenuHandlerPriority - 10 // ...
}
CCTouchDispatcher是管理cocos2d-x中所有Touch事件派发的类,
CCTouchDispatcher中包含了两个CCTouchHandler的列表,
分别存储StandardTouchHandler和 TargetedTouchHandler。
属性:
this->mTouchPriporty
Layer 优先级越小越高
越低越先响应事件
实验一:当两个Layer优先级同等的时候会怎么样呢?
实验发现,同等优先级下,后添加的Layer先响应事件。
//-------------------------------
//Touch1 100
//Touch2 100
Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(,,,), , );
this->addChild( touch1layer );
touch1layer->setPosition(, ); Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(,,,), , );
this->addChild( touch2layer );
touch2layer->setPosition(, ); //结果:
//Touch2
//Touch1
//-------------------------------
//Touch1 100
//Touch2 100
Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(,,,), , );
this->addChild( touch2layer );
touch2layer->setPosition(, ); Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(,,,), , );
this->addChild( touch1layer );
touch1layer->setPosition(, ); 结果:
Touch1
Touch2
-------------------------------
Touch1
Touch2
Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(,,,), , );
this->addChild( touch2layer );
touch2layer->setPosition(, ); Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(,,,), , );
this->addChild( touch1layer );
touch1layer->setPosition(, ); //结果:
//Touch2
//Touch1
//说明优先级越小越先触发事件
//-------------------------------
如何阻塞事件的向后传递?
原理:
mSwallowsTouches = false的时候,该层的touch事件若接受处理后,touch事件穿透,进入下个注册touch事件的layer进行处理
若mSwallowsTouches = true时,当该层处理touch事件的时候,若bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
return true时候,则touch事件被该层接收走,其他优先级较低的,就不会接收到touch事件的处理申请了。
关于ccTouchBegan的返回值
true:
本层的后续Touch事件可以被触发,并阻挡向后层传递
false:
本层的后续Touch事件不能被触发,并向后传递
总结:
如何阻塞事件的向后传递?
主要是利用了TargetedTouchDelegate 的一个叫SwallowTouch的参数 ,如果这个开关打开的话,
比他权限低的handler 是收不到 触摸响应的,这里的权限低的意思是先看priority(priority越低的优先级越高)再看哪个Layer最后addChild进去(越后添加的优先级越高)。
CCMenu 就是开了Swallow 并且权限为-128(权限是越小越好),所以CCMenu的事件不会出现击穿
mSwallowsTouches = true 并且 ccTouchBegan 返回 true
如何让Layer所有触摸同时穿透Begin、Move、End事件?
mSwallowsTouches = false 并且 ccTouchBegan 返回 true
ccTouchBegan 返回 true 表示同层处理后续事件(吞噬)
ccTouchBegan 返回 false 表示同层不处理后续事件(Move End Cancled) (击穿)
mSwallowsTouches 设为 true 表示触摸不向下层传递(不一定 如mSwallowsTouches为true began返回false还是会向后传递)
mSwallowsTouches 设为 false 表示触摸向下层传递(不知有啥用)
this->mTouchPriporty 越小,越先接收到触摸
this->mTouchPriporty 同等,越后addChild的越先响应
如何管理多个对话框的优先级?
事件的优先级和绘图的优先级的关系和区别?
VertexZ 又是什么?(VertexZ是openGl的z轴)
绘图的优先级叫ZOrder
如何改版绘图的优先级?
如在容器中通过调用
this->reorderChild(CCNode* child, int zOrder);
如何设置触摸事件的优先级?
CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority - 1, layer);
如何得到触摸事件的优先级?
this->mTouchPriporty (CCNode类成员 私有变量)
如何遍历容器获取特定的对象??
void Touch1Layer::setFocus()
{
// 将zorder=1; priority= kCCMenuTouchPriority - 2; // 设置zorder
SceneController::GetInstancePtr()->getCurLayer()->reorderChild(this, );
// 设置优先级
CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority - , this);
} void Touch1Layer::loseAllFocus()
{
// 获取顶层的所有节点
CCArray* arrChilds = SceneController::GetInstancePtr()->getCurLayer()->getChildren(); for(int i=; i< arrChilds->count(); i++)
{
CCLayerColor* layer = dynamic_cast< CCLayerColor* >( arrChilds->objectAtIndex(i) ); // 跳过自己(不撤销自己的优先级)
if(layer != NULL && layer != this)
{
// 将zorder=0; priority= kCCMenuTouchPriority - 1;
SceneController::GetInstancePtr()->getCurLayer()->reorderChild(layer, );
CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority - , layer);
}
}
}
如何判断点在矩形内部?
CCPoint pos = this->getPosition();
CCSize size = this->getContentSize();
CCRect rect(pos.x, pos.y, size.width, size.height); if( CCRect::CCRectContainsPoint(rect, point) )
{
}
z值大的成员在z值小的成员的上面;
官方解释:
Differences between openGL Z vertex and cocos2d Z order:
- OpenGL Z modifies the Z vertex, and not the Z order in the relation between parent-children
- OpenGL Z might require to set 2D projection
- cocos2d Z order works OK if all the nodes uses the same openGL Z vertex. eg: vertexZ = 0
@warning: Use it at your own risk since it might break the cocos2d parent-children z order
cocos2d-x触摸事件优先级的探究与实践的更多相关文章
- cocos2d-x触摸事件优先级
CCTouchDispatcher是管理cocos2d-x中全部Touch事件派发的类, CCTouchDispatcher中包括了两个CCTouchHandler的列表, 分别存储Standa ...
- Cocos2D v3.x中关于重叠触摸层优先级的问题
在Cocos2D v2.x版本中可以通过以下方法设置本层的触摸优先级: [[CCDirector sharedDirector].touchDispatcher addTargetedDelegate ...
- cocos2dx中的触摸事件及触摸优先级
1.只有CCLayer及其派生类才有触摸功能. 2.开启触摸 setTouchEnable(true); 3.设置触摸模式,单点,多点(仅IOS支持) setTouchMode(kCCTouchesO ...
- Cocos2d-x示例:单点触摸事件
为了让大家掌握Cocos2d-x中的事件机制,以下我们以触摸事件为例.使用事件触发器实现单点触摸事件.该实比如图8-3所看到的,场景中有三个方块精灵,显示顺序如图8-3所看到的,拖拽它们能够移动它们. ...
- cocos2d-x游戏引擎核心之五——触摸事件和触摸分发器机制
一.触摸事件 为了处理屏幕触摸事件,Cocos2d-x 提供了非常方便.灵活的支持.在深入研究 Cocos2d-x 的触摸事件分发机制之前,我们利用 CCLayer 已经封装好的触摸接口来实现对简单的 ...
- iOS中响应者链条-触摸事件
总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -& ...
- Cocos2d-android (06) 屏幕触摸事件及坐标转换
为屏幕添加触摸事件,将左上角坐标转换为左下角坐标 package com.arlen.cocos2d.touch01; import org.cocos2d.layers.CCLayer; impor ...
- cocos2d-x 详解之 CCLayer(触摸事件)
CCLayer继承自CCNode,在CCLayer中可以实现单点触摸.多点触摸和重力感应回调3种不同形式的交互.这部分的难点在于,当存在多个层都要去接收触摸时它的响应机制是如何处理的.了解内部的处理机 ...
- Cocos2d-x实例:单点触摸事件
addChild(boxC,30, kBoxC_Tag); ...
随机推荐
- POJ1177+线段树+扫描线
思路: 以y的值进行离散化 根据x的值 对每一条y轴边进行处理,如果是"左边"则插入,是"右边"则删除. /* 扫描线+线段树+离散化 求多个矩形的周长 */ ...
- PHP 系统常量及自定义常量
__FILE__ 这个默认常量是 PHP 程序文件名.若引用文件 (include 或 require)则在引用文件内的该常量为引用文件名,而不是引用它的文件名. __LINE__ 这个默认常量是 P ...
- java Date和String转换总结
java.util.Date和String类型的转换是非常常用的,现在总结一下: 1. Date转换为String //Date --->String DateFormat dft = new ...
- 【HDOJ】2037 今年暑假不AC
qsort排序后DP,水题.注意,数组开大点儿,把时间理解为0~23,开太小会wa. #include <stdio.h> #include <stdlib.h> #defin ...
- hdu4323Magic Number(dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4323 去年的多校 编辑距离的变形 暴力居然过了 还想了好久别的方法,想得很头疼 #include <ios ...
- C#创建Excel文件并将数据导出到Excel文件
工具原料: Windows 7,Visual Studio 2010, Microsoft Office 2007 创建解决方案 菜单>新建>项目>Windows窗体应用程序: 添加 ...
- BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1614 分析 类似POJ_3662_Telephone_Lines_(二分+最短路) Dijks ...
- nginx 安全漏洞 (CVE-2013-4547)
Nginx 的安全限制可能会被某些请求给忽略,(CVE-2013-4547). 当我们通过例如下列方式进行 URL 访问限制的时候,如果攻击者使用一些没经过转义的空格字符(无效的 HTTP 协议,但从 ...
- [OpenJudge] 平方和
平方和 总时间限制: 3000ms 内存限制: 65536kB 描述 给出n(1<=n<=500000)个数字,下标从1开始 执行m(1<=m<=500000)次操作,操作可分 ...
- poj 1167 简单搜索
这题主要是注意好限定的条件 条件1:每个公交车都至少要到达两次 条件2:公交车相同时间和相同间隔是属于两种车辆 条件3:不同的车可能到达时间相同 上述都是深搜的重要条件: #include<al ...