【问题标题】:Load all Texture2Ds in a folder将所有 Texture2D 加载到一个文件夹中
【发布时间】:2012-02-19 13:28:27
【问题描述】:

如何在我的 XNA 游戏中加载特定文件夹中的所有图像资源?纹理像正常一样位于内容项目中,但不是为我添加的每个新纹理逐行复制,而是能够自动加载它们。

【问题讨论】:

  • 您能解释一下您为什么要这样做的“原因”吗?你想达到什么目的? @icaptan 下面的答案是正确的,但如果我们了解您正在尝试做什么,则可能是您解决了错误的问题,我们可以为您指明更好的方向。
  • 我的游戏有很多按钮图像,需要一种比 Texture2D 按钮和内容更好的方法来加载它们。加载一百万次(夸张,但看着它感觉就是那样)
  • 您最好将所有这些按钮图像添加到单个图像中。这是一种更有效的图像处理方式,并且会创建更少的内容负载。但是,如果您真的打算拥有大量图像,那么@icaptan 下面给出的答案就可以了。我个人会推荐他的第一种方法。
  • 我看到很多人使用一张图片,有没有关于如何做的链接?
  • 尝试使用 Nick Gravelyn 的这款出色工具,spritesheetpacker.codeplex.com。加载所有按钮图像,它会同时输出一张包装良好的图像和一个文件,该文件可以加载到您的应用程序中,该文件通过一个键定义每个图像的位置。了解如何实现 Dictionary 并使用它将键和位置存储在游戏的静态部分中。当您需要某个按钮时,查找其键并获取您需要从中加载图像的工作表区域。有关如何与 XNA 集成的更多信息,请参见页面底部的链接。

标签: c# xna load xna-4.0 texture2d


【解决方案1】:

主要有两种方式

1st :将图像从 1 重命名为 N,以便您可以在 for 循环中加载图像,例如

List<Texture2D> images = new List<Texture2D>();
string folderPath = "MyImages/";
for(int i= 0; i<Count; i++)
{
   try
   {
        images.Add(Content.Load<Texture2D>(folderPath + i.ToString));
   }
   catch
   {
        break;
   }
}

以上代码适用于特定计数,您可以将迭代更改为 while(true) 递增 i,如果没有更多图像,catch 博客将中断。

或使用它(将静态类放在游戏项目的命名空间中,而不是在任何子命名空间文件夹下)它会起作用。如果您不想扩展您的内容而不是从函数中删除“this”)

public static class MyExtension
{
        public static List<T> LoadListContent<T>(this ContentManager contentManager, string contentFolder)
        {
            DirectoryInfo dir = new DirectoryInfo(contentManager.RootDirectory + "/" + contentFolder);
            if (!dir.Exists)
                throw new DirectoryNotFoundException();
            List<T> result = new List<T>();

            FileInfo[] files = dir.GetFiles("*.*");
            foreach (FileInfo file in files)
            {
                result.Add(contentManager.Load<T>(contentFolder + "/" + file.Name.Split('.')[0]));
            }
            return result;
        }
}

如果您的实际路径长度大于 256,则此代码有问题,该功能将不起作用。所以要小心。

【讨论】:

  • 你的第二个例子几乎是我试图做的方式(但失败了)。谢谢。但是(愚蠢的问题)我应该把那个代码放在哪里。?
  • 我假设您将它放在需要这些图像的任何类的 LoadContent 方法中。
  • 你不能在 loadcontent() 方法中插入它。如果我将其重命名为 loadcontent,它只会显示“扩展方法必须在非泛型静态类中定义”
  • 我已经更新了代码,抱歉来晚了,今天太忙了。
  • 所以我在类里面调用那个方法来做呢?
猜你喜欢
  • 2015-01-20
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多