# 事件模块 事件是一种观察者的设计模式,对象可以发布事件,然后其它对象可以观察该对象,等待这些时刻到来并通过运行代码来响应。 事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。 开发者游戏项目和PCSDK属于两个不同的模块,PCSDK会在SDK内部处理一些业务,想要把这些处理结果告知开发者,那么自定义事件就派上用场了,SDK封装了一个event模块:PCSDK.event,开发者可使用这个模块接收SDK内部派发的消息,也可以应用在游戏中不同模块中通信的情况。 PCSDK内部派发了以下几个内部消息,开发者可根据实际功能需要使用PCSDK.event api监听这些消息: > 1、app.show:多平台的onShow事件消息,例如微信小游戏、QQ轻游戏的onShow事件。使用方式: > > **PCSDK.event.add( 'app.show' , 处理此消息的事件函数, 事件函数上下文)** > 2、app.hide: 多平台的onHide事件消息,例如微信小游戏、QQ轻游戏的onHide事件。使用方式: > > **PCSDK.event.add( 'app.hide' , 处理此消息的事件函数, 事件函数上下文)** > 3、tactic.update:推送策略更新事件消息,接入[分享视频模块(shareVideo)](share.md)后,某个功能点当前分享/视频完成后,下一次推送策略类型会通过这个消息发送处理,开发者监听这个消息,可处理游戏页面上的ui展示(如:视频分享icon、视频分享文案等),[查看完整示例](share.md#detail)。使用方式: > > **PCSDK.event.add( 'tactic.update' , 处理此消息的事件函数, 事件函数上下文)** #### **接入API**: | **名称** | **功能说明** | | ---------------- | ------------------------------------------------------------ | | PCSDK.event.add | 添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文 | | PCSDK.event.once | 添加一个事件监听,执行一次后会自动移除此事件监听 | | PCSDK.event.emit | 触发事件监听:执行所绑定的事件类型对应的触发函数 | | PCSDK.event.remove | 移除事件监听:移除添加的事件类型的触发函数 | | PCSDK.event.removeAll | 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 | 1. **add** ```javascript PCSDK.event.add( evt_name: string, listener: Function, context: any ): PCSDK.event ``` 定义:添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文。与之对应的是移除事件监听:PCSDK.event.remove:页面销毁或者关闭的时候移除监听 参数: ```javascript evt_name: string 必传 事件类型名称 listener: Function 必传 触发函数func,事件处理监听函数 context: any 必传 触发函数func执行上下文 ``` 返回值: ```javascript PCSDK.event 返回的是event对象,方便链式调用, 例如: PCSDK.event.add('update.money', () => { }, this ) .add('update.exp', () => { }, this ); ```
示例:游戏中进入Home场景监听金币更新函数,更新金币ui界面的值,关闭Home场景时,移除金币更新函数。 ```javascript export default class HomeScene extends BaseView{ protected addEvent() { super.addEvent(); // 添加注册金币更新事件监听 PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); } protected removeEvent() { super.removeEvent(); // 移除注册金币更新事件监听 PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); } /** * 更新金币ui */ private handleUpdateMoney( money: number ){ this.txtCoin.text = `${money}`; } } /** * event事件枚举 */ export enum EventEnum{ UPDATE_MONEY = 'update.money' } ``` 2. **once** ```javascript PCSDK.event.once( evt_name: string, listener: Function, context?: any ): PCSDK.event ``` 定义:添加一个事件监听,执行一次后会自动移除此事件监听 参数: ```javascript evt_name: string 必传 事件类型名称 listener: Function 必传 触发函数func,事件处理监听函数 context: any 必传 触发函数func执行上下文 ``` 返回值: ```javascript PCSDK.event 返回的是event对象,方便链式调用, 例如: PCSDK.event.once('update.money', () => { }, this ) .once('update.exp', () => { }, this ); ``` 示例:游戏中进入Home场景监听金币更新函数一次,该函数执行完一次后会自动移除该监听事件函数。 ```javascript export default class HomeScene extends BaseView{ protected open(){ super.open(); // 添加一次注册金币更新事件监听,该事件监听执行一次后,自动移除 PCSDK.event.once(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); } /** * 更新金币ui */ private handleUpdateMoney( money: number ){ this.txtCoin.text = `${money}`; } } /** * event事件枚举 */ export enum EventEnum{ UPDATE_MONEY = 'update.money' } ``` 3. **emit** ```javascript PCSDK.event.emit( evt_name: string, ...args: any[] ): PCSDK.event ``` 定义:派发事件监听消息:执行所绑定的事件类型对应的触发函数,可以传递一些触发函数需要的其他任意参数 参数: ```javascript evt_name: string 必传 事件类型名称 args: any[] 选传 触发函数需要的其他任意参数 ``` 返回值: ```javascript PCSDK.event 返回的是event对象,方便链式调用, 例如: PCSDK.event.emit('update.money', 10000) .emit('update.exp', 2, 1000 ); ``` 示例:游戏中金币领取奖励弹出框,点击领奖后派发金币更新的消息 ```javascript // RewardCoinPopwin弹出框领奖励后,派发update.money消息 export default class RewardCoinPopwin extends BaseView{ private rewardCoin: number; protected open(){ super.open(); this.rewardCoin = 10000000; } protected addEvent() { super.addEvent(); this.btnReward.on(Laya.Event.CLICK, this, this.onReward); } protected removeEvent() { super.removeEvent(); this.btnReward.off(Laya.Event.CLICK, this, this.onReward); } /** * 金币领取奖励 */ private onReward(ev: Laya.Event){ // 派发金币更新的消息,并把添加的金币传递 PCSDK.event.emit(EventEnum.UPDATE_MONEY, this.rewardCoin ); } } // HomeScene监听update.money消息,处理加金币操作 export default class HomeScene extends BaseView{ protected addEvent() { super.addEvent(); // 添加注册金币更新事件监听 PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); } protected removeEvent() { super.removeEvent(); // 移除注册金币更新事件监听 PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); } /** * 更新金币ui */ private handleUpdateMoney( addMoney: number ){ this.txtAddCoin.text = `${addMoney}`; } } /** * event事件枚举 */ export enum EventEnum{ UPDATE_MONEY = 'update.money' } ``` 4. **remove** ```javascript PCSDK.event.remove( evt_name: string, listener: Function, context?: any ): PCSDK.event ``` 定义:移除事件监听:移除添加的事件类型的触发函数。 参数: ```javascript evt_name: string 必传 事件类型名称 listener: Function 必传 触发函数func,事件处理监听函数 context: any 必传 触发函数func执行上下文 ``` 返回值: ```javascript PCSDK.event 返回的是event对象,方便链式调用, 例如: PCSDK.event.remove('update.money', () => { }, this ) .remove('update.exp', () => { }, this ); ``` 示例:[见上例](event.md#event_add) 5. **removeAll** ```javascript PCSDK.event.removeAll( evt_name: string ): PCSDK.event ``` 定义:移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 参数: ```javascript evt_name: string 必传 事件类型名称 ``` 返回值: ```javascript PCSDK.event 返回的是event对象,方便链式调用, 例如: PCSDK.event.removeAll('update.money') .removeAll('update.exp'); ``` 示例: 移除游戏中所有update.money事件监听:PCSDK.event.removeAll('update.money'); 移除游戏中所有update.exp事件监听:PCSDK.event.removeAll('update.exp');