窗格

窗格

一个用于 Fabric 的GUI库:在运行中的游戏上叠加工具窗口、模态屏幕、21个小部件、双向数据绑定,以及类似CSS的主题样式,完全通过Minecraft自身的渲染管线渲染。无需原生代码,无冲突。

Pane

一个为 Fabric 模组打造的 GUI 库,体验如同为网页开发一般,完全通过 Minecraft 自身的渲染管线进行绘制。

大多数 Minecraft 用户界面(UI)都是基于原版屏幕(Screen)API 编写的:冗长、版本兼容性差,且仅限于模态窗口。现有的替代方案则引入了额外的原生依赖:捆绑的渲染器、平台特定的 JAR 文件,以及与其他模组在光标控制上的冲突。Pane 选择了第三条道路:一个现代化的保留模式(retained mode)组件树、弹性布局(flex layout)、双向数据绑定和 CSS 风格的主题系统,仅使用游戏自身所使用的 DrawContext 来绘制。无原生代码,无额外渲染器,无任何冲突。

Pane 是为了驱动 Luminary 的编辑器而构建的(三个工具窗口、一个关键帧时间轴和一个图案(Gobo)设计器,在一个包含 150 个模组、与 Axiom 和 Flashback 并行的环境中实时运行)。这是我期望存在的库,现已提取并公开。


两种显示 UI 的方式

悬浮窗口(Overlay windows) 在游戏持续运行的同时悬浮于游戏之上。可拖动,可从任意边缘调整大小,支持主体滚动,使用硬件调整大小的光标。按一个键即可释放鼠标;点击游戏世界即可返回游戏。这种模式使得编辑器风格的工具成为可能。

屏幕(Screens) 是使用相同组件构建的经典模态菜单,托管在原生 Screen 中。它们的行为、暂停逻辑、Tab 补全和关闭方式与其他任何菜单完全一致,因为它们本身就是菜单。

覆盖真实工具需求的组件

按钮、复选框、滑块、下拉菜单、文本输入框、可拖动微调的数字输入框、颜色选择器、进度条、标签页、滚动容器、表格、支持拖拽排序的多选列表视图、按键绑定捕获字段、右键上下文菜单、确认对话框、通知提示。二十一个组件,遵循一个工厂模式:

Window win = Window.of("My Tool").at(40, 40);
win.add(Label.of("Target"));
win.add(TextInput.of(name));
win.add(Slider.of(speed, 0f, 2f));
win.add(Button.of("Apply").onClick(() -> apply()));
PaneOverlay.addWindow(win);

数据绑定,而非到处使用回调

一个基础原语 State<T> 即可在组件和数据之间建立双向连接。将同一个状态绑定到滑块和数字输入框,它们便会自动保持同步。

State<Float> radius = State.of(16f);
Slider.of(radius, 0f, 256f);
NumberField.of(radius, 0f, 256f);
radius.onChange(v -> sendToServer(v));

使用标记语言编写,使用 CSS 风格化

大型布局可以使用 PML 以声明式方式编写,并使用 PSS 进行样式设置:支持选择器、特异性、#AARRGGBB 颜色等这些你已熟悉的功能。

button   { bg: #292A31; padding: 3; }
.warn    { fg: #FF5555; }
#saveBtn { border-color: #4FA3FF; }

主题

八个设计令牌(tokens)驱动所有组件。内置三套主题:Studio(深色)、Paper(浅色)和 Vanilla(与游戏自带菜单风格融合)。自定义主题只需定义一个记录(record),而深色/浅色切换只需一次调用。

纯逻辑核心设计

核心代码和所有组件均不导入任何 Minecraft 类。整个组件层可以在纯 JVM 上编译并运行其测试套件,这也是同一套组件能够跨 Minecraft 版本原样发布的原因;每个版本仅需适配一个轻量级的运行时层。


获取方式: Modrinth (即将上线) · 学习文档: Pane 维基 · 实际应用: Luminary