我正在制作一个 xna 游戏,并且会有很多类控制绘图和更新等。
这些类需要能够访问原始 Game1 类的实例,以便它们可以控制图形设备和精灵批处理等。
问题是我将拥有一个类网络,这些类调用其他类,并且链最底部的类仍然需要能够访问图形设备等的 Game1 类。
做这个的最好方式是什么?只是继续传递 Game1 作为参数,还是什么?
从软件工程/架构的角度来看,“正确”的答案是将您需要的特定资源作为参数传递给您的方法。这提供了许多优点——其中最大的优点可能是它解耦了代码的各个部分,允许它们彼此独立使用。
给你举个例子:你可能有你的游戏。但是你可能想要使用相同的代码并制作一个编辑器,或单元测试,或任何其他疯狂的工具。在许多情况下,您甚至可能没有Game
课程。(给你一个具体的例子,我的这个视频向你展示了运行相同游戏代码的两种截然不同的方式——如果没有适当的解耦,这是不可能的。)
(在此基础上,您可能应该传递比从 . 派生的类更具体的东西Game
。)
如果您有相当开放的版本控制/依赖性要求,您可以更进一步,并传递一个IServiceProvider
(例如,这是 XNA 传递给 的构造函数的内容ContentManager
)。我详细分析了为什么您可能会在这个答案中这样做。
然而
您不是在编写将被第三方使用的库。你正在写一个游戏。唯一会使用您的代码的人是您自己的团队 - 您可以访问源代码并且可以自由修改它。
这意味着您可以自由地走一些捷径。
在实践中,通常可以获取游戏类的静态实例,或者(当我将一些东西放在一起时,这是我的首选方法)游戏类的静态属性。在 XNA 中,您知道在实践中您将永远只有一个游戏类实例。
首先,这样做既快速又容易。以后也可以快速轻松地切换到“正确”的方式做事。只要你准备好了。良好的版本控制和在 Visual Studio 中使用“查找所有引用”在这里特别有用。
基本上:只要您了解自己正在走捷径,为什么要走捷径,以及“正确”的方式是什么——那么走捷径就可以了。
为什么不在game1的某个地方保留一个静态引用,而一切都指向它?