#level #tile #layer #tileset #value #ldtk #schema-version

micro_ldtk

从LDTK加载数据,对其进行索引并使其通过Bevy资产可访问,提取并使用自动瓷砖规则

12个版本 (7个重大更改)

0.11.0 2024年7月9日
0.10.0 2024年2月25日
0.9.1 2024年1月20日
0.7.0 2023年8月27日
0.3.0 2023年4月23日

#193 in 解析器实现

Download history • Rust 包仓库 1/week @ 2024-05-17 • Rust 包仓库 2/week @ 2024-05-24 • Rust 包仓库 114/week @ 2024-07-05 • Rust 包仓库 18/week @ 2024-07-12 • Rust 包仓库 55/week @ 2024-07-26 • Rust 包仓库 7/week @ 2024-08-02 • Rust 包仓库

每月63次下载

Apache-2.0

610KB
10K SLoC

micro_ldtk

https://crates.io/crates/micro_ldtk https://docs.rs/micro_ldtk

micro_ldtk在原始LDTK JSON数据之上提供了一个功能丰富的层,专注于Bevy引擎,并旨在支持尽可能多的LDTK模式版本。

安装

默认情况下,micro_ldtk提供了对最新LDTK模式版本的支持(对于值也包括N-1,因为最新LDTK版本发布和新版本micro_ldtk发布之间可能存在一些时间滞后)

要支持不同的LDTK模式版本或锁定您的版本,您需要禁用默认功能并选择您需要的模式版本

[dependencies]
micro_ldtk = { version = "0.8.0", default-features = false, features = ["ldtk_1_4_1", "autotile"] }

功能

  • autotile:提供从LDTK项目到micro_autotile AutoRuleSet结构的类型转换。作为micro_autotile重导出autotile
  • no_panic:用中止替换显式的panic!调用(unwrap、expect、panic等)。这可以减小WASM二进制文件大小,但可能无法涵盖所有区域。欢迎PR。

LDTK版本

支持的LDTK版本通过使用功能标志启用。一次只能启用一个标志,否则导出的类型将冲突。某些版本没有进行任何模式更改,这意味着某些标志将具有相同的数据结构 - 查看您的LDTK版本更改日志以查看是否有任何更改。模式更改被认为是任何更改、添加或删除,这些更改在JSON模式中影响除元数据以外的任何字段或属性,例如模式标题和模式版本

如果您只访问有关地图的基本数据,则更新到最新版本很可能不需要更改您的代码。确保您的项目将与特定LDTK版本一起工作的最简单方法是打开LDTK中相应的版本的ldtk文件并再次保存。

功能标志 使用模式版本
ldtk_1_5_3 v1.5.3
ldtk_1_4_0ldtk_1_4_1 v1.4.0
ldtk_1_3_0 v1.3.0
ldtk_1_2_5 v1.2.5
ldtk_1_2_4 v1.2.4
ldtk_1_2_3ldtk_1_2_2 v1.2.2
ldtk_1_2_1ldtk_1_2_0 v1.2.0
ldtk_1_1_3ldtk_1_1_2 v1.1.2
ldtk_1_1_1ldtk_1_1_0 v1.1.0
ldtk_1_0_0 v1.0.0

用法

首先,将插件包含到您的应用中。这将包括 LDTK 文件的资源加载器,并为索引过的关卡和图集创建资源。在本 README 的上下文中,“图集”指的是与图块 ID 相关的 元数据,而不是可能用于表示图块 ID 的精灵图或图像。

关卡和图集必须具有全局唯一的名称,否则将使用最后加载的一个。

use bevy::prelude::*;
use micro_ldtk::MicroLDTKPlugin;

fn main() {
    App::build()
        .add_plugins(DefaultPlugins)
        .add_plugin(MicroLDTKPlugin)
        .run();
}

在其他地方,通过资源服务器加载一个或多个 LDTK 项目

use bevy::prelude::*;
use micro_ldtk::Project;

#[derive(Resource, Debug)]
pub struct MyLdtkProject(Handle<Project>);

pub fn startup(
    mut commands: Commands,
    asset_server: Res<AssetServer>,
) {
    let project: Handle<Project> = asset_server.load("path/to/project.ldtk");
    commands.insert_resource(MyLdtkProject(project));
}

当加载或修改 LDTK 项目时(当启用资源事件时),关卡和图集将被解析成更方便的格式,并存储在资源中。这些资源可以通过 LevelIndexTilesetIndex 资源访问。

use bevy::prelude::*;
use micro_ldtk::{LevelIndex, TilesetIndex};

pub fn process_some_level(
    level_index: Res<LevelIndex>,
    tileset_index: Res<TilesetIndex>,
) {
    let level = level_index.get("level_name").unwrap();
    let tileset = tileset_index.get("tileset_name").unwrap();

    for layer in level.layers() {
        layer.for_each_tile(|x, y, tile_data| {
            let tile_metadata = tileset.get(tile_data.gid());
            log::info!("Got tile {:?} at [{}, {}]", tile_metadata, x, y);
        });
    }
}

依赖项

~40–77MB
~1.5M SLoC