2011-06-23 50 views
3

我在嘗試簡化XNA紋理加載時遇到了很多麻煩。我已經放棄了從指定目錄動態加載紋理,現在我只是試圖在解決方案的內容中處理有組織的文件夾集合。我嘗試使用下面的代碼行:XNA:從子文件夾加載內容

Content.Load<Texture2D>(".\\Graphics\\Characters\\Char1"); 

「CHAR1」是正確的資產名稱,它被列在我的解決方案資源管理器中的內容存儲在「圖形\字符」,但它仍然拋出一個「文件未找到」錯誤。我在這裏做錯了什麼?

編輯:變成debug bin文件夾創建了錯誤的目錄結構:\ Graphics \ Characters \ Characters。無論如何感謝您的幫助!

+0

可以獲取給定目錄的文件列表(例如使用'System.IO.Path'),並使用該文件列表,剝離'.xn​​b'擴展名,動態加載整個資產目錄。 –

回答

1

你的工作目錄是什麼?通常它是bin \ Debug(生成的exe的位置),除非您告訴Visual Studio將您的內容文件複製到此目錄中,否則它們不在此處。

幾種途徑來解決這個問題

  1. 您可以將您的內容文件添加到Visual Studio和設置他們部署的Copy
  2. 模式可以手動將它們複製一次
  3. 您可以檢查是否當前目錄包含一個特定的文件,並且如果它不是
  4. 則上升兩個級別您可以使用常量來定義基本目錄並根據您是否正在調試來對其進行彈性化。

這裏是3

private string BaseDirectory = "."; 
if (!Directory.Exists(".\Graphics")) 
{ 
    BaseDirectory = @"..\.."; 
} 
... 
Content.Load<Texture2D>(BaseDirectory + @"\Graphics\Characters\Char1"); 

一個例子下面是4的一個例子,請注意,如果你是在釋放模式運行這個不會太順利。

#if DEBUG 
    private const string BaseDirectory = @"..\.."; 
#else 
    private const string BaseDirectory = @"."; 
#endif 
... 
Content.Load<Texture2D>(BaseDirectory + @"\Graphics\Characters\Char1"); 

還要注意的是,與@開頭的字符串不允許\逃逸,因此更容易使用定義目錄。

+0

Coincoin就修改RootDirectory提出了一個很好的觀點,這可能是傳播您的exe文件位置與內容文件位置之間區別的最佳方式。 – Guvante

2

您可以將RootDirectory屬性Content設置爲您的內容文件的根目錄位置。這將使你的路徑正常工作。

而且,不需要單點.\

4

嘗試刪除您的斜線。例如,

Content.Load<Texture2D>("Graphics\\Characters\\Char1"); 

您對這些資產使用內容項目嗎?您可以設置「內容根」目錄,並且資源全部位於相關路徑中。

看看this msdn entry,希望這可以幫助你。祝你好運。

4

從你說的話,該文件位於「內容」,你一定要做這個加載了任何事情之前:

Content.RootDirectory = "Content" 

,擺脫了一部分的「\」。