2011-06-23 81 views
3

我在尝试简化XNA纹理加载时遇到了很多麻烦。我已经放弃了从指定目录动态加载纹理,现在我只是试图在解决方案的内容中处理有组织的文件夹集合。我尝试使用下面的代码行:XNA:从子文件夹加载内容

Content.Load<Texture2D>(".\\Graphics\\Characters\\Char1"); 

“CHAR1”是正确的资产名称,它被列在我的解决方案资源管理器中的内容存储在“图形\字符”,但它仍然抛出一个“文件未找到”错误。我在这里做错了什么?

编辑:变成debug bin文件夹创建了错误的目录结构:\ Graphics \ Characters \ Characters。无论如何感谢您的帮助!

+0

可以获取给定目录的文件列表(例如使用'System.IO.Path'),并使用该文件列表,剥离'.xn​​b'扩展名,动态加载整个资产目录。 –

回答

1

你的工作目录是什么?通常它是bin \ Debug(生成的exe的位置),除非您告诉Visual Studio将您的内容文件复制到此目录中,否则它们不在此处。

几种途径来解决这个问题

  1. 您可以将您的内容文件添加到Visual Studio和设置他们部署的Copy
  2. 模式可以手动将它们复制一次
  3. 您可以检查是否当前目录包含一个特定的文件,并且如果它不是
  4. 则上升两个级别您可以使用常量来定义基本目录并根据您是否正在调试来对其进行弹性化。

这里是3

private string BaseDirectory = "."; 
if (!Directory.Exists(".\Graphics")) 
{ 
    BaseDirectory = @"..\.."; 
} 
... 
Content.Load<Texture2D>(BaseDirectory + @"\Graphics\Characters\Char1"); 

一个例子下面是4的一个例子,请注意,如果你是在释放模式运行这个不会太顺利。

#if DEBUG 
    private const string BaseDirectory = @"..\.."; 
#else 
    private const string BaseDirectory = @"."; 
#endif 
... 
Content.Load<Texture2D>(BaseDirectory + @"\Graphics\Characters\Char1"); 

还要注意的是,与@开头的字符串不允许\逃逸,因此更容易使用定义目录。

+0

Coincoin就修改RootDirectory提出了一个很好的观点,这可能是传播您的exe文件位置与内容文件位置之间区别的最佳方式。 – Guvante

2

您可以将RootDirectory属性Content设置为您的内容文件的根目录位置。这将使你的路径正常工作。

而且,不需要单点.\

4

尝试删除您的斜线。例如,

Content.Load<Texture2D>("Graphics\\Characters\\Char1"); 

您对这些资产使用内容项目吗?您可以设置“内容根”目录,并且资源全部位于相关路径中。

看看this msdn entry,希望这可以帮助你。祝你好运。

4

从你说的话,该文件位于“内容”,你一定要做这个加载了任何事情之前:

Content.RootDirectory = "Content" 

,摆脱了一部分的“\”。