3 个不稳定版本
0.5.0 | 2022年4月24日 |
---|---|
0.4.1 | 2022年2月17日 |
0.4.0 | 2022年2月17日 |
#1346 in 游戏开发
43KB
840 行
bevy_tileset_map
bevy_tileset
对 bevy_ecs_tilemap
crate 的实现。
📋 特性
包含 bevy_tileset
的所有特性,包括
- 通过 RON 文件定义瓦片集和瓦片
- 直接将瓦片集加载为 Bevy 资产
- 定义标准、动画、变体和自动瓦片
以及本 crate 特有的功能
- 非常简单的序列化和反序列化
- 自动平铺支持
- 紧凑的瓦片放置/移除
📲 安装
由于我可能想提交一个 PR 直接将其集成到 bevy_ecs_tilemap
中,因此这个 crate 还没有公开发布,但你现在可以使用它通过 git
[dependencies]
bevy_tileset_map = "0.5"
# Don't forget to add `bevy_ecs_tilemap` to your project!
bevy_ecs_tilemap = "0.6"
✨ 使用
🧩 瓦片集
有关如何定义和使用瓦片集的信息,请参阅 bevy_tileset
的 README。此 crate 将整个 crate 重新导出到 tileset
子模块。
要使用此 crate,请确保将以下内容添加到您的应用程序中
use bevy::prelude::*;
use bevy_tileset_map::prelude::{TilesetPlugin, TilesetMapPlugin};
use bevy_ecs_tilemap::prelude::TilemapPlugin;
fn main() {
App::new()
// ...
// bevy_ecs_tilemap
.add_plugin(TilemapPlugin)
// bevy_tileset
.add_plugin(TilesetPlugin::default())
// bevy_tileset_map
.add_plugin(TilesetMapPlugin)
// ...
.run();
}
💾 序列化/反序列化
启用
serialization
功能
使用此 crate,序列化非常简单(只要您的瓦片使用瓦片集生成)。
只需将 TilemapSerializer
添加到您的系统
/// Assumes bevy_ecs_tilemap has already been properly setup to have tiles read from it
fn save_maps(serializer: TilemapSerializer) {
// This saves all currently generated maps
let maps = serializer.save_maps();
// Write to disk using something like serde_json...
}
反序列化同样简单
/// Assumes bevy_ecs_tilemap has already been properly setup to have tiles placed into it
fn load_maps(mut serializer: TilemapSerializer) {
let path = FileAssetIo::get_root_path().join("assets/map.json");
let data = std::fs::read_to_string(path).unwrap();
let maps = serde_json::from_str::<SerializableTilemap>(&data).unwrap();
serializer.load_maps(&maps);
}
查看 序列化 示例,了解我们如何将一些 JSON 转换为完整的瓦片图。同样,只要您使用瓦片集设置一切,它应该几乎按预期工作。
注意:此功能非常基础且部分为实验性。如果事情没有按您想要的方式进行,请随时提交有关此问题的 issue 或 PR!
🏗 放置/移除
这个crate的一个优点是它提供了一些内置的瓦片放置/移除逻辑,因此您不必自己处理!您可以通过使用TilePlacer
系统参数轻松访问它。
fn place_tile(mut placer: Tileplacer, /* ... */) {
// ...
placer.place(
tile_id,
tile_pos,
map_id,
layer_id
);
}
简单!
此外,它还提供了其他变体,例如place
方法(具有所有相同的属性)。所以试试它们吧!
🧠 自动瓦片拼接
虽然bevy_tileset
增加了定义自动瓦片的功能,但实际上这个crate真正实现了这一功能。
使用上述TilePlacer
系统参数使得处理自动瓦片变得轻而易举!除了简单地处理放置代码外,在内部,它还处理了与自动瓦片相关的多个事项
- 放置瓦片时,它会自动插入所需的
AutoTile
组件 - 如果需要移除瓦片并且它是自动瓦片,移除过程也会自动处理
如果您决定手动处理,请确保正确处理放置/移除过程。放置时,您必须添加AutoTile
组件(这样AutoTiler
就知道它的存在了)。并且当您移除自动瓦片时,请确保发送一个RemoveAutoTileEvent
事件(否则周围的自动瓦片不知道要更新)。
只需记住,自动瓦片可能会很慢,因此当首次放置数千个瓦片时可能会产生延迟(可以通过避免放置非常大的批次来减轻这种情况)。然而,一旦放置,它们就不需要再更新,因此之后不应影响性能。
🎓 示例
请查看bevy_tileset
的示例以获取特定于瓦片集的示例。
🕊 Bevy 兼容性
bevy | bevy_tileset_map |
---|---|
0.7 | 0.5 |
0.6 | 0.4 |
0.5 | 0.2 |
ℹ️ 常见问题解答
为什么这不仅仅是bevy_ecs_tilemap或bevy_tileset上的一个功能?
主要原因在于,那些crate旨在被普遍使用,而此crate旨在更具体地使用:它是为那些想要同时使用这两个crate的人而设计的。
依赖项
~43–58MB
~840K SLoC