|
@@ -0,0 +1,122 @@
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 游戏事件管理类
|
|
|
|
|
+ * @author 冯聪
|
|
|
|
|
+ */
|
|
|
|
|
+export default class EventSystem {
|
|
|
|
|
+
|
|
|
|
|
+ //参数部分-----------------------------------------------------------------------------------
|
|
|
|
|
+
|
|
|
|
|
+ /** 监听数组 */
|
|
|
|
|
+ private listeners: { [key: string]: Observer[] } = {};
|
|
|
|
|
+
|
|
|
|
|
+ //逻辑部分-----------------------------------------------------------------------------------
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 注册事件
|
|
|
|
|
+ * @param name 事件名称
|
|
|
|
|
+ * @param callback 回调函数
|
|
|
|
|
+ * @param context 上下文
|
|
|
|
|
+ */
|
|
|
|
|
+ public register(name: string, callback: Function, context: any) {
|
|
|
|
|
+
|
|
|
|
|
+ //如果没有该事件
|
|
|
|
|
+ if (!this.listeners[name]) {
|
|
|
|
|
+ this.listeners[name] = [];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ let observers: Observer[] = this.listeners[name];
|
|
|
|
|
+
|
|
|
|
|
+ let length = observers.length;
|
|
|
|
|
+ for (let i = 0; i < length; i++) {
|
|
|
|
|
+ let observer = observers[i];
|
|
|
|
|
+ if (observer.compar(context)) {
|
|
|
|
|
+ console.warn("[EventMgr]重复添加监听,请检查事件:", name)
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ this.listeners[name].push(new Observer(callback, context));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 移除事件
|
|
|
|
|
+ * @param name 事件名称
|
|
|
|
|
+ * @param callback 回调函数
|
|
|
|
|
+ * @param context 上下文
|
|
|
|
|
+ */
|
|
|
|
|
+ public remove(name: string, callback: Function, context: any) {
|
|
|
|
|
+
|
|
|
|
|
+ let observers: Observer[] = this.listeners[name];
|
|
|
|
|
+ if (!observers) return;
|
|
|
|
|
+ let length = observers.length;
|
|
|
|
|
+ for (let i = 0; i < length; i++) {
|
|
|
|
|
+ let observer = observers[i];
|
|
|
|
|
+ if (observer.compar(context)) {
|
|
|
|
|
+ observers.splice(i, 1);
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (observers.length == 0) {
|
|
|
|
|
+ delete this.listeners[name];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 发送事件
|
|
|
|
|
+ * @param name 事件名称
|
|
|
|
|
+ */
|
|
|
|
|
+ public fire(name: string, ...args: any[]) {
|
|
|
|
|
+
|
|
|
|
|
+ let observers: Observer[] = this.listeners[name];
|
|
|
|
|
+ if (!observers) return;
|
|
|
|
|
+
|
|
|
|
|
+ //克隆一个新数组(暂时concat代替),然后分发事件,防止那边remove之后,[0 1] 变成 [1] 然后1号位为undefined
|
|
|
|
|
+ let tempObservers: Observer[] = observers.concat();
|
|
|
|
|
+ let length = tempObservers.length;
|
|
|
|
|
+ for (let i = 0; i < length; i++) {
|
|
|
|
|
+ let observer = tempObservers[i];
|
|
|
|
|
+ observer.notify(...args, name);
|
|
|
|
|
+ }
|
|
|
|
|
+ //置空释放
|
|
|
|
|
+ tempObservers = null;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**事件观察者类*/
|
|
|
|
|
+class Observer {
|
|
|
|
|
+
|
|
|
|
|
+ /** 回调函数 */
|
|
|
|
|
+ private callback: Function = null;
|
|
|
|
|
+ /** 上下文 */
|
|
|
|
|
+ private context: any = null;
|
|
|
|
|
+
|
|
|
|
|
+ /**构造函数 */
|
|
|
|
|
+ constructor(callback: Function, context: any) {
|
|
|
|
|
+ let self = this;
|
|
|
|
|
+ self.callback = callback;
|
|
|
|
|
+ self.context = context;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 发送通知
|
|
|
|
|
+ * @param args 不定参数
|
|
|
|
|
+ */
|
|
|
|
|
+ notify(...args: any[]): void {
|
|
|
|
|
+ let self = this;
|
|
|
|
|
+ self.callback.call(self.context, ...args);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 上下文比较
|
|
|
|
|
+ * @param context 上下文
|
|
|
|
|
+ */
|
|
|
|
|
+ compar(context: any): boolean {
|
|
|
|
|
+ return context == this.context;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**自定义事件类型 */
|
|
|
|
|
+export enum EVENT_TYPE {
|
|
|
|
|
+ LoadDone_Config = "LoadDone_Config",
|
|
|
|
|
+ Update_Gold = 'Update_Gold',
|
|
|
|
|
+}
|