#2d-graphics #bevy #graphics #2d

bevy_keith

为Bevy游戏引擎的2D图形库

3个不稳定版本

0.1.0 2024年7月20日
0.0.2 2022年8月19日
0.0.1 2022年8月8日

#279 in 游戏开发

Download history 118/week @ 2024-07-16 59/week @ 2024-07-23 35/week @ 2024-07-30

212 每月下载量

MIT/Apache

605KB
3K SLoC

🐕 Bevy Keith

License: MIT or Apache 2.0 Doc Crate Bevy tracking

受Piet启发的2D图形库(📦 piet)为Bevy游戏引擎

该库使用自定义的符号距离场(SDF)渲染器,能够在极少数绘制调用(通常是单个绘制调用)下实现任何缩放级别的抗锯齿形状。即使在高DPI下,管道也能以物理分辨率渲染,以获得清晰的细节。

Preview of canvas drawing with bevy_keith

使用方法

Cargo.toml中添加依赖项

[dependencies]
bevy_keith = "0.1"

KeithPlugin添加到您的Bevy应用中

App::default()
    .add_plugins(DefaultPlugins)
    .add_plugins(KeithPlugin);

在您想要绘制的地方添加一个Canvas组件。如果您将Canvas添加到与OrthographicProjection组件相同的Entity上,则画布会自动调整大小以适应完整的正交相机区域。

// Only for initial setup, or if controlled manually
let mut canvas = Canvas::new(Rect {
    min: Vec2::splat(-400.),
    max: Vec2::splat(100.),
});

// Optionally clear the canvas with a given color before drawing
canvas.background_color = Some(BEIGE.into());

// Spawn on the same Entity as an OrthographicProjection for auto-resize
commands
    .spawn_bundle(Camera2dBundle::default())
    .insert(canvas);

通过一个RenderContextCanvas上绘制一些内容

fn run(mut query: Query<&mut Canvas>) {
    let mut canvas = query.single_mut();
    canvas.clear();

    let mut ctx = canvas.render_context();

    // Draw a filled rectangle
    let brush = ctx.solid_brush(PINK.into());
    let rect = Rect {
        min: Vec2::ZERO,
        max: Vec2::splat(50.),
    };
    ctx.fill(rect, &brush);

    // Draw a text
    let font_handle: Handle<Font> = [...]
    let text = ctx
        .new_layout("Hello World!")
        .color(ORANGE_RED.into())
        .font(font_handle)
        .font_size(24.)
        .build();
    ctx.draw_text(text, Vec2::ZERO);

    // Draw a textured rectangle
    let rect = Rect {
        min: Vec2::new(100., 150.),
        max: Vec2::new(116., 166.),
    };
    ctx.draw_image(rect, my_res.image.clone());

    // Draw some lines
    let brush = ctx.solid_brush(GREEN.into());
    for i in 0..=10 {
        ctx.line(Vec2::new(-200.5, 0.5 + i as f32 * 15.), Vec2::new(0.5, 0.5 + i as f32 * 40.), &brush, 1. + i as f32);
    }
}

功能

  • 基本形状
    • 文本
    • 对齐矩形
      • 填充
      • 描边
      • 圆角
    • 单行
    • 折线

依赖项

~37–74MB
~1.5M SLoC