event.md 9.24 KB

fafd085a450666461a6fe48140c13a4dd926d30c/inner/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 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数
  1. 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'
    }
  1. 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'
    }
  1. 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'
    }
  1. 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 );

示例:见上例

  1. 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');