cocos2d-x触摸事件优先级的探究与实践

Layer2+Move to earn,MetaTube元宇宙游戏爆发前夜 2020以来,随着新冠疫情在全球范围内蔓延,对世界经济造成了广泛破坏,“保持社交距离”的相关禁令、“减少公共场所聚集与活动”的警惕心理,使消费和商业活动遭受重创。 但全球电子游戏产业却仍在蓬勃发展。“宅”族人群寻求社交互动的需求增长,游戏为其提供了一种引人入胜的消遣方式,相关数据显示,疫情以来,人们玩游戏的时间以及游戏销售额都有了巨大提升。 这其中,基于区块链技术的现象级GameFi游戏,伴随Crypto Kitties诞生、Axie Infinity的现象级出现,以及DeFi、NFT的爆红和应用. 阅读详情

(仓促发布,未整理,待整理)


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

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


CCTouchDispatcher* td = CCDirector::sharedDirector()->getTouchDispatcher();
td->addTargetedDelegate(this, 0, 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(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



Unity 基础 之 Layer(层layer) 、LayerMask (遮罩层) 的 总结 和 使用(CullingMask、Ray 射线的使用等) Unity 基础 之 Layer(层layer) 、LayerMask (遮罩层) 的 总结 和 使用(CullingMask、Ray 射线的使用等) 目录 Unity 基础 之 Layer(层layer) 、LayerMask (遮罩层) 的 总结 和 使用(CullingMask、Ray 射线的使用等) 一、简单介绍 二、layer 层查看与创建 layer 层查 layer 层创建 三、层的设置(手动设置和代码设置) 层的手动设置 层的代码设置 四、LayerMask 的... 阅读详情

相关推荐

cocos2d-x添加触摸层阻止后端事件

由于cocos2d-x中的优先级小的,先响应触摸事件,这是,我们只需要设置新添加的cclayer层的优先级即可,但由于ccmenu的优先级较高,所以,很有可能透过我们添加的触摸层,响应之前的绑定的button事件,而如果我们设置此触摸层优先级比button的低时,又导致在这层添加的button按钮的触摸事件不能触发,导致本层应该触摸的事件也不能响应,这样也达不到我们理想的效果:弹出一个层,屏蔽后面

在路上 1万+

Layer弹窗入门(下)

 本课程系统讲解了layer弹窗里的所有方法。逐一进行了分析和讲解。内置方法config全局设置 ready就绪 open核心方法 alert弹框 confirm询问 msg提示 load加载 tips吸附 close关闭层 closeAll关闭全部 style title重置标题 getChildFrame getFrameIndex iframeAuto iframeSrc setTop多层置顶 full/min/restore 其他内置层prompt输入层 tab选项卡层 photos图片层

Cocos2d-x 3.0 新特性体验(3)触摸事件处理机制

在cocos2d-x 2.x版本中,相信大家都抱怨过其中的触摸机制;在3.0版本中,采用了全新的触摸事件处理机制。 在官方的文档中:点击打开链接  这篇文章有对新的事件分发机制的介绍。 下面,我将通过引擎中自带的sample来探索一下这个新的触摸事件处理机制。

小邓笔记 2万+

layer tips

最近在完成一个在图片上标识人物,建筑等信息的项目,如何显示标签成为了一个揪心的问题。 如果新建div来显示文本未免太过麻烦,就上网搜了下。 最终找到了layer tips 这一简单的工具。 首先,需要引入layer.js &lt;script src='./layer/layer.js'&gt;&lt;/script&gt; 需要注意的是:在官网上下载的layer不能拆分,要整体放在项目...

一止弋的博客 4万+

NXP应用随记(八):S32K3XX的HSE学习记录(HSE\MU\UTEST\IVT\A,B SWAP)

HSE,即硬件安全引擎(Hardware Security Engine),是NXP S32K312微控制器(MCU)中的一个功能,它提供了一系列的安全特性,包括加密、安全启动和密钥存储等。这些功能旨在增强汽车电子系统的信息安全,符合ISO26262标准,达到ASIL D安全等级。具体来说,S32K312的HSE支持AES-128/192/256加密、RSA、ECC等加密算法,以及侧通道保护,确保了数据传输和存储的安全性。

梦想技术家 9749

避坑指南:在Ubuntu 22.04上配置UR5e与ROS2 Humble真机通信的完整流程

本文详细介绍了在Ubuntu 22.04上配置UR5e机械臂与ROS2 Humble真机通信的完整流程,包括环境准备、网络配置、URCap安装、ROS2驱动部署及控制器状态验证等关键步骤。特别针对常见问题如网络连接失败、驱动启动错误等提供了实用解决方案,帮助工程师高效完成UR5e与ROS2的集成工作。

weixin_30790841的博客 465

layer层的触摸吞噬

今天在一个场景上添加布景层layer的时候,想要设置触摸吞噬 本以为this->setTouchEnable(true);this->setSwallowsTouches(true);两句话就搞定了,却一直得不到想要的效果。 后来发现仅仅设置可触摸是不行的,需要给他设置触摸监听事件,用设置的监听listener来调用设置触摸吞噬函数。注意:需要实现一个touchBegan,否则vs会报错)

zhanghow的博客 4万+

IFIX数据库Datebase当前值问号

IFIX数据库Datebase当前值问号,已解决,亲测有效 在OPC PowerTool有数据的情况下,IFIX数据库Datebase当前值显示???? 问题分析及解决方法 我的IFIX5.8版本,其它版本可参考 打开IFIX工作台:应用程序–任务控制–I/O驱动–OPC Client;查看OPC驱动是否被禁用,点击启动,变成激活状态即可;若点击启动无法激活OPC驱动,需要重新安装OPC驱动,方法如下: 下载I/O Driver文件 下载链接:https://download.youkuaiyun.com/down

Ron_Tso的博客 2759

Cocos2d-x:触摸事件优先级的探究与实践

如何让自定义Layer触发触摸事件? bool LayerXXX::init() {   this->setTouchEnabled(true);   CCTouchDispatcher* td = CCDirector::sharedDirector()->getTouchDispatcher();   td->addTargetedDelegate(this, 0, true);

Alostz 707

电力电子技术文章:ACOT控制模式在Buck变换器中的频率稳定性分析

本文深入分析了ACOT控制模式在Buck变换器中实现频率稳定性的原理与优势。通过对比传统COT模式,阐述了ACOT如何通过自适应调整导通时间,将开关频率锁定在设定值,从而有效应对输入电压与负载变化。文章还探讨了其在轻载DCM模式下的高效与平滑切换特性,并提供了关键的设计考量与实战指南。

cc789的博客 1152

(详细总结)python爬取 163收件箱邮件内容,收件箱列表的几种方法(urllib, requests, selenium)

需求:最近有一个需求,需要将163邮箱收件箱里面的所有邮件的内容全部copy下来,整理到一个word里面,不多也就28页的邮件(不要问我为什么有这需求,不告诉你),自己手动去ctrl+ cv 的话,估计要搞吐。然后就想能不能用python的爬虫来实现,虽然过程比较苦(后期改bug改的要吐了)。但是会后还是将需求实现了。这基本也算是入门了 urllib、requests、selenium这几个py...

man_tou_22 1万+

[ IOS-Cocos2d-x 游戏开发之一] -cocos2d-x触摸事件优先级的探究与实践

cocos2d-x触摸事件优先级的探究与实践 [版本:2.0] CCTouchDispatcher是管理cocos2d-x中所有Touch事件派发的类, CCTouchDispatcher中包含了两个CCTouchHandler的列表, 分别存储StandardTouchHandler和 TargetedTouchHandler。     // d

Mr_Hiki的专栏 914

【大模型】DeepSeek + Coze 打造个人专属AI智能体使用详解

DeepSeek + Coze 打造个人专属AI智能体使用详解

congge 1万+

cocos2d-x触摸事件优先级

CCTouchDispatcher是管理cocos2d-x中所有Touch事件派发的类, CCTouchDispatcher中包含了两个CCTouchHandler的列表, 分别存储StandardTouchHandler和 TargetedTouchHandler。 属性: this->mTouchPriporty Layer 优先级越小越高 越低越先响应事件

liliangchw的专栏 4574

SMOKE 3D:从 Python 到 C++ 实现车辆与行人单目 3D 视觉识别在 RK3588 上的深度部署

SMOKE的网络结构通常基于高性能的骨干网络(如DLA-34,您使用的模型就是基于此),通过编码器-解码器架构来提取特征。输入:RGB图像(本项目为骨干网络:用于特征提取。检测头热力图分支:预测关键点热力图。通常在热力图上进行NMS来找到局部最大值,即潜在的关键点位置。回归分支:对于每个关键点位置,预测上述的8维3D属性向量。分类分支:预测每个关键点对应的物体类别。置信度分支:预测每个关键点的置信度。本教程详细介绍了SMOKE单目3D目标检测模型在RK3588上的部署。我们从SMOKE的。

LXY_LOVE36的博客 438

【Flink】Flink提交任务到Yarn报错Unable to close file because the last blockBP enough number of replicas

当使用 HDFS 存储文件时,每个数据块会有多个副本分布在不同的节点上,以确保数据的可靠性和容错性。然而,由于某种原因,最后一个数据块 blk_1101776325_28036289 的副本数量不足,导致无法成功关闭文件。如果确定副本数量正确,并且问题仍然存在,可以尝试手动修复副本不足的情况。异常消息表明在关闭文件时出现问题,我的原因是hadoop上有个节点有问题,导致提交到那个节点的时候,无法传递包到相关的机器上。检查 HDFS 集群的状态,确保所有节点都正常工作,没有节点宕机或网络故障等问题。

九师兄 935

Cocos2d-X之触摸事件

Cocos2d-x中触摸事件分为单点触摸事件和多点触摸事件。单点触摸事件1.触摸事件的分析(1)第一阶段:触摸开始,当用户的手指接触到手机屏幕上时。 (2)第二阶段:触摸移动,当用户的手指在屏幕上滑动时。 (3)第三阶段:触摸结束,当用户的手指脱离屏幕时。 (4)第四阶段:触摸取消,当用户的手指还未脱离屏幕,但手机进入后台,例如来电话,长时间无响应,屏幕关闭之类的情况。这四个阶段都会把映射成程

明了的博客 2053

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

cocos2d-lua 触摸事件

转载:http://www.cocos.com/doc/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/framework/quick/V3/touch-events/zh.md Quick 中的触摸事件 Cocos2d-x 原本的触摸机制存在一些限制,在使用中需要开发者做不少额外的处理。所以 Quick-C

suntwei的专栏 3766

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Cocos2d-x 触摸事件层级关系

下面介绍一个跟触摸事件优先级层级关系的问题: 我自定义了一个精灵类,而且这个精灵类对象可以接收触摸事件;然后我还在这个自定义的精灵中添加了一个CCEditBox输入框。那么这个时候就要小心处理这二者之间接收触摸事件的优先级。 假如对自定义精灵注册触摸事件是: CCDirector::sharedDirector()->getTouchDispatcher()->addTarget

小邓笔记 4563

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

cocos2d-x 3.x之触摸事件

Layer类的一个重要作用就是接受输入事件,它封装了触摸输入的处理接口。一般情况下,我们可以通过setTouchEnabled方法来开启或关闭接收触摸输入。事实上并不是只有Layer才支持接收触摸事件,任何一个游戏元素都可以接收事件,只不过Layer提供了现成的支持。 我们只需通过创建一个事件监听器用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher中,所有事件监听

http://ysir.me 1300

cocos2d-x的两种触摸事件

在Cocos2d-x中,CCTouchDispatcher类负责触摸事件的分发处理,其包含两种触摸事件standardDelegate(标准触摸事件)、targetedDelegate(目标触摸事件) 当调用setTouchEnabled(true)设置当前Layer接收触摸事件的时候,默认是开启标准触摸事件。 void CCLayer::setTouchEnabled(bool

妙心的专栏 1088
上一篇: 记录一个unsigned int 的0被-1之后变成大数的小问题
下一篇: Ubuntu 10.04.4 LTS 如何配置samba
sonikk
博客等级 码龄15年 68粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值