#tileset #bevy-ecs #bevy #auto #variant #tilemap #animation

bevy_tileset_map

bevy_ecs_tilemap 的扩展,通过 bevy_tileset crate 允许配置瓦片集、自动平铺等功能

3 个不稳定版本

0.5.0 2022年4月24日
0.4.1 2022年2月17日
0.4.0 2022年2月17日

#1346 in 游戏开发

MIT/Apache

43KB
840

bevy_tileset_map

crates.io docs.rs

bevy_tilesetbevy_ecs_tilemap crate 的实现。

Smart tile placement

📋 特性

包含 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_tilesetREADME。此 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!

🏗 放置/移除

Tile placement modes

这个crate的一个优点是它提供了一些内置的瓦片放置/移除逻辑,因此您不必自己处理!您可以通过使用TilePlacer系统参数轻松访问它。

fn place_tile(mut placer: Tileplacer, /* ... */) {
  // ...
  placer.place(
    tile_id,
    tile_pos,
    map_id,
    layer_id
  );
}

简单!

此外,它还提供了其他变体,例如place方法(具有所有相同的属性)。所以试试它们吧!

🧠 自动瓦片拼接

Auto tiling

虽然bevy_tileset增加了定义自动瓦片的功能,但实际上这个crate真正实现了这一功能。

使用上述TilePlacer系统参数使得处理自动瓦片变得轻而易举!除了简单地处理放置代码外,在内部,它还处理了与自动瓦片相关的多个事项

  1. 放置瓦片时,它会自动插入所需的AutoTile组件
  2. 如果需要移除瓦片并且它是自动瓦片,移除过程也会自动处理

如果您决定手动处理,请确保正确处理放置/移除过程。放置时,您必须添加AutoTile组件(这样AutoTiler就知道它的存在了)。并且当您移除自动瓦片时,请确保发送一个RemoveAutoTileEvent事件(否则周围的自动瓦片不知道要更新)。

只需记住,自动瓦片可能会很,因此当首次放置数千个瓦片时可能会产生延迟(可以通过避免放置非常大的批次来减轻这种情况)。然而,一旦放置,它们就不需要再更新,因此之后不应影响性能。

🎓 示例

请查看bevy_tileset示例以获取特定于瓦片集的示例。

  • 可点击 - 使用bevy_ecs_tilemapbevy_tileset_map添加和移除瓦片
  • 序列化 - 从JSON加载瓦片图
  • 拖动 - 点击并拖动以添加或移除瓦片

🕊 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