#bevy-plugin #bevy #ratatui #terminal #tui #render #command-line-interface

bevy_ratatui_render

使用ratatui将bevy应用渲染到终端的插件

13个版本 (4个重大更新)

0.5.6 2024年8月15日
0.5.5 2024年8月7日
0.5.2 2024年7月25日
0.4.2 2024年6月13日
0.1.0 2024年6月2日

#136游戏开发

Download history 113/week @ 2024-05-27 357/week @ 2024-06-03 434/week @ 2024-06-10 4/week @ 2024-06-17 309/week @ 2024-07-01 26/week @ 2024-07-08 4/week @ 2024-07-15 152/week @ 2024-07-22 533/week @ 2024-07-29 445/week @ 2024-08-05 394/week @ 2024-08-12

每月1,525次下载
2 Crate 中使用

MIT/Apache

50KB
484

bevy_ratatui_render

在终端内运行Bevy!

使用bevy无头渲染、ratatuiratatui_image 将bevy应用程序的渲染输出打印到终端,使用unicode半块。

cube examplefoxessponza test scene

examples/cube.rs,bevy many_foxes 示例,sponza 测试场景

使用 bevy_ratatui 在bevy中设置ratatui并接收终端事件(键盘、焦点、鼠标、粘贴、大小调整)。

入门指南

cargo添加 bevy_ratatui_render bevy_ratatui

fn main() {
    App::new()
        .add_plugins((
            DefaultPlugins,
            RatatuiPlugins::default(),
            RatatuiRenderPlugin::new("main", (256, 256)),
        ))
        .add_systems(Startup, setup_scene_system)
        .add_systems(Update, draw_scene_system.map(error))
        .run();
}

fn setup_scene_system(
    mut commands: Commands,
    ratatui_render: Res<RatatuiRenderContext>,
) {
    // spawn objects into your scene

    ...

    commands.spawn(Camera3dBundle {
        camera: Camera {
            target: ratatui_render.target("main").unwrap(),
            ..default()
        },
        ..default()
    });
}

fn draw_scene_system(
    mut ratatui: ResMut<RatatuiContext>,
    ratatui_render: Res<RatatuiRenderContext>,
) -> io::Result<()> {
    ratatui.draw(|frame| {
        frame.render_widget(ratatui_render.widget("main").unwrap(), frame.size());
    })?;

    Ok(())
}

如上所示,RatatuiRenderPlugin 提供了一个可用的 RatatuiRenderContext 资源,它有两个主要方法

  • target(id):提供一个bevy RenderTarget,可以设置为普通bevy摄像机的目标。
  • widget(id):提供一个ratatui小部件,将最新渲染输出打印到相应的摄像机,使用unicode半块。

如果你不需要访问ratatui绘制循环,只想将渲染输出打印到整个终端,有一个便利函数(对于上述示例,使用此函数而不是添加 draw_scene_system

RatatuiRenderPlugin::new("main", (256, 256)).print_full_terminal()

还有一个便利函数用于在启动时以及终端大小调整时自动调整渲染纹理以匹配终端尺寸

RatatuiRenderPlugin::new("main", (1, 1)).autoresize()

要自定义如何从终端尺寸计算纹理尺寸,请提供一个回调到 autoresize_conversion_fn

RatatuiRenderPlugin::new("main", (1, 1))
    .autoresize()
    .autoresize_conversion_fn(|(width, height)| (width * 4, height * 3))

为了节省一些CPU周期,我还建议明确告诉bevy你不需要窗口

DefaultPlugins
    .set(WindowPlugin {
        primary_window: None,
        exit_condition: ExitCondition::DontExit,
        close_when_requested: false,
    })

多个渲染

RatatuiRenderPlugin 可以多次添加到 bevy 中。要访问正确的渲染,请使用与您在 RatatuiRenderPlugin::new(id, dimensions) 中传入的相同字符串 id 来调用 target(id)widget(id) 方法,这些方法位于 RatatuiRenderContext 资源中。

支持的终端

打印到终端依赖于终端支持 24 位颜色。我亲自测试并确认以下终端可以正确显示:

  • Alacritty
  • Kitty
  • iTerm
  • WezTerm

...但是任何支持 24 位颜色的终端都应能正常工作,如果其性能足够的话。

兼容性

bevy bevy_ratatui_render
0.14 0.5
0.13 0.4

致谢

依赖项

~29–43MB
~712K SLoC