如何让自定义Layer触发触摸事件?


bool LayerXXX::init()
{
  this->setTouchEnabled(true);

  CCTouchdispatcher* td = CCDirector::sharedDirector()->getTouchdispatcher();
  td->addTargetedDelegate(this,true); //kCcmenuHandlerPriority - 10

  // ...
}

CTouchdispatcher是管理cocos2d-x中所有Touch事件派发的类,

CCTouchdispatcher中包含了两个CCTouchHandler的列表,
分别存储StandardTouchHandler和 TargetedTouchHandler。

属性:
this->mTouchPriporty

Layer 优先级越小越高
越低越先响应事件

实验一:当两个Layer优先级同等的时候会怎么样呢?

实验发现,同等优先级下,后添加的Layer先响应事件。


//-------------------------------
//Touch1 100
//Touch2 100
Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(255,128),100,100 );
this->addChild( touch1layer );
touch1layer->setPosition(200,100);

Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,255,100 );
this->addChild( touch2layer );
touch2layer->setPosition(250,100);

//结果:
//Touch2
//Touch1
//-------------------------------
//Touch1 100
//Touch2 100
Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,100);

Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(255,100);

结果:
Touch1
Touch2
-------------------------------
Touch1 100
Touch2 99
Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,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

cocos2d-x触摸事件优先级的探究与实践的更多相关文章

  1. ios – UIScrollView中的UIControll未接收到触摸事件

    我在我的项目中使用SevenSwitch.我需要将它添加到UIScrollView中,但是当我将它添加到滚动视图中时,控件似乎无法接收触摸事件.我尝试了子类滚动视图并覆盖下面的代码:还补充说:但仍然无法接收触摸事件.如何阻止scrollview阻止UIControl接收触摸?

  2. iOS推送通知优先级

    我已设置推送通知并正常工作,但是,有时我会遇到终端设备上的延迟交付.有没有办法我可以将推送的“优先级”键设置为10,以便立即发送推送?

  3. ios – 何时使用Semaphore而不是Dispatch Group?

    我会假设我知道如何使用DispatchGroup,为了解问题,我尝试过:结果–预期–是:为了使用信号量,我实现了:并在viewDidLoad方法中调用它.结果是:从概念上讲,dispachGroup和Semaphore都有同样的目的.老实说,我不熟悉:什么时候使用信号量,尤其是在与dispachGroup合作时–可能–处理问题.我错过了什么部分?

  4. 如何使用Xcode的自动布局调整视图大小

    解决方法在写这个问题时,我意识到了诀窍是什么:在NSPopUpButton的大小检查器中,我不得不降低内容拥抱优先级.显然,这可以控制视图“拥抱”其内容的紧密程度.因此,当拥抱优先级高于调整大小优先级时,视图将不希望增加其大小,因为这意味着其边界与其内容之间具有更多的空白空间.然后在我的特殊情况下,我也可以将两个NSPopUpButtons固定为具有相同的宽度和vo:popUpButtons将完美地调整大小,同时保持间距不变.

  5. ios – 默认的自动布局内容拥抱和内容压缩阻抗优先级值是什么?

    我正在尝试调试自动布局问题,并且知道内容拥抱和内容压缩阻力优先级的默认值将有所帮助.这些是什么?它们是否特定于特定组件?我可以使用常量来引用它们吗?

  6. ios – 为自定义创建的串行异步队列设置优先级

    如何使用GCD为自定义创建的串行异步队列设置高优先级?如果是这样,什么是替代解决方案?解决方法您的队列仍然是串行的.它只会在高优先级全局并发后台队列的一个插槽中一次执行一项任务.一旦创建,串行队列就不能以任何方式“并发”.同样,如果您创建并发队列并将其设置为以串行队列为目标,则它实际上变为串行.这一切都在manpage中有所涉及.

  7. iOS 9中UILabel中的多行文本

    我正在开发iOS项目但是当我更新到iOS9时,我在UILabels中遇到了多线问题.我正在使用Autolayout.有谁知道如何在iOS9中做到这一点?如果是这样,那么问题可能是标签内容压缩阻力优先级太低,尝试将其设置为required或1000.内容压缩阻力告诉视图引擎您的标签可以缩小的优先级.将其设置为必需会强制它不缩小.在InterfaceBuilder中,只需选择标签,点击SizeInspector(小标尺),然后将其更改为1000.或者,在代码中,等价物将是:

  8. ios – AutoLayout修改约束

    我发现Autolayout有点困难,所以任何帮助都会非常感激解决方法嗨,你可以做2套约束:>1以优先级高管理您的四视图>1以优先级低管理全屏在点击按钮时调用的方法中,将优先级设置为全屏约束,将优先级设置为四视图约束.

  9. Swift 运算符重载

    但是现在还有另外一个Swift的特性,你应该知道并且会爱上它,它就是运算符重载。例如:我们在SwiftSpriteKitutilitylibrary代码中使用运算符重载去讲多个CGPoints对象相加,例如下面代码:1234letpt1=CGPointletpt2=CGPointletpt3=pt1+pt2letpt4=pt3*100方便吧?当一个人查看你的代码,他们希望操作符的默认行为,这时候运算符重载会使他们迷惑。幸运的是Swift让你能够定义属于你自己的自定义的运算符。

  10. Swift学习一:自定义运算符 operator

    自定义运算符仅能包含这些字符:运算符位置:运算符其他配置范例

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部