【问题标题】:Best way to handle texture loading and access across multiple classes in XNA?在 XNA 中跨多个类处理纹理加载和访问的最佳方法?
【发布时间】:2011-07-14 13:34:48
【问题描述】:

所以我正在进行一个简单的 XNA 项目。基本上我的问题是如何处理纹理加载并确保可以从其他类正确访问这些纹理?

例如,我看过的每个教程,以及我从 XNA 的实际逻辑中可以看出的,都应该在 LoadContent() 方法中加载纹理。但是假设我有另一个类Level,它需要它自己独特的一组纹理,并且在其中我创建了我的Player 对象的一个​​实例,它也需要它自己的纹理,当然还有敌人和其他一切。

我可以做到的一种方法是在其构造函数中加载特定类所需的纹理,但为此我需要设置一个新的内容管理器或将内容管理器传递给每个构造函数,这似乎笨拙且超出预期。

那么当涉及到不是使用 2 个纹理的小教程的成熟项目时,实现加载它们的最佳方法是什么?

【问题讨论】:

  • 您将在 gamedev.stackexchange.com 上更快地获得答案

标签: c# xna


【解决方案1】:

根据需要创建任意数量的ContentManager 类。

每一个都是独立的。在每个内容管理器中,资源(例如:纹理)被重用 - 但是如果您在两个不同的内容管理器中加载相同的纹理,您会得到两个不同的实例(尽量避免这种情况)。

您无法卸载 (Dispose() of) ContentManager 加载的单个资源。您只能Unload() 整个内容管理器(处理它加载的所有内容)。这很可能会影响有关何时创建内容管理器的任何决定。

您可能希望为每个级别创建一个ContentManager。然后有另一个ContentManager 来处理不需要在关卡之间卸载的东西(例如:你的Player 或敌人对象需要的东西)。

传递ContentManager 的实例也没有错。

当然,对于简单的游戏,通常只使用一个ContentManager 而不用担心卸载东西是最简单的。

【讨论】:

    【解决方案2】:

    最好的解决方案是以只有需要纹理的人才能访问 ContentManager 的方式分割您的实体。

    其中一种方法是创建一个抽象基类“GameObject”,它在其构造函数中接收 Game 对象或 ContentManager 实例。

    这样可以确保这些组件中的每一个都可以访问 ContentManager。

    对此进行扩展的另一种方法是创建您自己的 ContentManager,其中包含加载内容的所有逻辑,并添加诸如在工作线程上加载、流式传输等内容。

    这确保所有逻辑仍然集中在一个地方,并且您可以扩展零售“ContentManager”以提供其他不可用的服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-31
      • 2012-10-08
      • 2015-03-29
      • 2021-05-29
      • 2014-08-31
      • 2021-12-31
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多