基本上,我要做的是使用Nick Gravelyn的TiledLib从Tiled地图加载/绘制地图。地图以Tiled的XML格式保存。但是,当我尝试使用行
加载地图时TiledLib.Map map = Content.Load<TiledLib.Map>("Maps/Map1");
它会抛出一个ArgumentException
。整个事情在Tiled本身呈现如下:
地图的XML源看起来像this(由于显而易见的原因,没有直接发布到StackOverflow上。)
它首先工作(使用一个非常简单的地图只使用一个tileset)但是当我编辑它以包含更多的东西时,它突然开始这样做。它可能与我对tile对象的使用有关吗?
编辑:我已经能够解决使用瓷砖对象不是罪魁祸首; this map structure仍然会产生相同的错误。答案 0 :(得分:3)
你得到一个异常,因为你没有在地图中命名对象,这将导致TiledLib中的ArgumentException。因此,要解决此问题,您需要返回到Tiled程序,(重新)编辑此地图,并选择地图中的每个对象并为其指定名称(不是属性而是名称),然后再次导出地图并(重新)导入它进入游戏内容。这应该可以解决问题。
BTW:我建议使用常规图层进行碰撞检查而不是对象图层。 像这样:在相同的地图图块尺寸中制作带有透明红色矩形图块的小png文件,向地图添加新图层,将其命名为CollideLayer,并在此CollideLayer中将该红色矩形图块放在要碰撞的位置,然后在游戏代码中,您可以检查CollideLayer单元格是否为空。我发现这更简单。
答案 1 :(得分:-2)
我猜,但是看看你的XML结构,有很多重复的
<tile gid="0"/>
数据元素中的。官方站点上此文件的结构没有文档或模式定义,并且内容管道源不可用。此外,TileLib的演示附带该部分
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAC2NmYGBgpjKmFkA2jxCNrg + bHD7z0PWSYx428wmZjW4 + qf7Fxyc3PnDFJS3jdzCbx4QFg8QZScTUzmcgDACR4mfdwAMAAA ==
我不确定您是否可以选择加密加密。但是,“gid”(全局id ??)属性对于定义的每个tile都不能相同,如果它是这样的话。如果我正在编写这个引擎,我可以通过某种方式轻松识别每个基本定义的磁贴。就像数据表上的主键一样。哪个必须是独一无二的。这对我来说就是“gid”属性。
由于异常没有提供任何信息(这是愚蠢的 - 谁部署了像这样的公共库?),参数异常要么是你的“gid”属性值已定义,要么是你缺少加密它在管道导入器或处理器中期望的属性。