#tui #bevy #terminal #console #keyboard-events #cli

nightly bevy_tui

一个插件,用于使用 TUI 而不是图形界面创建交互式 Bevy 应用程序

2 个不稳定版本

0.14.0-rc.02024 年 6 月 16 日
0.13.0 2024 年 6 月 16 日

命令行界面 中排名 #468

MIT 许可证

46KB
677

Bevy TUI

一个插件,用于使用 TUI 而不是图形界面创建交互式 Bevy 应用程序。

此插件大部分可使用,由于我的工作优先级较高,我对它的更新有些间断。尽管如此,它已经相当稳定且可用,尽管还有很大的改进空间和提升开发者体验的空间。

快速入门

默认的 "MinimalPlugins" 仍然包含大量不兼容在无头环境中运行的可视化插件。此软件包提供了一组替代插件,它们可以替换最小插件,并主要提供对 Bevy 核心的访问。

这个非标准的最小核心以及控制台环境有一些权衡,这些权衡可能是 Bevy 开发者不熟悉的。有关更多信息,请参阅权衡部分。

use bevy::prelude::*;
use bevy_tui::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    initialize_terminal()?;

    App::new()
        .add_plugins(MinimalTuiPlugins)
        .run();

    teardown_terminal()?;

    Ok(())
}

有一些示例演示了如何使用此软件包的某些部分。

背景

该项目最初是为了创建一个管理客户端来监控游戏服务器的健康和状态,而不会对它们造成显著的负载。我想到,如果适当完善,这将有助于其他项目,例如基于终端的 rogue 类型和文字冒险游戏的环境。

权衡

键盘事件

从终端接收的键盘事件不是键盘的扫描码,也不会区分键盘的左右侧。Bevy 希望使用物理键来表示所有键盘交互,而终端在很大程度上并不关心这些。

为了与现有代码库在一定程度上兼容,手动将键盘事件转换为基于美国键盘布局的bevy::input::KeyCode实例。大写字母和带Shift的符号键转换为两个按键,优先选择键盘的左侧。例如,A变成了两个键码,KeyCode::KeyAKeyCode::ShiftLeft,类似地,%变成了KeyCode::Key5KeyCode::ShiftLeft。如果需要用于文本输入等场景的原始输入字符,建议使用RawConsoleEvent类型来提取适当的输入字符。这对于Unicode代码点和非美国键盘布局也是适用的。

键盘上有些键是模糊的,可以用不同的按键组合来表示,尤其是数字键盘上的字符。在字符既可以表示为另一个字符的带Shift版本,也可以直接由Bevy枚举变体表示的事件中,优先选择带Shift的版本,因为这更有可能在美式键盘布局上被这样输入。

由于历史原因,终端的限制导致并非所有控制序列或可输入的字符都被允许,尽管有一些终端扩展允许这些操作,但它们并不常见或得到很好的支持。由crossterm库支持的终端事件都被表示并暴露给了Bevy事件系统(如果您的终端支持的话),但默认的终端初始化并不尝试启用这些扩展。并非所有文档化的扩展都由crossterm支持,请参阅该项目以获取具体支持信息。

如果您使用的是'Escape'键,它将正常工作,但您可能会注意到在它实际报告之前有几秒钟的延迟。这也是由于底层控制代码和键本身的歧义消除,这依赖于在报告之前有一个超时。

自定义调度器

在构建终端应用程序时,您想要使用的调度器通常与基于图形的调度器有不同的要求。这里的调度器基于winit的等价物,但它专注于控制台事件而不是窗口事件。

这个调度器是基于Bevy 0.12中可用的版本构建的。从那时起,调度系统已经发生了重大变化,现在是时候进行更新了。

持续集成

有一个工具套件,它将各种CI流程捆绑到一个本地存储库工具中。我使用了一套相当严格的选项,因为我发现这些推荐通常有助于未来的版本迁移。将这些东西分离开来作为自己的工具的好处是,可以本地复制使用的精确选项,就像这样运行本地的CI流程

cargo run -p ci -- default

依赖项

~22–31MB
~477K SLoC