6

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

但是,我无法以这种方式“找到”位于 Content 内的文件(程序宁愿查看“bin/debug/../Content/textures”,但是在尝试在那里加载 jpg/png 文件时出现错误内容加载。

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

谢谢。

4

3 回答 3

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;
        }
    }

创建一个字典来存储纹理,而不是一行一行的Texture2Ds

  public Dictionary<string, Texture2D> spriteContent;

...并在您的方法中调用该LoadContent方法

 spriteContent = TextureContent.LoadListContent<Texture2D>(content, "textures");

现在,每当您需要其中的纹理时,只需执行以下操作:

Whatever.Image = spriteContent["WhateverTexture"]

确保TextureName是纹理的资产名称。

于 2012-10-16T12:33:39.463 回答
2

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>将抛出的异常。)

于 2012-10-16T12:21:32.327 回答
0

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/

于 2012-10-16T11:52:43.757 回答