#tileset #bevy-ecs #tile #ordered #texture #bevy #game

bevy_tile_atlas

用于有序瓦片集的纹理图集构建器

10个版本 (6个破坏性版本)

0.7.0 2023年7月22日
0.6.0 2023年4月12日
0.5.0 2022年11月14日
0.4.0 2022年9月21日
0.1.1 2021年11月26日

#1684 in 游戏开发

每月下载 49
3 个包中使用 (通过 bevy_tileset_core)

MIT/Apache

37KB
239 代码行

bevy_tile_atlas

Crates.io Docs License

用于有序瓦片集的TextureAtlas构建器

目的

这个包是专门为与bevy_ecs_tilemap(我强烈推荐用于Bevy的基于瓦片的游戏)一起使用而制作的,但可能也适用于更广泛的目的。

Bevy的标准的TextureAtlasBuilder非常好,因为它试图尽可能智能和紧凑地打包纹理。然而,这意味着打包纹理的索引可能分布得很广。对于像bevy_ecs_tilemap这样的包,当需要适当的顺序时,这可能会成为一个问题。

bevy_ecs_tilemap一起,这可能会更普遍地影响

  • 瓦片动画(至少是通过递增索引循环通过一组瓦片的那些动画)
    • 例如,bevy_ecs_tilemap中的GPUAnimated
  • 瓦片索引(在这种情况下应该保持指定的顺序)
    • 例如,第一个添加的纹理应该有索引0,依此类推

工作原理

这个包基本上是Bevy自己的TextureAtlasBuilder的增强。然而,与将纹理放置在最佳位置不同,这个构建器按照插入顺序放置它们。当构建最终的TextureAtlas时,这个顺序得到保持。

安装

将以下内容添加到您的[dependencies]列表中的Cargo.toml

bevy_tile_atlas = "0.7.0"

用法

use bevy::prelude::*;
use bevy_tile_atlas::TileAtlasBuilder;

/// Creates a tile-based, ordered `TextureAtlas`
///
/// Assumes that the given handles are all loaded and in their desired order
fn build_tileset(handles: Vec<Handle<Image>>, textures: &mut Assets<Image>) -> TextureAtlas {
  let mut builder = TileAtlasBuilder::default();
  
  for handle in handles {
    let texture = textures.get(&handle).unwrap();
    builder.add_texture(handle, texture);
  }
  
  builder.finish(textures).unwrap()
}

注意:可以添加重复的纹理。这对于瓦片需要同时在多个索引处存在时很有帮助。

Bevy兼容性

bevy bevy_tile_atlas
0.11 0.7.0
0.10 0.6.0
0.9 0.5.0
0.8 0.4.0
0.7 0.3.0
0.6 0.2.0
0.5 0.1.4

常见问题解答

如果这是为bevy_ecs_tilemap制作的,为什么你没有提交PR?

我选择不对bevy_ecs_tilemap开启Pull Request,因为它更像是一个针对特定用例的辅助工具,而不是一个必需的功能。它也可能在其他应用中独立存在。

为什么这局限于瓦片呢?

我没有强制实施瓦片限制,但我没有看到它在瓦片系统之外得到广泛使用。未来可能值得进一步通用化,特别是对于不同瓦片大小的瓦片集。然而,目前这是使它能够与bevy_ecs_tilemap(它最初的用途)一起工作的最低要求。

整个纹理文件夹的顺序是否有保证?

如果您从整个文件夹中加载,插入顺序将取决于Bevy选择如何加载文件(我认为可能会有所不同,但我不是完全确定)。因此,建议手动将瓦片句柄放入一个Vec或数组中,或者使用其他机制来自动排序它们(例如,一个配置文件)。

依赖项

~39–74MB
~1M SLoC