如何表示事件驱动通信中的事件数据?
-
12-12-2019 - |
题
我正在尝试使用类的观察者模式为我的小型RPG项目创建一个中央事件调度系统,我需要有关如何最佳表示事件数据的建议。
我将拥有一个eventManager,用于在静态枚举中定义的不同事件类型注册侦听器类,例如event_input_key_key或event_game_actormoved。它将将事件存储在队列中并将它们调度到相应的侦听器,每个侦听器将每个都有一个方法处理器(事件e)或其他东西。
每个事件都是类型事件的对象,其包含诸如其事件类型的数据。 我的问题是,由于事件数据的性质不同于事件类型之间的性质,因此该数据应该如何表示?我还不确定我将来想要创建的一切事件,所以我希望这可以尽可能灵活。例如,如果某些条件为真,则事件可能会触发其他事件(即,当播放器按下动作键时,如果播放器处于某个位置并具有键),则会打开门。 XML或脚本是一个不错的选择吗?另一种方式我可以想到的是为每一个常规事件创建一个自定义类,如ACTOREVENT或MENUEVENT,但似乎真的效率低下和不灵活。 此外,由于某些特性诸如字符的某些对象仅需要了解非常特定的事件,因为当按下“W”键时,我认为当按下其他键时,我不需要通知它们。创建特定或有更好的方法的事件类型是否可行? IE。 event_input_keyPresse_w
感谢
解决方案
- 创建事件的具体实现,从
Event
基础对象扩展。首先,将对象分发 - 即在您的队列中,您将只需要执行一个生成的,以确定如何处理对象。 - 您的活动侦听器代码更简单,更严格控制。没有机会将鼠标事件倒入关键事件。此外,您不需要在侦听器级别中测试并投用事件对象
- 我看不出为什么你无法创建一个“过滤的”事件侦听器,它只会想要被通知特定事件的特定条件,实际上我认为这是一个整洁的想法。
- 我可能会设计某种可插拔的调度机制。这意味着当您添加新事件类型时,您无需更新队列,您只需注册新的调度程序即可。根据您可能想要实现的内容,您的队列将事件传递给调度程序(为调度程序提供一些方法来获取侦听器的方法)。调度员将确定它是否知道如何处理事件。调度员将把事件分配给所需的侦听器(并且根据您想要实现的内容),返回结果说明如果事件已发送或不派出。
那是mho
其他提示
-
如您所说,不同事件类型的结构不同,更好地为每个事件创建具体类。您无需为每个键创建一个类!但一般键盘事件
- 您说字符只应通知特定密钥。我不知道通知角色的开销是什么,让对象忽略不相关的键,但如果这是类之间的常见模式,例如,您有10个不同的类可能对一组特殊的键反应,这将是不错的不要重复代码并在事件和侦听器之间实现调度程序层。一种禁用者可以是基于此接收键列表和过滤器事件列表的keyfilterdispatcher。如果以特定顺序考虑多个事件,则另一种调度员可以是SEQDISPATCHER,只有在特定顺序中考虑多个事件! 我喜欢这个疯狂的残疾人想法Madprorammer说。你也可能想要制作调度员的管道!
不隶属于 StackOverflow