Nowpaper 十五英寸的世界

Rich Games Developer

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  开了个头

本篇中其实没有真正解决Win8里XNA的ContentPipeline(内容管线)问题,而是说明如何使用特定的ContentPipeline(内容管线),在XNA里读取内容是通过Content.Load<T>读取,取得资源方法封装的很好,以至于不需要文件后缀,这是因为XNA通过内容管线的方式将所有的资源编译成了xnb资源文件,XNA自带了一些默认的资源类型,在任何一个XNA工程里的Content子项目中的资源打开属性,如下图:

输入和输出都对应了一个处理器,也就是说,有一个进还有一个是出,这些内容输入和输出所对应也比较简单,例如Texture的纹理,Model的模型等,这些可以在官方文档中查到比较明确的例子,但是有的时候,我们所需的并不只是这些标准的资源,而是更加自定义的资源,例如在cocos2d-xna中.plist文件,这些文件你指定的标准类型是没有用的,就算在编译xnb的时候不出错,也会在Load的时候崩溃,那么如何解决这个问题呢?

在前面的篇幅中,有朋友建议使用FromStream的方法解决,我很兴奋的去做了尝试,但是这种方法并不通用,要知道xna里最出名的就是自定义资源,这些自定义出来的xnb,通过流方式解析那将会是一件大工程,而且即便是能输出正确的资源,但转换的代码等于你的资源总量。

  自定义内容管线

既然标准的没有,那么就只能自定义了,XNA提供了ContentImporter和ContentProcessor来制作自定义的资源,甚至在Studio里还提供了相关模板:

然后写出你想处理的输入和输出的处理类:

具体代码其实也很简单,推荐参看cocos2d-xna中这段处理,上图来自该工程。

然后选定你的资源更改即可,那么在我的一个游戏《阿翔跨栏》中,就有一个自定义的数据文件,这个数据文件主要是用来描述角色动画帧的位置信息,很显然我需要自行转换,取得其数据流即可:

在取得的数据流之后在做特殊处理,在cocos2d-xna中如果你遇到了.plist文件就得需要同样的办法才能让你的demo运转正常,这方面可以参看coco2d-xna官方test就可以了解。

  In MonoGame XNA

现在我们转换到Windows8中,使用MonoGame去取得自定义资源时候该怎么办呢?毕竟没有编译方法,这让我困扰了好久,当想通的时候却发现这一切是那么的简单,原来既然已经没有了输入,就不需要去管输入了,只要将xnb读出来即可,所以,直接引用内容索引,比如说你自定义的内容输出例如为CCContent,那么就直接Content.Load<CCContent>,所以这样做起来代码仍然不需要修改,做法当然还是那么简单,把编译好的xnb文件扔仅工程的Content目录,并且设置属性为内容。期望微软尽快能出XNA For VS2012,这样在开发时候就不用这样切来切去了。

本来觉得可能会写好多,写到现在发现没什么好写的,只要知道了一种方法,自然其他的问题也就迎刃而解,为了让咱这篇丰满一点,附上《阿翔跨栏》WP和Win8同版视频:

该项目里就用到的自定义内容管线,按惯例都会附上源代码,可惜这次不行,还请谅解啦。

posted on 2012-09-04 22:19  nowpaper  阅读(1711)  评论(2编辑  收藏  举报