2012-02-19 61 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

相關問題