如何使用XNA加载文件夹中的所有文件?

时间:2012-10-16 11:46:02

标签: c# xna

我想使用 Content.Load(" filename")将" Content / textures" 文件夹中的所有文件加载到游戏中;

然而,我无法找到"以这种方式位于内容中的文件(程序反而看" bin / debug /../ Content / textures" ,但是在尝试加载jpg / png时出错使用Content.Load文件。

我怎样才能实现我想做的事情? 我想将Content内的文件夹中的所有文件(哪个内容文件夹是正确的?)加载到游戏中,这样我就不必指定每一个纹理。

感谢。

3 个答案:

答案 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/