2012-02-19 86 views
2

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

+0

你能解释为什么你要这样做的“原因”?你试图达到什么目标? @icaptan下面的答案是正确的,但如果我们明白了你想要做的到底是什么,那么你可能正在解决错误的问题,我们可以指出你朝着更好的方向发展。 – 2012-02-19 16:45:35

+0

我有很多按钮图像为我的游戏,需要一个更好的方法来加载它们比做Texture2D按钮和content.loads一百万次(夸张,但看着它感觉这种方式) – Cyral 2012-02-19 18:09:22

+0

你可能会更好的添加所有这些按钮图像转换为单个图像。这是一种更高效的图像处理方式,可以减少内容负载。但是,如果你真的设置了大量的图像,那么@icaptan下面给出的答案将工作得很好。我个人会推荐他的第一种方法。 – 2012-02-19 18:12:57

回答

3

主要有两种方式

1: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博客将会中断。

或者使用它(将静态类放在您的游戏项目的命名空间中,而不是在任何子命名空间文件夹下),它会起作用。如果你不希望延长您的内容比“这个”从功能删除)

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,该功能将无法正常工作的问题。所以要小心。

+0

你的第二个例子几乎是我尝试这样做的方式(但失败了)。谢谢。但是(愚蠢的问题)我应该在哪里放这个代码。? – Cyral 2012-02-19 18:04:31

+0

我假设你把它放在任何类需要这些图像的LoadContent方法中。 – 2012-02-19 19:23:41

+0

你不能在loadcontent()方法中插入它。如果我将它重命名为loadcontent,它只是说“扩展方法必须在非泛型静态类中定义” – Cyral 2012-02-19 20:36:23

相关问题