WP7 XNA ContentPipelen 内容管道 ContentImporter

15 篇文章 0 订阅
 
 
作者:61Mobile    文章来源:61Mobile    点击数:76    更新时间:2011-3-23   
ContentPipeline算是比较进阶的议题,但是也不会太困难,想要用自己定义的档案时就需要用到了。

  先来看看Pipeline的组件

  

Bb447745.ContentPipeline_Diagram(en-us,XNAGameStudio.40).jpg

  图片来源http://msdn.microsoft.com/en-us/library/bb447745.aspx

  Soure Asset就是自定义的档案,经过Importer读入成Content DOM Type,然后再经过Processor转换成Output Type,然后编译成XNB档案,最后在游戏执行时读入XNB档。

  白话一点的说就是就是一个档案藉由Importer读入成一个物件,在经过Processor转换成另一个物件,

  以上这些动作都是在Design Time,也就是在电脑上执行到编译成XNB档为止,然后才是游戏的编译。

  基本的概念说过后就来看看例子!

  这个例子示範读入一个文字档,然后文字档的资料就是简单的玩家资讯,就来个名称、年纪、X座标、Y座标,每笔资料佔一行,这几个资料分别是第一到四行

  决定好文字档格式后,就开始写程式啰。

  先创建一个XNA的方案,XNA的Content在3.0和4.0有比较大的不一样,4.0的Content和主要的专案分离,

  其专案型态如下

  

image

  接着在新增一个Windows Phone Game Library的专案,取名为DataType用来决定物件的结构,

  4.0之前可以不用为了资料结构特地开一个专案,那是因为Content和主专案在一起,彼此可以互通,

  现在content和主专案分开,所以要将自己定义的资料结构写在另一个Library专案内,才可以让主专案以及Content专案都用的到。

  在此专案加入一个class,名称叫做PlayerData,程式码如下

1: public class PlayerData {
2: public string Name;
3: public int Age;
4: public Vector2 Position;
5: }

  只是用来定义玩家的资料。

  然后再新增一个Content Pipeline Extension Library的专案,我们取名为ContentPipline,这个专案就是用来写Importer和Processor的地方,

  收先要将DataType的Library加入参考才可以用的到PlayerData物件

  Importer的程式码如下

1: [ContentImporter( ".txt", DisplayName = "PlayerData Importer", DefaultProcessor = "PlayerDataContentProcessor")]
2: public class PlayerDataContentImporter : ContentImporter< string> {
3: public override string Import( string filename, ContentImporterContext context) {
4: StreamReader sr = new StreamReader(File.OpenRead(filename));
5: StringBuilder sb = new StringBuilder();
6: while (!sr.EndOfStream) {
7: sb.Append(sr.ReadLine()).Append( ",");
8: }
9: return sb.ToString();
10: }
11: }

  记得在此class加上ContentImporter的属性。

  程式码的3到10行就是把文字档读出来,把每一行都组合起来,并以逗号做连结

  Import函式回传的string就是所谓的Content DOM Type,你可以将读出来的档案直接转成自己定义的物件,这个例子就直接用string了。

  接着是Processor

1: [ContentProcessor(DisplayName = "PlayerDataContentProcessor")]
2: public class PlayerDataContentProcessor : ContentProcessor< string, PlayerData> {
3: public override PlayerData Process( string input, ContentProcessorContext context) {
4: PlayerData data = new PlayerData();
5:
6: string[] strs = input.Split( new char[] { ',' });
7: if (strs.Length > 3) {
8: data.Name = strs[0];
9: data.Age = int.Parse(strs[1]);
10: data.Position = new Vector2( float.Parse(strs[2]), float.Parse(strs[3]));
11: }
12:
13: return data;
14: }
15: }

  他就是将Import进来的Content DOM Type做处理,将字串用逗号拆解,并且一一放入正确的变数内

  然后回传PlayerData,也就是所谓的Processor Output Type。

  完成Importer和Processor之后,要先将此专案做编译,然后于Content专案要加入此参考,如此一来Content才有选项可以选。

  接着在Content裡面增加文字档,取名叫做PlayerData_Help

  文字档的内容如下

  

image

  然后在此文字当的属性页做设定

  

image

  Build Action要选择Compile

  Content Importer和Content Processor就选刚刚我们自己做的Importer和Processor

  最后方案的内容如下

  

image

  TestProcessorImport是主要的游戏专案,TestProcessorImporterContent是游戏的资源专案,DataType释放资料结构用的专案,ContentPipeline是写Importer和Processor的专案。

  专案的类型从他前面的小图示就可以看出端倪,TestProcessorImport和DataType这两个专案是真的会变成dll档,然后是会出现在xap内的,

  TestProcessorImporterContent裡面的资源会编译成xnb档,也会放进xap裡的Content目录内,

  而ContentPipline专案却不会在最后执行的xap内看到,塬因就如同之前讲的,

  Importer和Porcessor是在Design Time的时候执行,或着说在游戏编译的时候才会需要他,真正执行游戏是用不到他的。

  如此一来,我们就可以读取文字档,转换成PlayerData物件在游戏裡面使用了!

  在游戏内就只要像一般的资源一样载入就可以使用了

  PlayerData data = Content.Load("PlayerData_Help");

  範例的结果如下图

  

image
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值