我想加載文件夾中的所有文件「內容/紋理」使用Content.Load(「filename」);如何使用XNA加載文件夾中的所有文件?
但是,我不能去「找」,位於裏面的內容這樣的文件(程序,而着眼於「斌/調試/../內容/紋理」,但我得到試圖加載時出錯那裏的jpg/png文件與Content.Load。
我怎樣才能達到我想要做的? 我想加載文件夾內的所有文件(內容文件夾是正確的?)成這樣我就不必指定每一個紋理了。
謝謝。
我想加載文件夾中的所有文件「內容/紋理」使用Content.Load(「filename」);如何使用XNA加載文件夾中的所有文件?
但是,我不能去「找」,位於裏面的內容這樣的文件(程序,而着眼於「斌/調試/../內容/紋理」,但我得到試圖加載時出錯那裏的jpg/png文件與Content.Load。
我怎樣才能達到我想要做的? 我想加載文件夾內的所有文件(內容文件夾是正確的?)成這樣我就不必指定每一個紋理了。
謝謝。
使用XNA,您必須指定每個紋理,因爲您希望它們具有獨特而簡單的名稱。如果要從文件夾加載可變數量的紋理,可以使用以下示例:http://www.csharp-examples.net/get-files-from-directory/
XNA中的內容需要與內容管道一起構建。它會將您的.png
文件(依此類推)變爲.xnb
文件。這些處理後的二進制內容文件ContentManager
可以在運行時加載到Texture2D
實例中。
(請注意,您可以用Texture2D.FromStream
直接加載圖像文件 - MSDN但是它不預乘阿爾法,這是XNA的默認渲染模式使用的。)
所以首先你必須來獲取所有內容要構建的文件。 XNA內容管道使用MSBuild。在Visual Studio 中的項目文件是一個MSBuild文件。所以你需要做的就是手動編輯這個項目文件來使用通配符來構建一組文件。在this blog post有說明,這是從我剛纔問過的這個very similar question鏈接的。
在XNA中構建的內容文件僅存儲在文件系統中,相對於您的遊戲輸出目錄。因此使用Directory.GetFiles
來枚舉目錄中的.xnb
文件。然後使用它們的文件名而不使用擴展名(您可以使用Path.GetFileNameWithoutExtension
獲得)來構建一個路徑以加載它們相對於內容目錄(ContentManager.RootDirectory
)。然後,只需將您構建的路徑傳遞給Content.Load<Texture2D>
即可加載每個路徑。
(注意.xnb
文件可以包含其他的東西比紋理。所以,你應該照顧你的目錄僅包含紋理。否則,你需要捕捉的異常ContentManager.Load<Texture2D>
將拋出。)
你可以使用這個幫手上課要做到這一點。它通過獲取給定目錄並使用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;
}
}
創建一個字典來存儲紋理,而不是線Texture2D
小號
public Dictionary<string, Texture2D> spriteContent;
行後...而在你LoadContent
方法
spriteContent = TextureContent.LoadListContent<Texture2D>(content, "textures");
調用方法現在,每當你從它需要一個紋理,只是做:
Whatever.Image = spriteContent["WhateverTexture"]
確保TextureName
是你的紋理的資產名稱。