#tileset #tile #bevy #variant #auto

bevy_tileset

使用RON的Bevy中的简单、可配置的瓦片集

8个版本 (重大更新)

0.8.0 2023年7月22日
0.7.0 2023年4月12日
0.6.0 2022年11月14日
0.5.0 2022年9月26日
0.2.0 2022年1月6日

#336 in 游戏开发


被用于 bevy_tileset_map

MIT/Apache

130KB
2K SLoC

bevy_tileset

crates.io docs.rs

使用RON在Bevy中创建简单、可配置的瓦片集。

Smart tile placement

所有GIF均由bevy_tileset_map crate生成

📋 功能

  • 通过RON文件定义瓦片集和瓦片
  • 直接将瓦片集加载为Bevy资产
  • 定义标准、动画、变体和自动瓦片

📲 安装

将以下任意一行添加到您的Cargo.toml文件中。

[dependencies]
bevy_tileset_tiles = "0.8" # For the base tile definitions
bevy_tileset = "0.8" # For general tileset usage (includes above)

✨ 使用方法

只需在配置文件中定义您的瓦片和瓦片集

// assets/tiles/my_tile.ron
(
name: "My Tile",
tile: Standard("textures/my_tile.png")
)
// assets/my_tileset.ron
(
name: Some("My Awesome Tileset"),
id: 0,
tiles: {
0: "../tiles/my_tile.ron",
// ...
}
)

并通过系统加载

use bevy::prelude::*;
use bevy_tileset::prelude::*;

fn load_tiles(asset_server: Res<AssetServer>) {
    let handle: Handle<Tileset> = asset_server.load("my_tileset.ron");
    // Store handle...
}

然后从任何地方访问生成的瓦片集

fn my_system(tilesets: Tilesets, /* other system params */) {
    let tileset = tilesets.get_by_name("My Awesome Tileset").unwrap();
    let tile_index = tileset.get_tile_index("My Tile").unwrap();

    match tile_index {
        TileIndex::Standard(texture_index) => { /* Do something */ }
        TileIndex::Animated(start, end, speed) => { /* Do something */ }
    }
}

瓦片类型

目前有四种主要的瓦片类型

🖼 标准型

定义一个基本瓦片。

// assets/tiles/my-tile.ron

(
name: "My Tile",
tile: Standard("textures/my_tile.png")
)

🎞️ 动画型

定义一个动画瓦片,可以使用来自bevy_ecs_tilemapGPUAnimated组件生成。

// assets/tiles/my-animated-tile.ron

(
name: "My Animated Tile",
tile: Animated((
speed: 2.25,
frames: [
"textures/animated-001.png",
"textures/animated-002.png",
"textures/animated-003.png",
]
))
)

🎲 变体型

启用variants功能

定义一个具有一组可能变体的瓦片。放置时随机选择一个变体。这些变体可以是标准型或动画型。

// assets/tiles/my-variant-tile.ron

(
name: "My Crazy Random Tile",
tile: Variant([
(
weight: 1.0,
tile: Standard("textures/variant-standard-001.png")
),
(
// Default weight: 1.0
tile: Standard("textures/variant-standard-002.png")
),
(
weight: 0.0001, // Wow that's rare!
tile: Animated((
// Default speed: 1.0
frames: [
"textures/variant-animated-001.png",
"textures/variant-animated-002.png",
"textures/variant-animated-003.png",
]
))
)
])
)

🧠 自动型

启用auto-tile功能

定义一个根据其邻居自动选择活动瓦片的瓦片。此行为可以用规则控制。这些子瓦片本身也是变体型瓦片。

// assets/tiles/my-auto-tile.ron

#![enable(implicit_some)]

(
name: "My Auto Tile",
tile: Auto([
(
rule: (
north: true,
east: false,
west: true,
),
variants: [
(
tile: Standard("textures/n_w-e-001.png")
),
(
weight: 2.0,
tile: Standard("textures/n_w-e-002.png")
)
]
),
(
rule: (
// Also supports short notation
n: false,
s: false,
// And ordinal directions
south_west: true,
nw: false
),
variants: [
(
tile: Standard("textures/sw-n_s_nw.png")
)
]
),
])
)

Auto tiling

🎓 示例

  • tileset - 简单加载和显示瓦片集
  • dynamic - 在运行时动态创建瓦片集

请务必查看assets文件夹,了解如何定义瓦片或瓦片集。

🌱 发展领域

此crate可以在某些方面做得更好。以下是一些潜在的发展领域

  • 瓦片集
    • 配置文件 ★
  • 改进自动瓦片
    • 镜像/旋转(指定要镜像或旋转的规则)
  • 加载
    • 将配置加载为资产

不仅是一个改进和更整洁的API。

🎵 重要提示

这些瓦片是用 bevy_ecs_tilemap 包来定义的。因此,它旨在与基于索引的瓦片系统(其中瓦片的纹理定义为纹理图集的索引)一起工作。其他解决方案可能需要适配才能与此包一起工作。

🕊 Bevy 兼容性

bevy bevy_tileset
0.11 0.8
0.10 0.7
0.9 0.6
0.8 0.5
0.7 0.4
0.6 0.3
0.5 0.2

依赖项

~41–77MB
~1M SLoC