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

我将拥有一个eventManager,用于在静态枚举中定义的不同事件类型注册侦听器类,例如event_input_key_key或event_game_actormoved。它将将事件存储在队列中并将它们调度到相应的侦听器,每个侦听器将每个都有一个方法处理器(事件e)或其他东西。

每个事件都是类型事件的对象,其包含诸如其事件类型的数据。 我的问题是,由于事件数据的性质不同于事件类型之间的性质,因此该数据应该如何表示?我还不确定我将来想要创建的一切事件,所以我希望这可以尽可能灵活。例如,如果某些条件为真,则事件可能会触发其他事件(即,当播放器按下动作键时,如果播放器处于某个位置并具有键),则会打开门。 XML或脚本是一个不错的选择吗?另一种方式我可以想到的是为每一个常规事件创建一个自定义类,如ACTOREVENT或MENUEVENT,但似乎真的效率低下和不灵活。 此外,由于某些特性诸如字符的某些对象仅需要了解非常特定的事件,因为当按下“W”键时,我认为当按下其他键时,我不需要通知它们。创建特定或有更好的方法的事件类型是否可行? IE。 event_input_keyPresse_w

感谢

有帮助吗?

解决方案

  1. 创建事件的具体实现,从Event基础对象扩展。首先,将对象分发 - 即在您的队列中,您将只需要执行一个生成的,以确定如何处理对象。
  2. 您的活动侦听器代码更简单,更严格控制。没有机会将鼠标事件倒入关键事件。此外,您不需要在侦听器级别中测试并投用事件对象
  3. 我看不出为什么你无法创建一个“过滤的”事件侦听器,它只会想要被通知特定事件的特定条件,实际上我认为这是一个整洁的想法。
  4. 我可能会设计某种可插拔的调度机制。这意味着当您添加新事件类型时,您无需更新队列,您只需注册新的调度程序即可。根据您可能想要实现的内容,您的队列将事件传递给调度程序(为调度程序提供一些方法来获取侦听器的方法)。调度员将确定它是否知道如何处理事件。调度员将把事件分配给所需的侦听器(并且根据您想要实现的内容),返回结果说明如果事件已发送或不派出。

    那是mho

其他提示

    如您所说,不同事件类型的结构不同,更好地为每个事件创建具体类。您无需为每个键创建一个类!但一般键盘事件
  • 您说字符只应通知特定密钥。我不知道通知角色的开销是什么,让对象忽略不相关的键,但如果这是类之间的常见模式,例如,您有10个不同的类可能对一组特殊的键反应,这将是不错的不要重复代码并在事件和侦听器之间实现调度程序层。一种禁用者可以是基于此接收键列表和过滤器事件列表的keyfilterdispatcher。如果以特定顺序考虑多个事件,则另一种调度员可以是SEQDISPATCHER,只有在特定顺序中考虑多个事件! 我喜欢这个疯狂的残疾人想法Madprorammer说。你也可能想要制作调度员的管道!
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top