#地图 #游戏开发 #tmx

tiled

一个用于加载 Tiled 编辑器创建的地图的 Rust 库

32 个版本

新版本 0.12.1 2024 年 8 月 21 日
0.12.0 2024 年 6 月 14 日
0.11.2 2023 年 10 月 4 日
0.11.1 2023 年 5 月 19 日
0.1.1 2014 年 11 月 21 日

#13 in 游戏开发

Download history 246/week @ 2024-05-03 222/week @ 2024-05-10 269/week @ 2024-05-17 328/week @ 2024-05-24 310/week @ 2024-05-31 191/week @ 2024-06-07 354/week @ 2024-06-14 235/week @ 2024-06-21 97/week @ 2024-06-28 114/week @ 2024-07-05 332/week @ 2024-07-12 401/week @ 2024-07-19 468/week @ 2024-07-26 233/week @ 2024-08-02 315/week @ 2024-08-09 312/week @ 2024-08-16

1,371 每月下载量
8 crates 中使用

MIT 许可证

160KB
3K SLoC

rs-tiled

tiled = "0.12.1"

Rust Crates.io Docs Status dependency status

一个用于从 Tiled 地图编辑器 读取 TMX (地图) 和 TSX (瓦片集) 文件的 Rust 库。它提供了一整套功能,并对内部功能如 GID 进行了强大的封装。

文档可在 docs.rs 上找到。

欢迎提交代码贡献,包括错误报告、文档、建议和批评。

最低支持的 TMX 版本是 0.13。

示例

use tiled::Loader;

fn main() {
    let mut loader = Loader::new();
    let map = loader.load_tmx_map("assets/tiled_base64_zlib.tmx").unwrap();
    println!("{:?}", map);
    println!("{:?}", map.tilesets()[0].get_tile(0).unwrap().probability);
    
    let tileset = loader.load_tsx_tileset("assets/tilesheet.tsx").unwrap();
    assert_eq!(*map.tilesets()[0], tileset);
}

常见问题解答

如何将地图嵌入到我的可执行文件中?/ 如何从文件系统以外的位置读取文件?

该库通过你创建的加载器中的 ResourceReaderread_from 函数进行所有读取。默认情况下,此读取器设置为 FilesystemResourceReader,所有文件都通过操作系统的文件系统读取。但是你可以更改它。

以下是一个主要来自 Loader::with_reader 文档的示例

use tiled::{DefaultResourceCache, Loader};

let mut loader = Loader::with_reader(
    // Specify the reader to use. We can use anything that implements `ResourceReader`, e.g. FilesystemResourceReader.
    // Any function that has the same signature as `ResourceReader::read_from` also implements it.
    // Here we define a reader that embeds the map at "assets/tiled_xml.csv" into the executable, and allow
    // accessing it only through "/my-map.tmx"
    // ALL maps, tilesets and templates will be read through this function, even if you don't explicitly load them
    // (They can be dependencies of one you did want to load in the first place).
    // Doing this embedding is useful for places where the OS filesystem is not available (e.g. WASM applications).
    |path: &std::path::Path| -> std::io::Result<_> {
        if path == std::path::Path::new("/my-map.tmx") {
            Ok(std::io::Cursor::new(include_bytes!("../assets/tiled_csv.tmx")))
        } else {
            Err(std::io::ErrorKind::NotFound.into())
        }
    }
);

如果你对闭包方法感到困惑或需要更多灵活性,你始终可以为自己的结构实现 ResourceReader

如何让该库在 WASM 目标上工作?

该库支持 WASM,但由于它目前不支持异步加载,存在一些问题。

  • 首先,为了使其在任何 WASM 目标上工作,请 启用 wasm 功能,如下所示
[dependencies]
# ...
tiled = { version = ".....", features = ["wasm"] }
  • 其次,由于在网络上无法像通常那样使用文件系统,你不能使用 FilesystemResourceReader。因此,你需要实现自己的 ResourceReader。这是一个相对简单的工作,因为你只需要在给定路径时返回任何可 Read 的内容,例如
use std::io::Cursor;

struct MyReader;

impl tiled::ResourceReader for MyReader {
    type Resource = Cursor<&'static [u8]>;
    type Error = std::io::Error;

    // really dumb example implementation that just keeps resources in memory
    fn read_from(&mut self, path: &std::path::Path) -> std::result::Result<Self::Resource, Self::Error> {
        if path == std::path::Path::new("my_map.tmx") {
            Ok(Cursor::new(include_bytes!("../assets/tiled_xml.tmx")))
        } else {
            Err(std::io::Error::new(std::io::ErrorKind::NotFound, "file not found"))
        }
    }
}

您还可以使用与 tiled::ResourceReader::read_from 相同签名的函数;有关更多信息,请参阅 ResourceReader 文档。

许可证

Buch 提供 assets/tilesheet.png

MIT 许可

依赖项

约 4MB
约 65K SLoC