作者:61Mobile 文章来源:61Mobile 点击数:76 更新时间:2011-3-23 | ||
先来看看Pipeline的组件
图片来源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和主要的专案分离, 其专案型态如下
接着在新增一个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 文字档的内容如下
然后在此文字当的属性页做设定
Build Action要选择Compile Content Importer和Content Processor就选刚刚我们自己做的Importer和Processor 最后方案的内容如下
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"); 範例的结果如下图
|
WP7 XNA ContentPipelen 内容管道 ContentImporter
最新推荐文章于 2013-11-09 20:52:57 发布