#tilemap #tile #chunks #map #entities #bevy #grid

bevy_tiles

用于处理网格中实体的Bevy库

3个不稳定版本

0.1.0 2024年4月20日
0.0.0-dev22024年4月15日
0.0.0-dev12024年3月5日

#887 in 算法

自定义许可证

83KB
1.5K SLoC

bevy_tiles

Crates.io docs license Crates.io

这是一个通用网格实体库,旨在支持瓦片地图库或其他需要以网格方式访问实体的库。目标是尽可能保持API界面简单直观,并在可能的情况下避免延迟操作/状态,以便更直观地处理结构(例如:一个系统的更新应该被后续的系统看到,而不是在系统运行后的下一帧时看到。)。

特性

目前,bevy_tiles支持以下功能

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

即将推出的功能

  • 自动处理分层删除。
  • 根据分块和地图对瓦片进行内存排序(将来可能需要添加Bevy API功能)。

API

基本的API围绕以下内容展开:TileQueryTileCommandsTileMapLabel,如下所示。

struct GameLayer;

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

fn move_character(
    keyboard_input: Res<Input<KeyCode>>,
    mut commands: Commands,
    character: TileQuery<GameLayer, TileCoord, With<Character>>,
    walls: TileQuery<GameLayer, (), With<Block>>,
) {
    let mut tile_commands = commands.tiles::<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() {
        tile_commands.move_tile(*char_c, new_coord);
    }
}

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

版本

Bevy版本 bevy_tiles版本
0.13 0.2
0.12 0.1
0.11 0.1-dev

依赖项

~19–46MB
~728K SLoC