2010-06-17 69 views
2

我正在將iphone遊戲移植到windows phone 7上。iphone與Winmo7的工作方式相當類似,因爲您可以將想要讀取的所有文件添加到項目中。我們不希望在資產創建管道中執行額外的步驟,所以我們只是將所有文件都放入我們自己的基本文件存檔中,然後將一個存檔文件添加到項目中。然後我們有一個資產建立過程,導出所有資產,然後從它們創建這個存檔。你如何在windows phone 7中加載文件?使用XNA

在winmo7它讓我吃驚,你不能只是做同樣的事情。據我所知,加載數據的唯一方法是通過內容管道。我們通過簡單地製作一個僅將所有文件轉換爲byte []並將它們以字節數組形式導出的contentImporter來解決此問題,然後您可以直接加載它們,直接訪問文件中的所有字節。不幸的是,與C++不同的是,你只需將結構體內存到結構中(因爲文件已經以結構的格式存儲),c#似乎需要一個更加手動的方法,在這裏你使用諸如BitConverter的東西來加載所有的數據到結構和類中來自字節數組。

事情是,我們想要使用我們已經存在的資產導出流程來處理紋理和網格物體,如果我們已經設置了用於確定每個紋理應該使用的確切像素格式的東西。所以在這些情況下,我們不想使用默認的紋理和網格內容導入器。我們嘗試通過簡單地使Texture2D返回一個Texture2D來創建Texture ContentImporter,但爲了創建Texture2D,您需要一個圖形設備。

第二個問題是必須將每項資產添加到項目中的過程。我們決定我們不想像我們爲iphone一樣加載dataArchive,因爲我們想爲某些數據(如聲音)使用默認的ContentImporters。但是我們解決了這個問題,只需將一個帶有根數據目錄的文本文件添加到項目中,然後創建一個ContentImporter來遍歷該目錄結構,並在那裏調用「context.BuildAsset」 。

所以總結一下,我們有一個資產和ContentImporter,它自動處理數據目錄中所有資產的導入,從而解決了必須手動將它們添加到項目中的問題。其中一些資產將通過默認的ContentImporters(如聲音和音樂,以及xmls)導向,而其他資源只能以byte []形式導入並手動加載,因爲我們已經擁有了我們所需格式的資產。在這些資產的情況下,如果我們可以在自定義ContentImporters內​​部手動執行'字節[] - >加載' - 離線 - 但是我們嘗試的第一個 - Texture - 將是一件好事 - 紋理 - 它需要圖形設備來創建本機Textue2D結構,我們無法在ContentImporter框架中找到它。

有沒有想法?指針?或者這是做最好的最好方式?我想另一種選擇是將所有資源轉換爲默認紋理和網格處理器可以接受的格式,並將參數與每個參數一起使用(所以我們有一個手工製作的565紋理,將其轉換回888 tga,然後通過默認紋理管道發送,並帶有一個參數「將其轉換爲565」)

+0

好,感謝所有幫助尤其是感謝沒有理由的投票... 我嘗試了下面的建議,在xna 4.0遊戲模板項目中,它出於我陳述的原因而出現錯誤,所以請詳細解釋我做錯了什麼。我感謝'樹'至少試圖幫助,但它不適合我。 – matt 2010-06-20 11:28:08

+0

我的猜測:因爲你提出問題的方式而被拒絕投票。你聽起來很蘋果「fanboyish」,人們不喜歡它。 – 2010-06-22 17:33:52

+0

好吧,這很奇怪,因爲我恨蘋果,並且我恨所有關於iphone的東西!但至少他們使用了一種標準語言,以使移植變得簡單。我只是在說明事實:iApp商店是最大的。什麼?你是否認爲這些年來只有大量的專業開發人員抵制Apple並等待winmo7?的課程絕大多數應用程序將來自移植iphone(或android)應用程序!否則你會發瘋。而微軟似乎並沒有將這樣的任務變得簡單! – matt 2010-06-23 00:59:21

回答

4

TitleContainer

其他們增加4.0這個新階級,比文件的東西少一點明確

只是去TitleContainer.OpenStream(路徑)

3

直接打開文本文件並閱讀WP7項目中的內容。這是一種方法。

Uri linesUri = new Uri("lines.txt", UriKind.Relative); 
    StreamResourceInfo stream = App.GetResourceStream(linesUri); 
    StreamReader streamReader = new StreamReader(stream.Stream); 
    var contents = streamReader.ReadToEnd(); 
    streamReader.Close(); 

我最初將這些lines.txt文件從explorer拖到我的項目中 - 此代碼無需其他處理工作。

包括您需要的參考資料...

using System.IO; 
using System.Windows.Resources; 
+0

哇,好酷,我從來沒有見過這種加載資源的方式,我認爲它也可以使用二進制文件(使用streamreader和所有)。 – matt 2010-06-17 10:25:35

+0

好的,我需要添加System.Windows到我的項目的引用,現在一切正常,除了它不知道'App'是什麼。 我看着它,它似乎是Application.GetResourceStream,其中應用程序就像某種控件類的Silverlight應用程序?我應該提到,我使用XNA – matt 2010-06-18 01:37:12

+0

你應該使用'TitleContainer' – 2011-02-24 15:09:37

0

換個問題,我會很樂意幫助你。具體來說,請舉例說明您正在嘗試解決的問題。我在XNA的內容管道方面做了很多工作,並可以與您分享一些提示。

一旦您提供更多詳細信息,我會更新我的答案。

+0

完成,更新,謝謝 – matt 2010-06-24 00:37:43

+0

謝謝馬特。我會仔細查看您的最新問題,並儘快回覆您。 – Dennis 2010-06-24 01:08:54

相關問題