#map #json #tile #2d #gamedev #data-access #collision

rs-tiled_json

一个用于加载JSON格式Tiled地图的辅助库

1个不稳定版本

0.1.0 2020年4月24日

#1579 in 游戏开发

MIT 许可证

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