#bevy #entities #map #grid #n-dimensional #cells #entity

bevy_cells

用于在网格中操作实体的Bevy库

3个不稳定版本

0.1.1 2023年11月23日
0.1.0 2023年11月23日
0.0.1-dev2023年11月3日

#1418 in 算法

MIT许可证

71KB
1.5K SLoC

bevy_cells

Crates.io Docs.rs

这是一个通用的网格实体库,旨在支持瓦片地图库或其他需要以网格方式访问实体的库,它基于aery关系包构建。目标是尽可能保持API表面简洁直观,并尽可能避免延迟操作/状态,以便使结构更直观地工作(例如:在一个系统中进行的更新应该被后续的系统看到,而不是下一个帧。)

特性

目前,bevy_cells支持以下功能

  • 自动分块(包括对块实体的访问)
  • 自动创建地图
  • 块和地图的分层销毁
  • 支持n维地图
  • 基于地图的查询
  • 空间查询
  • 批量操作以提高大型单元格或块组的性能

即将推出的特性

  • 自动处理分层删除(通过aery支持或直接在本包中支持)
  • 根据块和地图对内存中的单元格进行排序(将需要未来的Bevy API添加)

API

基本API围绕CellQueryCellCommandsCellMapLabel展开,如下所示。

struct GameLayer;

impl CellMapLabel for GameLayer {
    const CHUNK_SIZE: usize = 16;
}

fn move_character(
    keyboard_input: Res<Input<KeyCode>>,
    mut commands: Commands,
    character: CellQuery<GameLayer, CellCoord, With<Character>>,
    walls: CellQuery<GameLayer, (), With<Block>>,
) {
    let mut cell_commands = commands.cells::<GameLayer, 2>();

    let mut x = if keyboard_input.just_pressed(KeyCode::A) {
        -1
    } else {
        0
    };

    x += if keyboard_input.just_pressed(KeyCode::D) {
        1
    } else {
        0
    };

    let char_c = character.single();
    let new_coord = [char_c[0] + x, char_c[1] + y];

    if walls.get_at(new_coord).is_none() {
        cell_commands.move_cell(*char_c, new_coord);
    }
}

更多示例可以在示例文件夹中找到!

版本

Bevy版本 bevy_cells版本
0.12 0.1
0.11 0.1-dev

依赖项

~24MB
~447K SLoC