如何让自定义Layer触发触摸事件?
bool LayerXXX::init()
{
this->setTouchEnabled(true);
CCTouchDispatcher* td = CCDirector::sharedDirector()->getTouchDispatcher();
td->addTargetedDelegate(this, 0, true); //kCCMenuHandlerPriority - 10
// ...
}
解释:::::
方法 ::void CCTouchDispatcher::addTargetedDelegate(CCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches)
第二个参数: nPriority是优先级 其越小,优先级越高。
第三个参数:bSwallowsTouches 设为 true 表示触摸不向下层传递(如bSwallowsTouches为true ;beganTouch方法返回false还是会向后传递)
mSwallowsTouches 设为 false 表示触摸向下层传递
CCTouchDispatcher是管理cocos2d-x中所有Touch事件派发的类,
CCTouchDispatcher中包含了两个CCTouchHandler的列表,
分别存储StandardTouchHandler和 TargetedTouchHandler。
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
原文:
http://www.cnblogs.com/sevenyuan/archive/2013/06/25/3154624.html
分享到:
相关推荐
谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类,还需要实现handleEvent方法 事件发送者和事件接收者要在构造函数和析构函数中调用一下方法 事件发送者...
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
cocos2d-x 触摸事件讲解 手机游戏 开发
cocos2d-x-2.1.5
资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...
Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...
cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656
cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...
资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...
精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发
这是我重新弄的cocos2d-x-3.0的类图.之前别人兄台弄的,有些不全面,有些地方错误.我这个可以说是最新的了.每个类添加了中文的详细注解,同时也添加了中文的类名称翻译.这样对cocos2d-x-3.0的框架比较好上手. 有兴趣的...
《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...
经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip
Cocos2d-x windows vs2010 配置图文详解
Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。
Cocos2d-x游戏编程——C++篇(电子工业出版社,徐飞 著)书本配套的光盘代码,
Cocos2d-x实战 JS卷 Cocos2d-JS开发 PDF 电子书完整版本
cocos2d-x 动画工具 Flash2Cocos2d-x 1.3
cocos2d-x 3.0 人物行走 . 包里有代码和 图片资源.
Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签