平铺和 MonoGame.Extended - 如何处理碰撞?

Tiled and MonoGame.Extended - How to handle collisions?

我使用 Tiled 编辑我的地图,我想为我的游戏设置一个碰撞系统。

我试图在我使用的 tilesets 的一些 tiles 上设置属性,但问题是我无法从 MonoGame.Extended 访问它们,实际上这个库似乎不是为此目的而设计的,我不明白为什么。

即当我查看 TiledMapTile class 时,根本没有 属性,肯定有 TiledMapTileset class 中包含属性的 TiledMapTilesetTile 个对象,但是我怎样才能从一个位置得到这个对象呢?我想要的是这样的:

bool isCollisionTile = tiledMap.GetTile(x, y).Properties["IsCollisionTile"];

我也对其他处理冲突的方法持开放态度,可以通过为 MonoGame/XNA 使用另一个 C# Tiled 支持库,或者通过改变我对这个问题的处理方法,并找到一个完全不同的解决方案。

提前致谢!

如果您愿意,您可以随时将您使用的瓦片地图导出到 JSON。参见 JSON-map-format

Tiled can export maps as JSON files. To do so, simply select “File > Export As” and select the JSON file type. You can export json from the command line with the --export-map option.

在 monogame 中加载 JSON 并从那里访问属性。

您可以使用 ff:

获取玩家所在的图块
int playerPosX = 0;
int playerPosY = 0;
int tileWidth = 32;

// TiledMap map
TiledMapTileLayer layer = map.GetLayer<TiledMapTileLayer>("Collision");
TiledMapTile? tile = null;

ushort x = (ushort)(playerPosX / tileWidth);
ushort y = (ushort)(playerPosY / tileWidth);

// Get tile based on player position
layer.TryGetTile(x, y, out tile);

if (tile.HasValue)
{
    // collided!
    // you can also compute the tile's position using the X, Y and tileWidth if needed.
}