我想使用 Content.Load(" filename")将" Content / textures" 文件夹中的所有文件加载到游戏中;
然而,我无法找到"以这种方式位于内容中的文件(程序反而看" bin / debug /../ Content / textures" ,但是在尝试加载jpg / png时出错使用Content.Load文件。
我怎样才能实现我想做的事情? 我想将Content内的文件夹中的所有文件(哪个内容文件夹是正确的?)加载到游戏中,这样我就不必指定每一个纹理。
感谢。
答案 0 :(得分:8)
您可以使用此帮助程序类来执行此操作。它的工作原理是获取给定目录并使用GetFiles()
方法创建需要加载的所有纹理的列表。然后使用ContentManager
正常加载它们,并将它们放入字典中以便您可以使用它们。
public static class TextureContent
{
public static Dictionary<string, T> LoadListContent<T>(this ContentManager contentManager, string contentFolder)
{
DirectoryInfo dir = new DirectoryInfo(contentManager.RootDirectory + "/" + contentFolder);
if (!dir.Exists)
throw new DirectoryNotFoundException();
Dictionary<String, T> result = new Dictionary<String, T>();
FileInfo[] files = dir.GetFiles("*.*");
foreach (FileInfo file in files)
{
string key = Path.GetFileNameWithoutExtension(file.Name);
result[key] = contentManager.Load<T>(contentFolder + "/" + key);
}
return result;
}
}
创建一个字典来存储纹理,而不是一行一行Texture2D
s
public Dictionary<string, Texture2D> spriteContent;
...并在LoadContent
方法
spriteContent = TextureContent.LoadListContent<Texture2D>(content, "textures");
现在无论何时需要纹理,只需执行:
Whatever.Image = spriteContent["WhateverTexture"]
确保TextureName
是纹理的资产名称。
答案 1 :(得分:1)
XNA中的内容需要使用内容管道构建。它会将您的.png
文件(等等)转换为.xnb
个文件。这些是经处理的二进制内容文件,ContentManager
可以在运行时加载到Texture2D
个实例中。
(请注意,您可以使用Texture2D.FromStream
- MSDN直接加载图片文件。但是它不会预乘alpha,这是XNA默认渲染模式使用的。)
首先,您必须构建所有内容文件。 XNA内容管道使用MSBuild。 Visual Studio 中的项目文件是 MSBuild文件。因此,您需要做的是手动编辑该项目文件以使用通配符构建一组文件。 this blog post中有说明,这些说明与我前一段时间提出的very similar question相关联。
XNA中构建的内容文件只是存储在文件系统中,相对于游戏的输出目录。因此,使用Directory.GetFiles
枚举目录中的.xnb
文件。然后构建一个路径来相对于内容目录(ContentManager.RootDirectory
)加载它们,使用没有扩展名的文件名(可以使用Path.GetFileNameWithoutExtension
获得)。然后,只需将构建的路径传递给Content.Load<Texture2D>
即可加载每个路径。
(请注意,.xnb
文件可以包含除纹理之外的其他内容。因此,您应该注意您的目录只包含纹理。否则您需要捕获ContentManager.Load<Texture2D>
将抛出的异常。)
答案 2 :(得分:0)
使用XNA,您必须指定每个纹理,因为您希望它们具有唯一且简单的名称。如果要从文件夹加载可变数量的纹理,可以使用以下示例:http://www.csharp-examples.net/get-files-from-directory/