C# XNA的平铺库在加载时引发ArgumentException

C# XNA的平铺库在加载时引发ArgumentException,c#,.net,xna,C#,.net,Xna,本质上,我正在尝试使用Nick Gravelyn的TiledLib从平铺贴图加载/绘制贴图。地图以平铺的XML格式保存。但是,当我尝试加载带有线条的地图时 TiledLib.Map map = Content.Load<TiledLib.Map>("Maps/Map1"); TiledLib.Map Map=Content.Load(“Maps/Map1”); 它抛出一个ArgumentException。整个事物在平铺中呈现为这样: 地图的XML源看起来像(由于明显的大小原因

本质上,我正在尝试使用Nick Gravelyn的TiledLib从平铺贴图加载/绘制贴图。地图以平铺的XML格式保存。但是,当我尝试加载带有线条的地图时

TiledLib.Map map = Content.Load<TiledLib.Map>("Maps/Map1");
TiledLib.Map Map=Content.Load(“Maps/Map1”);
它抛出一个
ArgumentException
。整个事物在平铺中呈现为这样:

地图的XML源看起来像(由于明显的大小原因,没有直接发布到StackOverflow)

它一开始是有效的(一个非常简单的地图只使用一个瓷砖集),但当我编辑它以包含更多的东西时,它突然开始这样做。这可能与我对瓷砖对象的使用有关吗


编辑:我已经能够找出使用瓷砖对象不是罪魁祸首;仍然会产生相同的错误。

I',我猜,但是看看本节中的XML结构,有很多重复的错误

<tile gid="0"/>

在数据元素中。官方网站上没有关于此文件结构的文档或架构定义,并且内容管道源不可用。此外,TileLib的演示还附带了以下部分:

<data encoding="base64" compression="gzip">

H4SIAAAAAAAC2NMYGBGPJKMFKA2JXCNRG+bHD7z0PWSYx428wmZjW4+QF7FXYC3PNDFJS3JDZCBX4QFG8QZSCTUZMCGDACR4MFDWAAA==

我不确定你是否可以选择包含加密。但是,“gid”(全局id??)属性不能对定义的每个磁贴相同,如果它是这样的话。如果我正在编写这个引擎,我将有一些方法来容易地识别每个基本定义的磁贴。就像数据表上的主键一样。这必须是独一无二的。这就是我的“gid”属性


由于异常不提供任何信息(这很愚蠢-谁会像那样部署公共库??),因此参数异常是您的“gid”属性值已经定义,或者您缺少管道导入器或处理器中所需的加密属性。

如果您因为没有在映射中命名对象而出现异常,这将导致TiledLib中出现ArgumentException。因此,要解决这个问题,您需要返回到平铺程序,(重新)编辑此地图,选择地图中的每个对象并为其命名(不是属性而是名称),然后再次导出地图并(重新)将其导入游戏内容。这应该可以解决问题

顺便说一句:我建议使用常规层进行碰撞检查,而不是对象层。
如下所示:制作一个小png文件,其中有一个透明的红色矩形块,在相同的地图块尺寸中,向地图添加新层,将其命名为CollideLayer,并在这个CollideLayer中将红色矩形块放在你想成为collide的位置,然后在游戏代码中检查CollideLayer单元格是否为空。我发现这更简单。

我只看到一个大的滚动框。@CommunistDuck我已经注意到了,我已经将它上传到另一个gist。XML结构都是由Tiled本身生成的。它看起来不像示例的原因是因为我关闭了压缩以进行测试并使其更清晰。在我看到的之后,平铺贴图中的“gid”表示精灵id,其中0表示无。有趣的是,我收到了很多关于自动设置名称的警告。“自动设置名称”此选项不在我的“平铺贴图编辑器”副本(0.6.0)中,但无论如何,您可以手动选择对象图层,然后选中工具栏上的“选择对象”按钮,然后右键单击地图上的任何对象,选择“对象属性”并填写第一个字段“名称”。@Issam:Tiled没有,Tiled Lib有。我认为对象名称应该在地图设计时设置(在Tiled上),因此,TiledLib可以在加载映射时使用这些名称,因为这里的异常是在加载映射时引发的。@Issam:现在它们是在错误发生之前的应用程序编译时设置的。