EventSystem.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /**
  2. * 游戏事件管理类
  3. * @author 冯聪
  4. */
  5. export default class EventSystem {
  6. /** 监听数组 */
  7. private listeners: { [key: string]: Observer[] } = {};
  8. /**
  9. * 注册事件
  10. * @param name 事件名称
  11. * @param callback 回调函数
  12. * @param target 目标脚本(this)
  13. */
  14. public register(name: string, callback: Function, target: any) {
  15. //如果没有该事件
  16. if (!this.listeners[name]) {
  17. this.listeners[name] = [];
  18. }
  19. let observers: Observer[] = this.listeners[name];
  20. let length = observers.length;
  21. for (let i = 0; i < length; i++) {
  22. let observer = observers[i];
  23. if (observer.compare(target)) {
  24. console.warn("[EventMgr]重复添加监听,请检查事件:", name)
  25. return;
  26. }
  27. }
  28. this.listeners[name].push(new Observer(callback, target));
  29. }
  30. /**
  31. * 移除事件
  32. * @param name 事件名称
  33. * @param target 目标脚本(this)
  34. */
  35. public remove(name: string, target: any) {
  36. let observers: Observer[] = this.listeners[name];
  37. if (!observers) return;
  38. let length = observers.length;
  39. for (let i = 0; i < length; i++) {
  40. let observer = observers[i];
  41. if (observer.compare(target)) {
  42. observers.splice(i, 1);
  43. break;
  44. }
  45. }
  46. if (observers.length == 0) {
  47. delete this.listeners[name];
  48. }
  49. }
  50. /**
  51. * 发送事件
  52. * @param name 事件名称
  53. */
  54. public emit(name: string, ...args: any[]) {
  55. let observers: Observer[] = this.listeners[name];
  56. if (!observers) return;
  57. //克隆一个新数组(暂时concat代替),然后分发事件,防止那边remove之后,[0 1] 变成 [1] 然后1号位为undefined
  58. let tempObservers: Observer[] = observers.concat();
  59. let length = tempObservers.length;
  60. for (let i = 0; i < length; i++) {
  61. let observer = tempObservers[i];
  62. observer.notify(...args);
  63. }
  64. //置空释放
  65. tempObservers = null;
  66. }
  67. }
  68. /**事件观察者类*/
  69. class Observer {
  70. /** 回调函数 */
  71. private callback: Function = null;
  72. /** 目标脚本 */
  73. private target: any = null;
  74. /** 构造函数 */
  75. constructor(callback: Function, target: any) {
  76. let self = this;
  77. self.callback = callback;
  78. self.target = target;
  79. }
  80. /**
  81. * 执行回调函数
  82. * @param args 不定参数
  83. */
  84. notify(...args: any[]): void {
  85. let self = this;
  86. self.callback.call(self.target, ...args);
  87. }
  88. /**
  89. * 脚本比较
  90. * @param target 绑定的对象脚本
  91. */
  92. compare(target: any): boolean {
  93. return target == this.target;
  94. }
  95. }