我想使用Content.Load("filename");将文件夹“Content/textures”中的所有文件加载到游戏中;
但是,我无法以这种方式“找到”位于 Content 内的文件(程序宁愿查看“bin/debug/../Content/textures”,但是在尝试在那里加载 jpg/png 文件时出现错误内容加载。
我怎样才能实现我想要做的事情?我想将 Content 内的一个文件夹中的所有文件(哪个内容文件夹是正确的?)加载到游戏中,这样我就不必指定每个纹理。
谢谢。
您可以使用此帮助程序类来执行此操作。它通过获取给定目录并使用该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
是纹理的资产名称。
XNA 中的内容需要使用内容管道构建。它将您的.png
文件(等等)转换为.xnb
文件。这些是经过处理的二进制内容文件,ContentManager
可以在运行时加载到Texture2D
实例中。
(请注意,您可以使用Texture2D.FromStream
- MSDN直接加载图像文件。但是它不会预乘 alpha,这是 XNA 的默认渲染模式使用的。)
所以首先你必须得到你所有的内容文件来构建。XNA 内容管道使用 MSBuild。Visual Studio 中的项目文件是一个 MSBuild 文件。因此,您需要做的是手动编辑该项目文件以使用通配符构建一组文件。这篇博文中有一些说明,它链接自我很久以前问过的这个非常相似的问题。
XNA 中构建的内容文件只是存储在文件系统中,相对于游戏的输出目录。所以Directory.GetFiles
用来枚举.xnb
目录下的文件。然后构造一个相对于内容目录 ( ContentManager.RootDirectory
) 的加载路径,使用不带扩展名的文件名(您可以使用 获取Path.GetFileNameWithoutExtension
)。然后,只需将您构建的路径传递Content.Load<Texture2D>
给加载每个路径。
(请注意,.xnb
文件可以包含纹理以外的东西。所以你应该注意你的目录只包含纹理。否则你需要捕获ContentManager.Load<Texture2D>
将抛出的异常。)
With XNA, you have to specify each and every texture, because you want them to have a unique and easy name. if you want to load a variable amount of textures from a folder, you could use this example: http://www.csharp-examples.net/get-files-from-directory/