#tui #engine #ascii #crossterm #applications #rendering-engine #ui

ascii-forge

一个简洁的 TUI Ascii 应用程序引擎,简化了 crossterm 的使用

20 个版本

0.2.12 2024年2月27日
0.2.11 2024年2月26日
0.1.71 2024年2月23日
0.0.0 2024年2月20日

#260 in 命令行界面

MIT/Apache

53KB
585 代码行(不含注释)

Ascii-Forge

一个基于 crossterm 构建的、有观点的终端画布渲染引擎,旨在在不添加任何不必要的元素的情况下改善终端 UI/Games。

为什么?

尽管已经存在其他终端 UI 引擎,如 Ratatui,但我认为对于一个小程序或游戏来说,有很多额外的元素是不必要的。

此外,很少有功能齐全的终端画布引擎,具有足够的灵活性来制作有趣的游戏。为了实现这一点,引擎的所有元素始终可用。

那么,它有什么不同之处?

如前所述,Ascii-Forge 是有观点的,你没有后端选择权,crossterm 就是你要的,但它是最棒的,也是唯一一个完全跨平台的终端引擎。

以下是主要的不同之处

  • 尽可能保持小巧,同时让事情变得简单。
  • 使引擎的所有可用元素都可供你使用。
    • 这意味着如果更新方法不起作用,你可以使用其他方法来创建自己的。
    • 想访问窗口正在使用的 stdout,请使用 io() 方法!
  • 大多数大型引擎都有自己的布局系统,这不是。你使用列和行,没有在这个基础上额外的抽象。

示例

大多数示例可以在 examples 目录中找到

这里包含最简单的示例。

use std::{io, time::Duration};

use ascii_forge::prelude::*;

fn main() -> io::Result<()> {
    // Will init the window for you, handling all required procedures.
    let mut window = Window::init()?;

    // Ask the system to handle panics for us.
    handle_panics();

    loop {
        // Ask the window to draw, handle events, and fix sizing issues.
        // Duration is the time for which to poll events before re-rendering.
        window.update(Duration::from_millis(200))?;

        // Render elements to the window
        render!(window,
            vec2(0, 0) => [ "Hello World!" ],
            vec2(0, 1) => [ "Press `Enter` to exit!".red() ],
            vec2(0, 2) => [
                "Render ".red(),
                "Multiple ".yellow(),
                "Elements ",
                "In one go!".to_string()
            ]
        );

        // Check if the Enter Key was pressed, and exit the app if it was.
        if event!(window, Event::Key(e) => e.code == KeyCode::Enter) {
            break;
        }
    }
}

文档

依赖项

~1.3–6.5MB
~28K SLoC