你如何在Windows Phone 7中加载文件?使用XNA

时间:2010-06-17 00:56:32

标签: windows-phone-7

我正在将iphone游戏移植到Windows Phone 7.我的工作方式与Winmo7类似,因为你将所有想要阅读的文件添加到项目中。我们不希望在资产创建管道中增加这一额外步骤,因此我们只是将所有文件放入我们自己的基本文件存档中,然后将一个存档文件添加到项目中。然后我们有一个资产构建过程,它导出我们所有的资产,然后从它们创建这个档案。

在winmo7中,我惊讶地发现你不能做同样的事情。据我所知,加载数据的唯一方法是通过内容管道。我们通过简单地创建一个contentImporter来简单地解决了这个问题,它只是将所有文件转换为byte []并将它们导出为byte数组,然后你只需加载它们就可以直接访问文件中的所有字节。遗憾的是,与c ++不同,你只需要将内存转换为结构(因为文件已经存储在结构的格式中),c#似乎需要更加手动的方法,你可以使用BitConverter之类的东西将所有数据加载到结构和类中来自字节数组。

事实上,我们想要使用我们现有的资产导出过程来处理纹理和网格等事情,我们是否已经设置了一些东西来确定应该用于每个纹理等的确切像素格式。所以在这些情况下我们不想使用默认的Texture和Mesh内容Importers。我们尝试在Texture ContentImporter上制作它,只需返回一个Texture2D,但为了创建一个Texture2D,你需要一个图形设备。

第二个问题是必须将每个资产添加到项目中的过程。我们决定不像我们为iphone那样只加载dataArchive,因为我们想要使用默认的ContentImporters来处理某些数据(如声音)。但是我们通过制作它来解决这个问题所以你只需要将一个文本文件(其中包含根数据dir)添加到项目中,然后制作一个ContentImporter,它遍历该目录结构并在那里的所有文件上调用“context.BuildAsset”

总结一下,我们有一个资产和ContentImporter可以自动处理数据目录中所有资产的导入,从而解决了必须手动将它们添加到项目中的问题。其中一些资产将通过默认的ContentImporters(如声音和音乐,以及xmls)进行定向,而其他资产将仅作为byte []导入并手动加载,因为我们已经拥有了我们想要的格式的资源。在那些资产的情况下,如果我们可以做'byte [] - >那将是件好事。手动加载'内部自定义ContentImporters - 离线 - 但对于我们尝试的第一个 - 纹理 - 它需要一个Graphics设备来创建本机Textue2D结构,我们在ContentImporter框架中找不到一个。

所以有什么想法吗?指针?或者这是做最好的一切方式吗?我想另一个选择是将所有资源转换为默认纹理和网格处理器可以采用的格式,以及每个属性的参数(所以我们有一个手工制作的565纹理,将其转换回888 tga,然后通过默认纹理管道发送它,参数说“将其转换为565”)

3 个答案:

答案 0 :(得分:4)

TitleContainer

它在4.0中添加了这个新类,并且比File stuff

更不明确

只需去TitleContainer.OpenStream(路径)

答案 1 :(得分: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文件从资源管理器拖到我的项目中 - 此代码无需其他处理。

包括您需要的参考资料......

using System.IO;
using System.Windows.Resources;

答案 2 :(得分:0)

重新提出问题,我非常乐意为您提供帮助。具体来说,举例说明您要解决的问题。我已经在XNA的内容管道上做了很多工作,可以与您分享一些提示。

一旦你提供更多细节,我会更新我的答案。