平铺对象位置与MonoGame位置不匹配

时间:2019-10-09 09:07:57

标签: c# xna monogame game-development tiled

将带有对象层的Tiled映射导入到MonoGame项目中时遇到问题。一切工作都很好。我可以将Tiled地图导入项目并使用MonoGame.Extended渲染地图。

当我尝试使用平铺地图中的对象层中的对象时,我的问题开始了。我可以访问该对象,也可以访问其属性(位置等)。实际上,当访问对象的属性时,它们将完全按照原样输出。以下是需要澄清的图片:

This is the image of the object within the Tiled map editor

下面是我导入地图,收集对象信息并将该信息(在这种情况下为位置)分配给另一个对象(玩家)的代码

gameMaps.Add(MapBuilder.LoadTiledMap("TestMap"));

gameMapRenderer = new TiledMapRenderer(graphicsDevice);

var viewportAdapter = new BoxingViewportAdapter(GameInstance.Instance.Window, graphicsDevice, 1440 / 4, 810 / 4);
mainCamera = new Camera2D(viewportAdapter);

var player = new Player();
var playerStartPos = new Vector2();

foreach(var obj in gameMaps[0].ObjectLayers[0].Objects)
{
  if (obj.Name.Equals("PlayerStart"))
  {
    playerStartPos = obj.Position;
    break;
  }
}

player.position = playerStartPos;

entities.Add(player);

mainCamera.LookAt(player.position);

但是下面是演示该问题的图像:

Issue as an image

子画面/角色是分配位置的玩家对象,以防不清楚。

说明:我能够获取对象的位置并将其分配给我的“ Player”对象,然后播放器根据平铺地图编辑器中对象的位置处于正确的位置。但是,尽管我从未对整个地图的位置进行任何调整,但Tiled地图本身实际上在不正确的位置上渲染。

一些其他详细信息可能会有所帮助:

在“平铺的地图”编辑器中,位置x0,y0是地图的最大顶部图块。但是,在MonoGame中,如果我走相同的位置-Tiled地图实际上在下面渲染/放置了一些尺寸。这意味着地图的位置与应有的位置不正确。

下面的图像显示了MonoGame中该位置的位置,以及该位置与Tiled中该位置的位置没有正确关联的情况。

MonoGame screenshot

1 个答案:

答案 0 :(得分:0)

与Monogame的创建者交谈了一下​​之后,我们扩大了范围。实际上这是两件事:

  1. 在Tiled地图编辑器中,等轴测图的网格系统不同于Monogame用于渲染所有内容的网格系统。 Tiled用于等轴测图的网格系统是法线网格,但已旋转以匹配等轴测视图,而Monogames只是法线网格。这会导致将Tiled中的对象的位置(x,y)导入到Monogame中,其位置值与在Monogame中实际应具有的位置值不匹配-这解释了上图中的位置错误。 Monogame.Extended的创建者注意到了该错误,但表示无法确定修复程序,因为它需要将等距Tiled位置转换为Monogame位置的公式。

  2. 因为我的子画面顶部有多余的填充,这导致整个贴图渲染的x像素比适当的0位置低了许多像素。它与在Monogame中通过精灵尺寸而非地图生成的地图有关。老实说,这不是一个大问题,因为可以通过在TiledMapRenderer的自定义实现中实现解决方法。

我可以发布到Monogame的链接。稍后将进行进一步的讨论。