1个不稳定版本
0.1.0 | 2020年4月24日 |
---|
#1579 in 游戏开发
84KB
1.5K SLoC
tiled_json旨在帮助您加载Tiled地图!
此库的主要思想是将数据加载到更易于管理的格式中。这些数据不是针对任何特定用例进行优化的,因此只能用作在转移到更有用的结构之前的中介格式。此库仅用于方便加载Tiled地图,并且设计为只读。其内部的数据结构没有扩展功能或任何固有目的,除了读取存储在Tiled JSON地图中的数据。
此库支持加载压缩和base64编码的地图。
此库不支持加载wangsets、块、地形、无限地图或外部对象模板。 这意味着当您将地图导出为JSON时,您必须确保
- 嵌入图集,
- 分离模板,
- 解析对象类型和属性(可选)。
每个结构体的每个字段都是公开的。为了获取数据,您可以直接访问字段或使用同名的方法。每个变量都根据其Tiled JSON表示进行命名。
提供许多方便的函数,可以访问可能难以访问或冗长访问的数据。
如果需要,所有枚举都可以通过实现Display的to_string()方法转换为字符串切片。
数据树看起来像这样
Map
Layers
Tile Layers
Data (gids corresponding to some tileset)
Object Groups
Objects
Image Layers (images directly on map)
Groups (groups of layers)
Tilesets
Tiles
Animations
Collisions
tiled_json::load_map(file: &str)
是此库的唯一入口点。
通常,我们想要加载地图,将其捕获到变量中。然后我们可能会遍历所有图集并将它们转换为我们的结构,然后对层做同样的事情。以下是一些代码示例
let map = tiled_json::load_map("map1.json").unwrap();
let height = map.height();
let width = map.width();
// CREATE INTERNAL MAP STRUCTURE HERE, THEN
for ls in map.layers().iter() {
let layer_darkness = ls.get_property("darkness").get_float();
let layer_weather = ls.get_property("weather").get_string();
if ls.is_tile_layer() {
let data = ls.get_data().unwrap();
for n in data.iter() {
let flip_bits = tiled_json::gid_flipped_hvd( *n );
let gid = tiled_json::gid_without_flags( *n );
let ts = map.tileset_by_gid( gid ).unwrap();
let coords = ts.coord_by_gid(gid);
if let Option::Some(tile) = ts.tile_by_gid( gid ) {
// these are specific overrides of the tileset for a specific tile
// these can be accessed from the tileset for easy access later.
let anim_coords = tile.get_anim( MSECS_SINCE_WORLD_CREATION ).unwrap(); // this may not exist
let collision = tile.objectgroup().unwrap(); // this may not exist
let properties = tile.get_property_vector();
// do stuff!
}
// check if an existing instance exists of this and if not, create
// a new instance for reference later.
// Add value to our map.
}
} else if ls.is_object_group() {
let objs = ls.get_objects_vector().unwrap();
let dro = ls.get_draworder().unwrap();
// See object properties to know what is relevant to you.
} else if ls.is_image_layer() {
let img = ls.get_image().unwrap();
let tsc = ls.get_transparentcolor().unwrap(); // this can actually be None so use with caution.
// Determine what to do with the image.
} else if ls.is_group() {
let grp = ls.get_group().unwrap();
// If you have groups in your map, then you know what to do with them.
}
}
for ts in map.tilesets().iter() {
/* load stuff here
store textures
organize your internal data
*/
}
依赖项
~1.1–2MB
~41K SLoC