cocos 的EventHandler 事件派发器

cocos 的EventHandler 事件派发器

cc.Component.EventHandler 类
官方说明

	“EventHandler” 类用来设置场景中的事件回调,该类允许用户设置回调目标节点,目标组件名,组件方法名,并可通过 emit 方法调用目标函数。 */export class EventHandler {			/** !#en the node that contains target callback, such as the 		  node example script belongs to!#zh 事件响应函数所在节点 ,比如例子中脚本归属的节点本身 */target: Node;			/** !#en name of the component(script) that contains target 	callback, such as the name 'MainMenu' of script in example!#zh 事件响应函数所在组件名(脚本名), 比如例子中的脚本名 'MainMenu' */component: string;			/** !#en Event handler, such as function's name 'onClick' in example!#zh 响应事件函数名,比如例子中的 'onClick' */handler: string;			/** !#en Custom Event Data, such as 'eventType' in example!#zh 自定义事件数据,比如例子中的 eventType */customEventData: string;			/**@param events events@param params params */static emitEvents(events: EventHandler[], ...params: any[]): void;			/**!#en Emit event with params!#zh 触发目标组件上的指定 handler 函数,该参数是回调函数的参数值(可不填)。@param params params@example ```js// Call Functionvar eventHandler = new cc.Component.EventHandler();eventHandler.target = newTarget;eventHandler.component = "MainMenu";eventHandler.handler = "OnClick"eventHandler.emit(["param1", "param2", ....]);```*/emit(params: any[]): void;		}	
//按下时 发送消息
let event_handler = new cc.Component.EventHandler();
//目标节点
event_handler.target = this.node;
//设置目标节点的脚本
event_handler.component = "My_Script";
//类似反射函数!执行脚本中的函数
event_handler.handler = "on_click";
event_handler.customEventData = "data";//参数pN+1
//第一种发送方法
event_handler.emit(["param1", "param2"]);//参数p1 p2
//第二种方法 【按钮】加入到自身事件数组 点击会执行
let bt = this.node.getComponent(cc.Button);
bt.clickEvents.push(event_handler);//设置执行函数 与handler名字相同
on_pass_entry_click(p1, p2, p3, p4) {cc.log("on_click");cc.log(p1, p2, p3, p4);//param1 param2 data undefined
}

官方
事件派发机制

在 2.0 之后,我们优化了事件的参数传递机制。
在发射事件时,我们可以在 emit 函数的第二个参数开始传递我们的事件参数。
同时,在 on 注册的回调里,可以获取到对应的事件参数。

cc.Class({extends: cc.Component,onLoad () {//接受消息 两种方式 都可以进行正常接收// 方法1:this.node.on('foo', function (arg1, arg2, arg3) {console.log(arg1, arg2, arg3);  // print 1, 2, 3});
 这里建议使用lamda表达式进行方法调用function只能使用打印方法,不能调用类中的变量'CityHurted' 是事件关键字! 接收之后执行reduceHP方法!this.node.on('City_Hurted',()=>{cc.log("1");this.City_HP-=1;this.reduceHP();});}reduceHP(){this.HP.string = this.City_HP.toString()+"/"+this.c_CityHP.toString();
}

// 方法2:

   'CityHurted' 是事件关键字! 接收之后执行reduceHP方法!this.node.on('City_Hurted', function (event) {event.stopPropagation();cc.log("111");});}
  start () {let arg1 = 1, arg2 = 2, arg3 = 3;// At most 5 args could be emit.//这个方法在 同一个类中进行派发// 方法1:this.node.emit('foo', arg1, arg2, arg3);若要其他对象接受消息 使用dispatchEvent 可以发送到其他类,但是必须发给父对象// 方法2:this.node.dispatchEvent( new cc.Event.EventCustom('City_Hurted', true) );},
});

需要说明的是,出于底层事件派发的性能考虑,这里最多只支持传递 5 个事件参数。所以在传参时需要注意控制参数的传递个数。

派送事件

上文提到了 dispatchEvent 方法,
通过该方法发射的事件,会进入事件派送阶段。
在 Cocos Creator 的事件派送系统中,我们采用冒泡派送的方式。
冒泡派送会将事件从事件发起节点,不断地向上传递给他的父级节点,
直到到达根节点或者在某个节点的响应函数中做了中断处理event.stopPropagation()

在这里插入图片描述

如上图所示,当我们从节点 c 发送事件 “foobar”,倘若节点 a,b 均做了 “foobar” 事件的监听,则 事件会经由 c
依次传递给 b,a 节点。如: // 节点 c 的组件脚本中

this.node.dispatchEvent( new cc.Event.EventCustom('foobar', true) );

如果我们希望在 b 节点截获事件后就不再将事件传递,我们可以通过调用 event.stopPropagation()
函数来完成。具体方法如下:

// 节点 b 的组件脚本中
this.node.on('foobar', function (event) {event.stopPropagation();
});

请注意,在发送用户自定义事件的时候,请不要直接创建 cc.Event 对象,因为它是一个抽象类,请创建
cc.Event.EventCustom 对象来进行派发。

事件对象

在事件监听回调中,开发者会接收到一个 cc.Event 类型的事件对象 event,stopPropagation 就是 cc.Event
的标准 API, 其它重要的 API 包含:

API 名 类型 意义

type String 事件的类型(事件名)
target cc.Node 接收到事件的原始对象
currentTarget cc.Node 接收到事件的当前对象,事件在冒泡阶段当前对象可能与原始对象不同
getType Function 获取事件的类型
stopPropagation Function 停止冒泡阶段,事件将不会继续向父节点传递,当前节点的剩余监听器仍然会接收到事件
stopPropagationImmediate Function 立即停止事件的传递,事件将不会传给父节点以及当前节点的剩余监听器
getCurrentTarget Function 获取当前接收到事件的目标节点
detail Function 自定义事件的信息(属于 cc.Event.EventCustom)
setUserData Function 设置自定义事件的信息(属于 cc.Event.EventCustom)
getUserData Function 获取自定义事件的信息(属于 cc.Event.EventCustom)

完整的 API 列表可以参考 cc.Event 及其子类的 API 文档。
系统内置事件
以上是通用的事件监听和发射规则,
在 Cocos Creator 中,我们默认支持了一些系统内置事件,可以参考我们后续的文档来查看如何使用:
——————————————————————————————
鼠标、触摸:可参考 节点系统事件文档
键盘、重力感应:可参考 全局系统事件文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352931.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C# 的 事件 与 EventHandler

事件接受与发送是通过 委托来实现的,随意,在学习事件之前一定要知道委托。 首先我们先看下图:上的图不完整人,但大概是这个意思。 我们要创建一个事件管理。 来处理发布者发送消息和订阅者的接受消息中间转接。 然后订阅者去创建…

C# 实例解析事件委托之EventHandler

概述 事件属于委托的一个子集,像我们平时界面上的鼠标点击按钮后响应事件、事件的发布和订阅等都需要用到委托.通过委托可以很好的实现类之间的解耦好。事件委托EventHandler的 函数原型如下:delegate 表示这个个委托,事件委托没有返回值&…

wpf中EventHandler的使用

应用情景:比如点击A界面的a按钮,跳转到B界面了,点击b按钮后,触发了业务逻辑,然后需要回到A界面中执行某一个方法。不是唯一的方法,可以使用别的方法,类似观察者模式,有变化了&#x…

使用Transformer模型进行计算机视觉任务的端对端对象检测

Transformer模型是google团队在2017在论文attention is all you need中提出的一个用于NLP领域的模型,但是随着VIT模型与Swin Transformer模型的发布,把Transformer模型成功应用到计算机视觉任务中。 上期图文,我们使用hugging face的transformers模型进行了VIT模型的对象分…

3、线程通信EventHandler使用

作者:韩茹 公司:程序咖(北京)科技有限公司 鸿蒙巴士专栏作家 一、使用场景 EventHandler开发场景 EventHandler的主要功能是将InnerEvent事件或者Runnable任务投递到其他的线程进行处理,其使用的场景包括&#xff1a…

ChatGPT市场营销指南震撼出炉,你错过了?!

ChatGPT是一种基于AI技术的语言模型,它可以与用户进行对话和交互。它被广泛应用于各个领域,包括市场营销。作为一名市场营销人员,您可以使用ChatGPT来获得创意、解决问题和生成内容。 下面是190个ChatGPT提示,可帮助营销人员更好…

专业分析┃微电子专业介绍及发展前瞻

不知道提到微电子,你最先想到的是什么?芯片?卡脖子?摩尔定律? 因为近两年芯片被限制的原因,大家经常可以从各路媒体上看到“芯片”一词。微电子作为一个学科,简单的说,就是研究如何…

Cookie和session工作流程详解

目录 cookie机制 session会话 理解会话机制 Servlet中对Cookie和Session提供的 HttpServletrequest类中的方法: 模拟实现登录功能 首先实现功能分为两个界面: (1)登录页面代码(前端代码) (2) 编写Lo…

Mac - 鼠标拖尾特效 By CursorEffect2

目录 一.引言 二.安装 CursorEffect2 三.使用 CursorEffect2 四.使用效果 五.内存消耗 六.一键关闭 七.总结 一.引言 在自己搭建的 Hexo 博客上可以定义鼠标点击的特效,如图点击后可以产生彩色的斑点。 于是想着除了浏览 Hexo 博客外,能不能别的也…

MyBatis深入学习总结

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作(查询数据) 原始jdbc操作(插入数据) 原始jdbc操作的分析 原始jdbbc开发存在的问题如下: 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

window11中QQ登录“无法访问个人文件夹”解决方案

window11刚发行不久,安装各种软件或多或少会遇到各种bug,例如安装QQ后,打开时会提醒你“无法访问个人文件夹”而打开QQ失败。 可以通过改变你自己设置的个人文件夹的权限来解决这个问题。 找到文件夹所在位置,右击文件夹&#xf…

QQ登录显示无法访问个人文件夹解决办法

之前QQ登录出错,一直显示无法访问个人文件夹,是否自动修复个人文件权限 直接找到你安装qq的文件路径,右键--》授予访问权限--》删除访问,就可以正常登录了 !

如何解决Windows10启动QQ时报错无法访问个人文件夹?

1、首先不要安装其他电脑管家,因为这会使Windows10自带的安全中心出现变化,第一步打开自带安全中心。 2、进入之后找到病毒和威胁防护,进入病毒和威胁防护设置。 3、进入病毒和威胁防护设置后,找到管理受控制文件夹访问权限。 4、…

启动QQ时无法访问个人文件夹XXX,是否自动修复个人文件夹权限

如图 点击确定显示修复权限失败 找到上图显示的文件路径 右键属性 -> 安全 -> 编辑 -> 选中Users -> 勾选完全控制

腾讯QQ登录“无法访问个人文件夹”解决方法

今天,登录QQ时出现“无法访问个人文件夹,个人文件将被保存到我的文档”的问题 上网搜索了一下,还是没有解决问题。然后自己思考了一下,可能与我修改了“我的文档”的路径有关,我刚刚安装的QQ个人文件夹也正好指定放在…

解决QQ显示“无法访问个人文件夹”方法

在qq登录的过程中,显示“无法访问个人文件夹”这样的提示,该怎解决? 尝试过把qq卸载之后重新装,改变一下qq的属性-兼容性,以及管理员的方式运行,查了不少的攻略,始终无法解决; 经过…

Win11 “qq无法访问个人文件夹”解决方法(原创)

今天登QQ,突然弹窗显示“qq无法访问个人文件夹”,网上搜了一堆方法都没用,也不想卸载重装qq,我就寻思是不是文件夹权限的问题。 右键显示的无法访问的个人文件夹,选择“安全”,我把Users的权限选中&#xf…

qq 微信 无法访问个人文件夹

昨天某个时刻开始,QQ会出现所有图片无法加载的状况,微信会出现截图发到聊天框是文件的问题。 一开始不以为然,直到第二天重启电脑发现两个软件都登陆不上去了。对应显示的是标题的关键字,因为问题已经解决就不截图了。 解决方案&…

android 新建桌面文件夹在哪里,添加并管理桌面文件夹

添加并管理桌面文件夹 我们在使用Android手机的时候,随着手机内安装的软件越来越多,比如说笔者的这个手机里,算了一下,一共装了110个应用程序,七个分页,每页显示16个图标。那么在这里我们设想一下&#xff…

Win11QQ无法访问个人文件夹

Win11QQ无法访问个人文件夹 #第一步 找到QQ文件存储的文件夹 #第二步 右键→属性→安全→User→编辑→User→完全控制→确定 #OK了 去试一试吧b( ̄▽ ̄)d