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 Function
		var 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 中,我们默认支持了一些系统内置事件,可以参考我们后续的文档来查看如何使用:
——————————————————————————————
鼠标、触摸:可参考 节点系统事件文档
键盘、重力感应:可参考 全局系统事件文档

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值