EventSystem.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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 callback 回调函数
  34. * @param target 目标脚本(this)
  35. */
  36. public remove(name: string, callback: Function, target: any) {
  37. let observers: Observer[] = this.listeners[name];
  38. if (!observers) return;
  39. let length = observers.length;
  40. for (let i = 0; i < length; i++) {
  41. let observer = observers[i];
  42. if (observer.compare(target)) {
  43. observers.splice(i, 1);
  44. break;
  45. }
  46. }
  47. if (observers.length == 0) {
  48. delete this.listeners[name];
  49. }
  50. }
  51. /**
  52. * 发送事件
  53. * @param name 事件名称
  54. */
  55. public emit(name: string, ...args: any[]) {
  56. let observers: Observer[] = this.listeners[name];
  57. if (!observers) return;
  58. //克隆一个新数组(暂时concat代替),然后分发事件,防止那边remove之后,[0 1] 变成 [1] 然后1号位为undefined
  59. let tempObservers: Observer[] = observers.concat();
  60. let length = tempObservers.length;
  61. for (let i = 0; i < length; i++) {
  62. let observer = tempObservers[i];
  63. observer.notify(...args, name);
  64. }
  65. //置空释放
  66. tempObservers = null;
  67. }
  68. }
  69. /**事件观察者类*/
  70. class Observer {
  71. /** 回调函数 */
  72. private callback: Function = null;
  73. /** 目标脚本 */
  74. private target: any = null;
  75. /** 构造函数 */
  76. constructor(callback: Function, target: any) {
  77. let self = this;
  78. self.callback = callback;
  79. self.target = target;
  80. }
  81. /**
  82. * 发送通知
  83. * @param args 不定参数
  84. */
  85. notify(...args: any[]): void {
  86. let self = this;
  87. self.callback.call(self.target, ...args);
  88. }
  89. /**
  90. * 脚本比较
  91. * @param target 绑定的对象脚本
  92. */
  93. compare(target: any): boolean {
  94. return target == this.target;
  95. }
  96. }