【问题标题】:Loading an XML file via the Monogame content pipeline?通过 Monogame 内容管道加载 XML 文件?
【发布时间】:2014-02-19 18:12:51
【问题描述】:

我目前正在尝试将我正在开发的游戏从 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 中运行吗?我已经在互联网上寻找了一段时间,但到目前为止,我还没有找到解决我的问题的方法。或者,如果我一直在处理整个系统错误,并且有一种更简单的方法来处理我想做的事情,我很想听听。

提前致谢!

【问题讨论】:

    标签: c# xml xna monogame


    【解决方案1】:

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

    1. 创建一个新项目来保存您的内容导入器、处理器和编写器
    2. 创建内容导入器
    3. 创建内容处理器
    4. 创建内容类型编写器
    5. 创建内容类型阅读器
    6. 从管道工具引用 DLL
    7. 将内容读入您的游戏中

    创建导入器、处理器、读取器和写入器与 XNA 相同。具体可以参考MSDN documentation

    棘手的部分是让您的 DLL 与管道工具一起工作。要将其添加为参考,请查找根树节点的 References 属性。

    【讨论】:

    【解决方案2】:

    除非我弄错了,否则您需要在文件的属性选项卡中将文件的构建操作设置为“内容”,并将复制到输出目录设置为“如果较新则复制”

    【讨论】:

    • 我已经这样做了,但恐怕还是不行。
    • 哎呀,刚刚查看了您发布的链接(我从未将 xml 用于内容管道数据),我怀疑您可以在 monogame 中做到这一点,因为它没有内容管道,并且所以它不能将xml转换成xnb文件,你最好在xna中构建文件,只需将xnb文件复制到你的monogame项目中,然后对它们执行上述^
    【解决方案3】:

    Content.Load&lt;T&gt; 使用 Microsoft.Xna.Framework.Content.Pipeline.IntermediateSerializer 作为 xml。 Monogame 不支持Microsoft.Xna.Framework.Content.Pipeline。这意味着您不能反序列化中间 xml。

    【讨论】:

      【解决方案4】:

      Monogame 带有用于 XML 的内容处理器。打开内容管道应用程序并添加一个 XML 文件;你会看到它有导入器XmlImporter 和处理器PassThroughProcessor

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        相关资源
        最近更新 更多