通过Monogame内容管道加载XML文件?

时间:2014-02-19 18:12:51

标签: c# xml xna monogame

我目前正在尝试将我正在处理的游戏从XNA移植到Monogame,但我在使用内容管道进行合作时遇到了一些麻烦。我的游戏使用许多XML文件作为XNB资产来表示游戏中的对象,我根据说明here创建了这些对象。但是,尝试将其逐字逐句转换为Monogame会产生以下错误:

  

MonoGame.Framework.dll中发生未处理的“Microsoft.Xna.Framework.Content.ContentLoadException”类型异常

     

其他信息:无法将Parts \ Window.xnb资产加载为非内容文件!

这是我用来定义XML文件内容的类:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace FileTypes
{
    public class PartFile
    {
        public struct State
        {
            public Rectangle[] frames;
            public int[] collision;
        }

        public Vector2 size;
        public string image;
        public string defaultState = "default";
        public bool fillBG;
        public int ticksPerFrame;
        public Dictionary<string, State> states;
        public string[] modules;
    }
}

以下是项目中的一个XML文件:

<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <Asset Type="FileTypes.PartFile">
    <size>2 3</size>
    <image>Computer</image>
    <defaultState>default</defaultState>
    <fillBG>false</fillBG>
    <ticksPerFrame>7</ticksPerFrame>
    <states>
      <Item>
        <Key>default</Key>
        <Value>
          <frames>
            0 0 40 60
            40 0 40 60
          </frames>
          <collision>
            0 0
            0 0
            0 0
          </collision>
        </Value>
      </Item>
      <Item>
        <Key>active</Key>
        <Value>
          <frames>
            80 0 40 60
            120 0 40 60
          </frames>
          <collision>
            0 0
            0 0
            0 0
          </collision>
        </Value>
      </Item>
    </states>
    <modules>
      <Item>testModule</Item>
    </modules>
  </Asset>
</XnaContent>

最后这里是我用来加载文件的代码示例:

FileTypes.PartFile srcPart = content.Load<FileTypes.PartFile>("Parts\\" + name);

有没有人知道我需要做什么才能让我的代码在Monogame中运行?我一直在互联网上寻找一段时间,但到目前为止,我还没有找到解决问题的方法。或者,如果我一直在讨论整个系统的错误,并且有一种更容易的方法来处理我想做的事情,我很乐意听到它。

提前致谢!

4 个答案:

答案 0 :(得分:4)

我写了一篇相当长的tutorial关于使用MonoGame管道加载自定义内容的文章。这是摘要

  1. 创建一个新项目来保存您的内容导入器,处理器和编写器
  2. 创建内容导入程序
  3. 创建内容处理器
  4. 创建内容类型编写器
  5. 创建内容类型阅读器
  6. 从管道工具
  7. 引用DLL
  8. 将内容读入游戏
  9. 创建导入器,处理器,读取器和编写器与XNA相同。您可以参考MSDN documentation

    棘手的部分是让您的DLL使用管道工具。要将其添加为参考,请查看根树节点的引用属性。

答案 1 :(得分:0)

除非我弄错了,否则你需要在文件的属性选项卡中将文件的构建操作设置为“Content”,将复制到输出目录设置为“copy if newer”

答案 2 :(得分:0)

Content.Load<T>使用Microsoft.Xna.Framework.Content.Pipeline.IntermediateSerializer作为xml。 Monogame不支持Microsoft.Xna.Framework.Content.Pipeline。这意味着您无法反序列化中间xml。

答案 3 :(得分:0)

Monogame附带XML内容处理器。打开内容管道应用程序并添加XML文件;您会看到它包含导入器XmlImporter和处理器PassThroughProcessor

查看@craftworkgames excellent tutorials以了解如何扩展行为。