c# - 如何创建用于访问 XNA 内容项目中文件的强类型结构?

标签 c# xna xna-4.0 strong-typing

前言:
我正在使用 XNA Content 项目来保存我在开发游戏时使用的所有各种纹理(可能还有其他资源)。

从 Content 项目加载图像到 XNA 纹理对象的默认方法涉及使用硬编码字符串文字来指向各种文件。

我想自动将内容项目中的目录/文件树投影到对象层次结构中,以避免直接使用字符串文字,并获得使用强类型对象的好处。


示例:
而不是使用
Texture2D tex = Content.Load("Textures/defaultTexture32");
我更愿意
Texture2D tex = Content.Load(Content.Textures.defaultTexture32);


问题:
这个问题是否已经存在解决方案? (我用谷歌找不到任何东西)


额外的细节:
我相当确定这可以通过 T4 模板完成;可能与 DTE 工具结合使用。我已经初步尝试这样做,但由于我对这两种工具集都缺乏经验,我一直遇到障碍,但我过去曾使用过 T4MVC,它做了类似的事情;不幸的是,它投影的是类结构而不是文件系统,并且不容易适应。

我不需要使用 T4 或 DTE 的解决方案,它们看起来好像很可能是解决方案的一部分。

最好只包含属于 VS 项目的文件(而不是整个磁盘文件系统),但不是必需的。

按文件类型等进行额外过滤的能力将是一项额外的特殊奖励。

对于没有立即看到这样做的好处的任何人;考虑如果您重命名或删除该文件会发生什么。该应用程序将继续正常编译,但会在运行时崩溃。也许直到满足一组非常特殊的情况才能访问某个文件。如果所有文件名都投影到一个对象结构中(每次构建项目时重新生成,甚至可能每次修改时重新生成),那么您将得到编译时错误,指出缺少的资源,并可能避免很多 future 疼痛。

感谢您的宝贵时间。

最佳答案

这是一个 T4 模板,它将从您的项目目录中读取“Textures”文件夹中的所有文件。然后它们将作为字符串写入一个类,如果您希望限制文件搜索,您只需更改 Directory.GetFiles() 即可。

添加/删除文件后,您可以在解决方案资源管理器中单击“转换所有模板”以生成新类。

希望这对您有所帮助!

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ import namespace="System.IO" #>
<# var files = Directory.GetFiles(Host.ResolvePath("Textures"), "*.*"); #>
namespace Content
{
    class Textures
    {
<#      foreach (string fileName in files) { #>
        public const string <#= Path.GetFileNameWithoutExtension(fileName) #> = @"Textures/<#= Path.GetFileNameWithoutExtension(fileName) #>";
<#      } #>
    }
}

关于c# - 如何创建用于访问 XNA 内容项目中文件的强类型结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7058714/

相关文章:

c# - 我应该使用 HttpRuntime.Cache 吗?

c# - 有没有办法在 XNA 中锁定 VertexBuffers?

c# - 最佳二维碰撞检测

c# - xna 4.0 和加载图像失败

c# - 在 XNA 中模拟重力

c# - 如何使用 LINQ 将泛型序列转换为三角形?

c# - 我如何找到从 C# 类方法调用的方法 - 而不是在运行时

c# - 使用 C# 时我的属性出现问题

c# - XNA Tile 映射平台游戏?

c# - 从图像动态创建 XNA Sprite