我怎样才能很好地给我的游戏对象的鼠标位置?

我在SFML中制作了一个基本的Asteroids游戏,并且我希望玩家总是看着鼠标。 我有一个LookAt(x,y)函数,但是我不确定如何从播放器的Update()方法获得鼠标位置!

我看到几个可能的解决scheme:

理想情况下,我想要包含玩家的行为。 我并不觉得在玩家类之外创建新的属性,函数或callback只是为了让玩家可以访问两个整数。 最后的解决scheme(使InputManager静态)看起来很整洁(特别是因为它只需要在Player类中新增一行代码,并且不需要播放器保存新的属性),但是我听说使用单身是一种“反模式”,应该避免!

这听起来像你想看看组件devise模式。 这个链接的解释比我所能做的要好得多,但是为了确保这个答案在链接永远不会死的时候是无用的,我会尽量总结一下。

使用组件模式意味着一个实体(您的播放器)可以与您的引擎中的其他系统(input管理器)进行交互,而无需真正了解对方。 这给了你一个整洁的解耦系统,你可以稍后交换input组件,而不必更改玩家实体,或者如果你想在游戏中拥有敌方船只,你可以使用已经为玩家创建的类,只需切换从键盘/鼠标input控制组件到AI。

当然,有多种方法可以做到这一点 – 我最喜欢的方法是让每个实体都有一个它在每次更新时迭代的组件列表,并让这些组件决定实体发生了什么。 在上面的链接中,这很好地总结为:

一个实体跨越多个域。 为了保持域隔离,每个域的代码都放在它自己的组件类中。 实体被简化为一个简单的组件容器。

在你的情况下,我会说专业人士会看起来整洁,可扩展,以及如果你做更多的组件,如物理/声音/等,而且缺点会是很多新的代码,如果你不'计划用它做更多的事情。 如果你只是想要一个快速和肮脏的解决scheme,我会去使input管理器单身,只是每天调用它。