1

我正在尝试为我的小型 RPG 项目使用某种观察者模式创建一个中央事件调度系统,我需要有关如何最好地表示事件数据的建议。

我将有一个 EventManager,它为静态枚举中定义的不同事件类型注册侦听器类,例如 Event_Input_KeyPressed 或 Event_Game_ActorMoved。它将事件存储在一个队列中并将它们分派给相应的侦听器,每个侦听器都有一个方法 handleEvent(Event e) 或其他东西。

每个事件都将是 Event 类型的对象,其中包含诸如其事件类型之类的数据。

我的问题是,由于事件数据的性质在事件类型之间存在很大差异,应该如何表示这些数据?我还不确定我将来要创建什么类型的事件,所以我希望它尽可能灵活。例如,如果某些条件为真,一个事件可能会触发其他事件(即当玩家按下操作键时,如果玩家在某个位置并且有钥匙,则门会打开)。XML 或脚本是一个不错的选择吗?我能想到的另一种方法是为每个常规事件创建一个自定义类,例如 ActorEvent 或 MenuEvent,但这似乎效率低下且不灵活。此外,由于某些对象(例如 Character)只需要知道非常具体的事件,例如按下“w”键时,我认为当其他键(例如“h”)时不需要通知它们 被按下。创建特定的事件类型是否可行或有更好的方法?IE。Event_Input_KeyPressed_W

谢谢

4

2 回答 2

2
  • 正如您所说,不同事件类型的结构不同,最好为每个事件创建具体的类。您不需要为每个键创建一个类!但通常是键盘事件
  • 你说字符应该只被通知特定的键。我不知道通知角色并让该对象忽略不相关的键的开销是多少,但如果这是类之间的常见模式,例如您有 10 个不同的类可能会对一组特殊的键做出反应,那就太好了不重复代码并在事件和侦听器之间实现调度程序层。一种调度程序可以是 KeyFilterDispatcher,它接收键列表并基于该列表过滤事件。另一种调度程序可以是 seqDispatcher,它仅在以特定顺序考虑多个事件时才干扰侦听器!我喜欢 MadProrammer 所说的可插拔调度程序的想法。此外,您可能还想创建调度程序管道!
于 2012-07-27T02:16:53.643 回答
2
  1. 创建事件的具体实现,从Event基础对象扩展。首先,分发对象会更容易——即在您的队列中,您只需要instanceof确定如何处理对象。
  2. 您的事件侦听器代码变得更加简单和更严格的控制。鼠标事件不可能超过键事件。此外,您无需在侦听器级别测试和强制转换事件对象
  3. 我不明白为什么你不能创建一个“过滤”的事件监听器,它只想被通知特定事件的特定条件,事实上,我认为这是一个好主意。
  4. 我可能会设计某种可插入的调度机制。这意味着当你添加一个新的事件类型时,你不需要更新队列,你可以简单地注册一个新的调度器。根据您可能想要实现的目标,您的队列会将事件传递给调度程序(为调度程序提供一些获取侦听器列表的方法)。调度程序将确定它是否知道如何处理事件。然后分派器将事件分派给所需的侦听器(并取决于您想要实现的目标),返回一个结果,说明事件是否已分派。

那是MHO

于 2012-07-26T22:55:14.357 回答