#rogue-like #cp437 #ascii #terminal #gamedev #mouse-input

bracket-terminal

ASCII/Codepage 437终端模拟器,带有游戏循环。默认为OpenGL,也支持WebGPU(用于Vulkan/Metal/WGPU)、Curses和Crossterm输出。是bracket-lib家族的一部分。

8个版本

0.8.7 2022年10月4日
0.8.5 2021年7月6日
0.8.2 2021年2月15日
0.8.1 2020年4月29日
0.1.0 2020年2月21日

1098游戏开发中排名

Download history 981/week @ 2024-03-13 1399/week @ 2024-03-20 1289/week @ 2024-03-27 1605/week @ 2024-04-03 1375/week @ 2024-04-10 1331/week @ 2024-04-17 1342/week @ 2024-04-24 1164/week @ 2024-05-01 1254/week @ 2024-05-08 1246/week @ 2024-05-15 1384/week @ 2024-05-22 1425/week @ 2024-05-29 1257/week @ 2024-06-05 945/week @ 2024-06-12 1109/week @ 2024-06-19 1109/week @ 2024-06-26

4,651次每月下载
8包中使用(直接使用3个)

MIT许可证

2MB
19K SLoC

bracket-terminal

bracket-terminalbracket-lib家族的一部分。它提供了一个虚拟的ASCII/Codepage-437终端(可选的瓦片图形支持和层),以及一个游戏循环。这可以帮助你避免实现困难,使编写基于网格的游戏变得容易(Roguelikes非常适合,但任何基于网格/瓦片的游戏都可以使用)。它还提供了键盘和鼠标输入的帮助。

Bracket-terminal支持多个后端

  • 默认是OpenGL,几乎在所有设备上都能运行。GL后端支持所有功能,包括后处理(复古屏幕效果)和层。
  • WebGL(WASM)后端在Web Assembly中运行,允许你将基于bracket-terminal的游戏编译到网络上。
  • webgpu后端提供在VulkanMetalWebGPU中的渲染。目前除了后处理效果外,支持所有功能。
  • crossterm后端在现有的终端中本地运行。不支持图形功能。
  • curses后端在*NIX终端中本地运行,或在Windows上的pdcurses终端模拟器中运行。不支持图形功能。

重大更改警告:如果你直接使用bracket-terminal,则crossterm功能现在是cross_term。对于bracket-librltk,它仍然是crossterm

重要:如果你正在运行webgpu后端,你需要将resolver = 2添加到你的Cargo.toml文件中。WGPU需要它来选择平台。

为什么是bracket-terminal而不是直接控制台渲染?

bracket-terminal可以进行终端渲染,但如果你唯一的目的是这个,你可能最好使用crossterm。Bracket-terminal提供了一些你在其他地方找不到的功能

  • 它是基于游戏循环的,因此非常适合面向帧的游戏编程。
  • Codepage-437的仿真基于图形后端,图形精灵。你可以完全确信,你的游戏将在所有平台上使用你指定的字体(字体)看起来完全一样。
  • 它提供了多个图层,可以使用不同的字体/精灵文件。
  • 如果您喜欢,还有一些复古的后期处理效果可供选择。
  • bracket-terminal努力保持简单直接,提供了一个极佳的学习环境。

最小示例

以下代码足以在屏幕上显示Hello Minimal Bracket World

use bracket_terminal::prelude::*;

struct State {}

impl GameState for State {
    fn tick(&mut self, ctx: &mut BTerm) {
        ctx.print(1, 1, "Hello Bracket World");
    }
}

fn main() -> BError {
    let context = BTermBuilder::simple80x50()
        .with_title("Hello Minimal Bracket World")
        .build()?;

    let gs: State = State {};
    main_loop(context, gs)
}

值得注意的是,在bracket-terminal中,(0,0)是屏幕的左上角。

示例

使用以下命令运行示例:cargo run --example <name>

  • hello_minimal将"Hello Minimal Bracket World"显示在屏幕上。用WASM试一试
  • hello_terminal将带有颜色、每秒帧数(FPS)计数和帧率限制的弹跳"Hello World"显示在屏幕上。用WASM试一试
  • sparse是相同的演示,但在第二个图层上使用VGA 8x16字体,没有帧率限制,并利用批量命令提交。用WASM试一试
  • walking让您可以使用键盘在随机地图上移动@符号。用WASM试一试
  • astar-mouse让您可以使用鼠标在随机地图上移动,使用A-Star路径(来自bracket-pathfinding包)来避开障碍物。用WASM试一试
  • tileswalking演示类似,但使用了两层图形贴图(仅图形后端)。用WASM试一试
  • rex展示了从REX Paint加载精灵并将其渲染到终端的示例。用WASM试一试
  • postprocess展示了库的后期处理效果——扫描线和屏幕烧灼。用WASM试一试
  • textblock展示了TextBlock系统,为您提供了构建大型文本块的方法,包括自动换行和格式化。用WASM试一试
  • dwarfmap展示了使用Algorithm3D与终端结合,提供Dwarf Fortress风格的3D地图(3D世界的2D“切片”)。它使用bracket-noise库进行地形生成。用WASM试一试
  • keyboard展示了键盘扫描码输入。它主要用于调试。用WASM试一试
  • textsprites展示了多贴图精灵。用WASM试一试
  • native_gl展示了如何直接访问OpenGL。仅适用于opengl后端、WASM或本地。 尝试使用WASM

使用其他后端运行示例

您可以使用不同的后端运行dwarfmap示例,例如。其他后端也适用相同的原理

  • OpenGL : cargo run --example dwarfmap
  • WGPU: cargo run --example dwarfmap --no-default-features --features "webgpu"
  • Curses: cargo run --example dwarfmap --no-default-features --features "curses"
  • Crossterm: (注意特性名称为cross_term) cargo run --example dwarfmap --no-default-features --features "cross_term"

依赖项

~5–24MB
~277K SLoC