我知道这个问题已经问过几次了,但是我仍然不确定如何在基于组件的引擎中实现输入处理。
我使用的基于组件的设计基于T = Machine的博客系列以及Artemis(其中实体只是id)。
实现输入处理时,我有三个主要想法:
- 输入组件将保存其感兴趣的事件。输入系统会将键和鼠标事件转换为游戏事件,并使用输入组件在实体之间循环,如果它们对事件感兴趣,则输入系统将采取适当的措施。该动作将被硬编码到输入系统。
- 没有输入组件。您可以将具有特定事件的实体注册到输入系统。输入系统然后将消息(具有实体ID和事件类型)发送给其他系统,以便它们可以采取适当的措施。或与第一种情况一样,这些动作将被硬编码到输入系统中。
- 与第一种方法类似,该组件将包含事件到函数(即
std::map<std::function>
)的映射,而不是对输入系统的动作进行硬编码,输入将调用该函数。这具有能够将同一事件耦合到不同动作的附加效果。
您会建议上述任何一种方法,还是对我实现灵活的输入处理系统有任何建议?另外,我还不熟悉多线程,但是也欢迎任何使实现线程友好的建议。
注意:我希望实现能够满足的另一个要求是,我能够将相同的输入传递给许多实体,例如,同时移动相机实体和播放器。