2a7226b893b7a321f1c22f7d037b814665220185/outer/event.md#">事件模块
事件是一种观察者的设计模式,对象可以发布事件,然后其它对象可以观察该对象,等待这些时刻到来并通过运行代码来响应。
事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。
开发者游戏项目和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)后,某个功能点当前分享/视频完成后,下一次推送策略类型会通过这个消息发送处理,开发者监听这个消息,可处理游戏页面上的ui展示(如:视频分享icon、视频分享文案等),查看完整示例。使用方式:
PCSDK.event.add( 'tactic.update' , 处理此消息的事件函数, 事件函数上下文)
接入API:
名称 | 功能说明 |
---|---|
PCSDK.event.add | 添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文 |
PCSDK.event.once | 添加一个事件监听,执行一次后会自动移除此事件监听 |
PCSDK.event.emit | 触发事件监听:执行所绑定的事件类型对应的触发函数 |
PCSDK.event.remove | 移除事件监听:移除添加的事件类型的触发函数 |
PCSDK.event.removeAll | 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 |
- add
javascript PCSDK.event.add( evt_name: string, listener: Function, context: any ): PCSDK.event
定义:添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文。与之对应的是移除事件监听:PCSDK.event.remove:页面销毁或者关闭的时候移除监听
参数:
evt_name: string 必传 事件类型名称
listener: Function 必传 触发函数func,事件处理监听函数
context: any 必传 触发函数func执行上下文
返回值:
PCSDK.event
返回的是event对象,方便链式调用, 例如:
PCSDK.event.add('update.money', () => { }, this )
.add('update.exp', () => { }, this );
示例:游戏中进入Home场景监听金币更新函数,更新金币ui界面的值,关闭Home场景时,移除金币更新函数。
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'
}
- once
javascript PCSDK.event.once( evt_name: string, listener: Function, context?: any ): PCSDK.event
定义:添加一个事件监听,执行一次后会自动移除此事件监听
参数:
evt_name: string 必传 事件类型名称
listener: Function 必传 触发函数func,事件处理监听函数
context: any 必传 触发函数func执行上下文
返回值:
PCSDK.event
返回的是event对象,方便链式调用, 例如:
PCSDK.event.once('update.money', () => { }, this )
.once('update.exp', () => { }, this );
示例:游戏中进入Home场景监听金币更新函数一次,该函数执行完一次后会自动移除该监听事件函数。
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'
}
- emit
javascript PCSDK.event.emit( evt_name: string, ...args: any[] ): PCSDK.event
定义:派发事件监听消息:执行所绑定的事件类型对应的触发函数,可以传递一些触发函数需要的其他任意参数
参数:
evt_name: string 必传 事件类型名称
args: any[] 选传 触发函数需要的其他任意参数
返回值:
PCSDK.event
返回的是event对象,方便链式调用, 例如:
PCSDK.event.emit('update.money', 10000)
.emit('update.exp', 2, 1000 );
示例:游戏中金币领取奖励弹出框,点击领奖后派发金币更新的消息
// 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'
}
- remove
javascript PCSDK.event.remove( evt_name: string, listener: Function, context?: any ): PCSDK.event
定义:移除事件监听:移除添加的事件类型的触发函数。
参数:
evt_name: string 必传 事件类型名称
listener: Function 必传 触发函数func,事件处理监听函数
context: any 必传 触发函数func执行上下文
返回值:
PCSDK.event
返回的是event对象,方便链式调用, 例如:
PCSDK.event.remove('update.money', () => { }, this )
.remove('update.exp', () => { }, this );
示例:见上例
- removeAll
javascript PCSDK.event.removeAll( evt_name: string ): PCSDK.event
定义:移除所有事件监听:移除添加的事件类型下所有该类型的触发函数
参数:
evt_name: string 必传 事件类型名称
返回值:
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');