我目前正在尝试将我正在处理的游戏从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中运行?我一直在互联网上寻找一段时间,但到目前为止,我还没有找到解决问题的方法。或者,如果我一直在讨论整个系统的错误,并且有一种更容易的方法来处理我想做的事情,我很乐意听到它。
提前致谢!
答案 0 :(得分:4)
我写了一篇相当长的tutorial关于使用MonoGame管道加载自定义内容的文章。这是摘要
创建导入器,处理器,读取器和编写器与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以了解如何扩展行为。