如何让ContentTypeReader适用于Windows Phone 7.1

时间:2011-07-18 05:00:09

标签: xml windows-phone-7 xna

我正在尝试为我的课程提供一个内容类型的阅读器,但它似乎没有做任何事情。有什么我需要做的才能让它发挥作用吗?

public class Map
{

    ...

    /// <summary>
    /// Read a Map object from the content pipeline.
    /// </summary>
    public class MapReader : ContentTypeReader<Map>
    {
        protected override Map Read(ContentReader input, Map existingInstance)
        {
            Map map = existingInstance;
            if (map == null)
            {
                map = new Map();
            }

            map.TileSetFile = input.ReadString();
            map.Dimensions = input.ReadObject<Point>();
            map.Tiles = input.ReadObject<int[]>();

            map.Load(input.ContentManager);

            return map;
        }
    }
}

正确读入xml,但似乎没有调用Read函数。有什么想法吗?

我需要的不仅仅是我在这里所拥有的。

1 个答案:

答案 0 :(得分:0)

免责声明:我绝不是XNA内容管道方面的专家

在简要总结内容管道以及如何扩展它之前,我想提一下,自XNA 3.1起,不再需要实现ContentTypeReader和ContentTypeWriter。

在XNA 3.1中,引入了自动XNB序列化(使用Reflection),因此如果您不包含任何编写器和读取器,XNA将为您处理(我相信排除某些情况)。

在此处阅读更多内容:Automatic XNB Serialization

XNA内容管道是一个由以下步骤组成的过程:

enter image description here

其中大多数发生在设计时(当您使用Visual Studio将艺术资产添加到游戏中以及何时构建游戏时)。最后一部分是在运行时执行的,当您运行游戏并调用Content.Load来加载资产时。

XNA内容管道,为扩展而打开,允许您支持XNA Framework附带的内置内容类型,因此允许您引入新的内容类型和新文件格式作为输入处理为你的游戏。

在下图中,您可以看到在扩展内容管道时正在执行的事件链:

enter image description here

为了创建支持新类型的扩展(在您的示例中为Map),您必须执行以下操作(其中一些我认为您已经这样做了):

  1. 在VS。
  2. 中创建新的Content Pipeline扩展库项目
  3. 添加此项目作为游戏内容项目的参考。
  4. 添加新的ContentImporter,ContentProcessor [可选] ContentTypeWriter和ContentTypeReader
  5. 您的ContentTypeWriter类应实现此方法:

    public override string GetRuntimeReader(TargetPlatform targetPlatform)
        {
            // TODO: change this to the name of your ContentTypeReader
            // class which will be used to load this data.
            return "ContentPipelineExtension.CharacterReader, ContentPipelineExtension, Version=1.0.0.0, Culture=neutral";
        }
    
  6. 请注意,在此示例中,我使用了其他一些CharacterReader类,您必须使用它的全名注册读者类型并包含程序集。

    在此处阅读GetRuntimeReader方法:ContentTypeWriter.GetRuntimeReader

    我已经创建了一个名为Character的新类型的演示项目,它是一个导入器,处理器和读写器。

    您可以在此处获取:Sample project

    *请注意,您可以将此行放入处理器/导入程序中以进行调试,并查看visual studio实际上是否触发了Content Pipeline扩展库的代码。

    System.Diagnostics.Debugger.Launch();
    

    *需要注意的另一点是你的新类型(Map,Character,等等)应该在它自己的共享程序集中定义并正确规划,因为这种类型应该在你的实际Game和你的Content Pipeline扩展库中使用

    希望这有帮助。