• [翻译]XNA 3.0 Game Programming Recipes之ten


    PS:自己翻译的,转载请著明出处
                                                                    2-14.自定义内容的输入
    问题
        你想加载一个自定义版本的文件通过内容管道到你的XNA项目中。由于你文件的扩展名和结构与已知的XNA文件格式不同,默认的XNA内容管道不知道该如何加载和处理你的文件使它成为一个有用的游戏对象。
    解决方案
        你要写一个可以输入的自定义内容,能阅读的文件从磁盘和有用的数据格式到一个对象里面,准备被处理器处理。因此,这一节假设你已经知道如何建立你自己的内容处理器。鼓励您去阅读的管道内容简介在3-9节 。
        这节的重点仅在于自定义的输入。ContentImporter读硬盘上的数据和格式化它成为一个对象。在这节,你将读入两个Vector3s它们已经被存储在一个comma-separated值(CSV)文件,把它们转化为可视矩阵。选择这个例子是因为视景矩阵需要构造一些计算处理,XNA框架带有默认TypeWriterTypeReader capable of serializing and deserializing Matrix 对象。它们把这节的重要点放在从硬盘读取一个文件,写一个文件导入,来接收数据用自定义内容处理器。
         看一下图5-27。自定义导入将读取数据从CSV文件,建立一个CSVImporterToProcessor对象保存从文件中萃取的有用的数据。自定义CSVMatrixProcessor将处理数据在这个CSVImporterToProcessor对象类转化成一个矩阵对象。从那时起,一个矩阵对于XNA的默认的TypeWriterTypeReader将会小心的处理序列化和deserializing.参见4-15节和4-16节
        因为导入和处理器在编译的时候被引用,你可能不知道有什么好处在导入和处理器之间把处理任务分开。例如,那岂不是更简单的只定义一个方法,其内容在CSV文件,这一数据立即变成矩阵对象,而不是有两个方法和一个CSVMatrixProcessor中间对象。
        分步处理的好处是可以重复使用的处理器为多个导入入口。例如,XNA框架带有一个能把NodeContent对象转化成ModelContent对象能力的处理器。如果你导入了不同格式的模型如.x.fbx,那么你要做的时写一个导入文件,它可以从你的文件里建立一个NodeContent,使用默认ModelProcessor考虑你的工作内容。

    它是如何工作的

        用一个简单的文本编辑器定义CSV来开始。下面是我的CSV文件:
    -5;5;8;
    0;2;0;

         这些是视景矩阵的目标和位置,你会在这加来构造它。
    中间类型
         我的管道对象称为CSVToViewMatrixPipeline.在3-9节的第4步不要做任何事;你要编写一些额外的方法。在这节的最后,你会找到内容管道对象的全部代码。
         首先,你需要一个对象来存储从硬盘读取来的数据。这个对象会被内容导入器输出和内容处理器的输入(用它的内容来构造一个视景矩阵)。添加自定义的CSVImporterToProcessor类,它保存了2个Vector3:
     1 public class CSVImporterToProcessor
     2 {
     3     private Vector3 position; 
     4     private Vector3 target;
     5     public Vector3 Position{get{return position;}}
     6     public Vector3 Target{get{return target;}}
     7     public CSVImporterToProcessor(Vector3 position,Vector3 target)
     8     {
     9          this.position=position;
    10          this.target=target;
    11     }
    12 }
         这个类是能够存储2个Vector,这两个得到的方法使处理器访问此数据。导入器将需要提供所有的数据时在调用构造函数方法时。
    内容导入器
        ContentImporter将从文件中读取数据,以便确认,在你的文件的上部,您已连接到命名空间(这是解释第3步中的3-9节,介绍的内容管道) :
    using System.IO;
        你已经可以编辑你的自定义导入器。
    1 [ContentImporter(".CSV",DefaultProcessor="CSVMatrixProcessor")]
    2 public class CSVImporter:ContentImporter<CSVImporterToProcessor>
    3 {
    4      public override CSVImporterToProcessor Import(string filename,ContentImporterContext context);
    5      {}
    6 }
         属性表明这个类是一个具有处理.csv文件能力的内容导入器,并且默认情况下,其输出应被CSVHeightMapProcessor处理(它一会介绍)。在下一行,这个导入器将产生一个CSVImporterToProcessor对象。
        在编译时,导入器收到的.csv的文件被导入,应该把它变成CSVImportentToProcessor对象 。首先打开文件和从第一行读取,如下代码的头两行实现这个功能。为了互相分开这个值;你应该使用简单的方法,而在这种情况下返回一个三个字符串的数组,每个字符串保存有一系列我们的相机的位置。在下面的三行转换这些字符串成为浮点数,这是最终用于创建Vector3的位置 。
    1 streamReader file =new StreamReader(filename);
    2 string line=file.ReadLine();
    3 string[] lineData=line.Split(';');
    4 float x=float.Parse(lineData[0]);
    5 float y=float.Parse(lineData[1]);
    6 float z=float.Parse(lineData[2]);
    7 Vector3 position=new Vector3(x,y,z);
        从文件里读第2行,用同样的方法把它转换成Vector3目标。
    1 line=file.ReadLine();
    2 lineData=line.Split(';');
    3 x=float.Parse(lineData[0]);
    4 y=float.Parse(lineData[1]);
    5 z=float.Parse(lineData[2]);
    6 Vector3 position=new Vector3(x,y,z);
        现在,你所有的数据都准备好建立一个CSVImporterToProcessor对象:
    1 CSVImporterToProcessor finalData=new CSVImporterToProcessor(position,target);
    2 return finalData;
       这个对象会被送到处理器,用户选择处理一些需要使用的东西。很明显,处理应该有把CSVImporterToProcessor对象输出的能力。在内容处理器里接收数据
        因为CSVImporterToProcessor类是一个自定义类,你需要建立一个自定义处理器。本示例处理器将处理CSVImporterToProcessor对象成为一个矩阵对象。在本章的第一节有如何建立一个视景矩阵,基于相机的目标和位置。
     1 [ContentProcessor]
     2 public class CSVMatrixProcessor:ContentProcessor<CSVImporterToProcessor,Matrix>
     3 {
     4      public override Matrix Process(CSVImporterToProcessor input,ContentImporterContext context);
     5      {
     6          Vector3 up=new Vector3(0,1,0);
     7          Vector3 forward=input.Target-input.Position;
     8          Vector3 right=Vector3.Cross(forward,up);
     9          up=Vector3.Cross(right,forward);
    10          Matrix viewMatrix=Matrix.CreateLookAt(input.Position,input.Target,up); 
    11          return viewMatrix;
    12      }
    13 }
        您表明该处理器具有将CSVImporterToProcessor对象成为矩阵对象的能力。在CSVImporterToProcessor对象里的位置和目标被用来建立视景矩阵。在默认情况下XNA知道如何序列化/反序列化一个矩阵对象从/到一个二进制文件,把结果矩阵加载到你的XNA游戏对象中,所以你不需要编写一个自定义的TypeWriterTypeReader.
    用法
        当你一定要完成所有9个步骤的3-9节,您应该能够导入.csv文件到你的工程中。在你的解决方案中选择了一个被导入的.csv文件,你可能注意到了窗口的属性,这个文件将会被CSVImproter导入,如图2-28所示。同时,因为你指出,这是默认的处理器,CSVMatrixProcessor是作为处理器。
        一旦.csv文件被导入,你需要从a.csv文件中加载一个视景矩阵如下代码:
    1 protected override void LoadContent()
    2 {
    3     ViewMatrix=Content.Load<Matrix>("camerasettings");
    4 }
    代码
        略
  • 相关阅读:
    去除金额千分位,还原成数字
    替换对象的key
    合并两个对象的属性
    js常用数组方法
    document对象的一些属性
    js数字四舍五入保留n位小数
    js时间日期类常用方法
    数字转换成千分位格式
    valueOf获取日期时间初始值
    常见的数据库Cause:Packet for query is too large(xxx > 1024)
  • 原文地址:https://www.cnblogs.com/315358525/p/1528437.html
Copyright © 2020-2023  润新知