2011-09-06 44 views
3

我正在尋找一種方法來在運行時更新XNA中的紋理和其他內容文件,這樣如果它在應用程序之外被修改,它將在遊戲重新獲得焦點時自動更新。XNA中的實時資源更新

這似乎是可能的Texture2D和從流加載,但我無法獲得給定資源的直接路徑。

我意識到這不會與內容管道和.xnb一起使用,但爲了調試和開發目的,它將非常有用。

有沒有人見過像XNA這樣成功實現的東西?

+0

不知道你是否仍在尋找這個,但如果你是,我們有一個定製的解決方案,在大多數情況下工作。 – roundcrisis

回答

1

首先你們需要決定是採用推或拉模式。在推送模式中,更改資產的應用程序/環境需要以某種方式通知正在運行的遊戲資產已更改並需要重新加載。這可以通過一個非常簡單的消息隊列完成。

在拉模式中,遊戲會定期檢查所有遊戲資產,看它們是否已被修改,如果有,請重新加載它們。如果性能較差,這將是一個更簡單的解決方案。

更大的擔憂是您的遊戲能否在應用程序運行時正常處理重新加載資產。您可能需要實現某種加載資源的後臺線程,然後使用遊戲中的「實時」資產「交換」它們。或者,每當資產重新加載時,您的遊戲可能會暫停。在這兩種情況下,這很容易最終被的過程中最複雜的部分,這取決於你的內容管道是如何工作的目前(你可能已經有一個背景裝載機螺紋等)..

編輯迴應發表評論:

你可以使用這種方法:)

static public String FullContentDirectory(this ContentManager content) 
{ 
    var appPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 

    return System.IO.Path.Combine(appPath, content.RootDirectory); 
} 

內容文件夾的完全限定路徑現在,我覺得你的下一個問題可能是,你怎麼知道從資產名稱的文件擴展名?或者,如果資產名稱與文件名不同,該怎麼辦?

+0

目前我正在爲該窗口訂閱focusgas事件,並且只是想要更新資產以檢查其路徑,以查看自上次加載後文件是否已被修改。唯一的困難是我無法訪問xna中給定資源的完整系統路徑,這使得難以打開流)。 – GuyNoir

+0

您的意思是說您無法訪問完整的系統路徑?你有錯誤嗎? – MattDavey

+0

XNA僅使用與工作目錄相關的文件名稱來存儲和加載內容。但是,我還沒有找到使用xna 4.0訪問這個目錄路徑的方法。 – GuyNoir