2010-06-17 81 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