FieldEventDispatcher.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace YLBattle
  6. {
  7. /// <summary>
  8. /// 战场事件处理中心
  9. /// </summary>
  10. public class FieldEventDispatcher : IEventDispatcher
  11. {
  12. /// <summary>
  13. /// 上下文环境信息
  14. /// </summary>
  15. private BattleParam env = null;
  16. /// <summary>
  17. /// 事件队列
  18. /// </summary>
  19. private Queue<FieldEvent> mFieldEventQueue = new Queue<FieldEvent>();
  20. /// <summary>
  21. /// 事件处理器映射表
  22. /// </summary>
  23. private Dictionary<EFieldEventType, Action<FieldEvent>> mHandle = new Dictionary<EFieldEventType, Action<FieldEvent>>();
  24. /// <summary>
  25. /// 事件ID生成器
  26. /// </summary>
  27. private int mEventIDGenerator = 0;
  28. /// <summary>
  29. /// 对象事件
  30. /// </summary>
  31. private BattleFighterEventHandler warriorEventHandle = new BattleFighterEventHandler();
  32. /// <summary>
  33. /// 初始化
  34. /// </summary>
  35. /// <param name="env">环境信息</param>
  36. public void Initialize(BattleParam env)
  37. {
  38. this.env = env;
  39. this.mFieldEventQueue.Clear();
  40. this.mHandle.Clear();
  41. this.mEventIDGenerator = 0;
  42. this.warriorEventHandle.Initialize(env);
  43. }
  44. /// <summary>
  45. /// 事件投递
  46. /// </summary>
  47. /// <param name="ev">事件信息</param>
  48. public void PostEvent(FieldEvent ev)
  49. {
  50. if (ev == null)
  51. {
  52. return;
  53. }
  54. this.mFieldEventQueue.Enqueue(ev);
  55. }
  56. /// <summary>
  57. /// 创建事件对象
  58. /// </summary>
  59. /// <param name="type">事件类型</param>
  60. /// <returns>事件对象</returns>
  61. public FieldEvent MakeEvent(EFieldEventType type)
  62. {
  63. FieldEvent fe = new FieldEvent();
  64. fe.id = ++this.mEventIDGenerator;
  65. fe.type = type;
  66. fe.ts = DateTime.Now.ToFileTimeUtc();
  67. return fe;
  68. }
  69. /// <summary>
  70. /// 事件处理注册
  71. /// </summary>
  72. /// <param name="type">事件类型</param>
  73. /// <param name="handle">事件处理器</param>
  74. public void RegisterEventHandle(EFieldEventType type, Action<FieldEvent> handle)
  75. {
  76. if (this.mHandle.ContainsKey(type))
  77. {
  78. this.env.DebugHelper().Warning("事件重复注册,编号:" + type.ToString());
  79. return;
  80. }
  81. //this.env.DebugHelper().Error(type.ToString());
  82. this.mHandle.Add(type, handle);
  83. }
  84. /// <summary>
  85. /// 查询事件处理器
  86. /// </summary>
  87. /// <param name="type">事件类型</param>
  88. /// <returns>处理器</returns>
  89. private Action<FieldEvent> FindEventHandle(EFieldEventType type)
  90. {
  91. if (this.mHandle.ContainsKey(type))
  92. {
  93. return this.mHandle[type];
  94. }
  95. return null;
  96. }
  97. /// <summary>
  98. /// 调度战场事件
  99. /// </summary>
  100. /// <param name="now">当前逻辑时间</param>
  101. public void OnUpdateFieldEvent(long now)
  102. {
  103. if (0 == this.mFieldEventQueue.Count)
  104. {
  105. return;
  106. }
  107. FieldEvent ev = null;
  108. Action<FieldEvent> handler = null;
  109. while (this.mFieldEventQueue.Count > 0)
  110. {
  111. ev = this.mFieldEventQueue.Dequeue();
  112. handler = this.FindEventHandle(ev.type);
  113. if (null == handler)
  114. {
  115. this.env.DebugHelper().Warning("未知战斗事件:" + ev.type.ToString());
  116. continue;
  117. }
  118. handler.Invoke(ev);
  119. }
  120. }
  121. }
  122. }