cocos2d-x触摸事件优先级
CCTouchDispatcher是管理cocos2d-x中全部Touch事件派发的类,
CCTouchDispatcher中包括了两个CCTouchHandler的列表,
分别存储StandardTouchHandler和 TargetedTouchHandler。
属性:
this->mTouchPriporty
Layer 优先级越小越高越先响应事件
实验一:当两个Layer优先级同等的时候会怎么样呢?
实验发现。同等优先级下,后加入的Layer先响应事件。
-------------------------------
Touch1 100
Touch2 100
Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(255,0,0,128), 100, 100 );
this->addChild( touch1layer );
touch1layer->setPosition(200, 100);
Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,255,0,128), 100, 100 );
this->addChild( touch2layer );
touch2layer->setPosition(250, 100);
结果:
Touch2
Touch1
-------------------------------
Touch1 100
Touch2 100
Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,255,0,128), 100, 100 );
this->addChild( touch2layer );
touch2layer->setPosition(250, 100);
Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(255,0,0,128), 100, 100 );
this->addChild( touch1layer );
touch1layer->setPosition(200, 100);
结果:
Touch1
Touch2
-------------------------------
Touch1 100
Touch2 99
Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,255,0,128), 100, 100 );
this->addChild( touch2layer );
touch2layer->setPosition(250, 100);
Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(255,0,0,128), 100, 100 );
this->addChild( touch1layer );
touch1layer->setPosition(200, 100);
结果:
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, 1);
// 设置优先级
CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority - 2, this);
}
void Touch1Layer::loseAllFocus()
{
// 获取顶层的全部节点
CCArray* arrChilds = SceneController::GetInstancePtr()->getCurLayer()->getChildren();
for(int i=0; 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, 0);
CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority - 1, 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


cocos2dx-lua 触摸锁定自身以外的层
2013-09-02 11:58:15| 分类:
LUA | 标签:
|举报
|字号大中小 订阅
1、首先在初始化的时候要注冊触摸事件:
--注意,这儿第四个參数要设置为true,第三个參数为响应优先级,详细请參看文档
cocos2d-x触摸事件优先级的更多相关文章
- cocos2d-x触摸事件优先级的探究与实践
如何让自定义Layer触发触摸事件? bool LayerXXX::init() { this->setTouchEnabled(true); CCTouchDispatcher* td = C ...
- 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所看到的,拖拽它们能够移动它们. ...
- 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); ...
- cocos2d-x jsb 防止触摸事件传递
在游戏中要实现消息弹窗,让用户点击确认,其他区域产生遮罩,阻挡下层的事件被点击到,这是个很常用的功能,在cocos2d-x中,可以通过为layer添加事件代理来实现: pDirector->ge ...
随机推荐
- luogu3698 [CQOI2017]小Q的棋盘
最长链是根节点到深度最深的结点的路径. 显然,要么直接走最长链,要么兜兜转转几个圈圈再走最长链,而最长链以外的结点因为要"兜圈",所以要经过两次. #include <ios ...
- MYSQL 权限设置查询
mysql> GRANT RELOAD, SUPER, REPLICATION SLAVE ON *.* TO 'repl'@'192.168.3.%' IDENTIFIED BY PASSWO ...
- Laya Timer原理 & 源码解析
Laya Timer原理 & 源码解析 @author ixenos 2019-03-18 16:26:38 一.原理 1.将所有Handler注册到池中 1.普通Handler在handle ...
- 九度oj 题目1014:排名
题目描述: 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名.给定录取分数线,请你写程序找出最后通过分数线的考生,并将他 ...
- 【Luogu】P2324骑士精神(IDA*)
题目链接 当guess>limit-deep的时候return就好了. guess是估价函数,值为不在自己地盘上的骑士个数.limit是本次迭代阈值.deep是已经走了多少步. 这个优化是显然的 ...
- 刷题总结——疫情控制(NOIP2012提高组)
题目: 题目背景 NOIP2012 提高组 DAY2 试题. 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都 ...
- [POJ1664] 放苹果 (动态规划,组合数学)
题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法) 输入输出格式 输入格式: 第一行是测试数据的数目t(0 <= ...
- django 和 mongdb 写一个简陋的网址,以及用django内置的分页功能
https://github.com/factsbenchmarks/simple_websit_about_58 一 设置 数据库的设置 在settings文件中加入这样一段代码: from mon ...
- C#.net磁盘管理以及文件操作
原文发布时间为:2008-08-08 -- 来源于本人的百度文章 [由搬家工具导入] 需要引入的命名空间: using System.IO;using System.Text; private ...
- Python入门--13--爬虫一
URL的格式一般为(带方括号的是可选的): protocol://hostname[:port]/path/[;parameters][?query]#fragment URL由三部分组成: 第一部分 ...