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 解析器实现
每月63次下载
610KB
10K SLoC
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_autotileAutoRuleSet
结构的类型转换。作为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_0 ,ldtk_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_3 ,ldtk_1_2_2 |
v1.2.2 |
ldtk_1_2_1 ,ldtk_1_2_0 |
v1.2.0 |
ldtk_1_1_3 ,ldtk_1_1_2 |
v1.1.2 |
ldtk_1_1_1 ,ldtk_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 项目时(当启用资源事件时),关卡和图集将被解析成更方便的格式,并存储在资源中。这些资源可以通过 LevelIndex
和 TilesetIndex
资源访问。
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