平铺和 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.
}
我使用 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.
}