2014-02-19 40 views
5

我目前正尝试移植一款我从XNA开始使用Monogame的游戏,但我在获得内容管道合作方面遇到了一些麻烦。我的游戏使用许多XML文件作为XNB资产来表示游戏中的对象,我按照here的说明创建了这些对象。然而,尝试这种跨字对字移动到Monogame产生以下错误:通过Monogame内容管道加载XML文件?

An unhandled exception of type 'Microsoft.Xna.Framework.Content.ContentLoadException' occurred in MonoGame.Framework.dll

Additional information: Could not load Parts\Window.xnb asset as a non-content file!

这是我一直在使用来定义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

除非我记错了,你需要将文件保存到“内容”和拷贝的生成操作设置为输出目录“复制,如果新”,在属性选项卡中的文件

+0

我已经做到了这一点,但它仍然无法正常工作。 –

+0

oops,只是看看你发布的链接(我从来没有使用xml的内容管道数据),我怀疑你可以在monogame中做到这一点,因为它没有内容管道,所以它不能将xml转换为xnb文件,您最好在xna中构建文件,然后将xnb文件复制到您的monogame项目中,然后对其执行上述^操作 – Nico

0

Content.Load<T>使用Microsoft.Xna.Framework.Content.Pipeline.IntermediateSerializer为一个XML。 Monogame不支持Microsoft.Xna.Framework.Content.Pipeline。这意味着你不能反序列化一个中间XML。

3

我写了一个相当长的tutorial关于加载自定义内容与MonoGame管道。以下是总结

  1. 创建一个新的项目来保存你的内容输入,处理器和作家
  2. 创建内容输入
  3. 创建内容处理器
  4. 创建内容类型的作家
  5. 创建内容型读取器
  6. 引用来自管道工具的DLL
  7. 将内容读入您的游戏

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

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

0

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

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