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 命令行界面
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;
}
}
}
文档
- docs.rs
- Wiki 即将推出!
依赖项
~1.3–6.5MB
~28K SLoC