
FlexHUD
hud lib
FlexHUD

一个基于 NeoForge 构建的可扩展 HUD 布局和渲染库。它使用 "RelativeRect + Anchor" 以独立于分辨率的方式描述 HUD 元素位置和大小,提供带有约束的拖拽/调整大小的交互式配置界面,并将布局持久化到客户端配置中,同时在屏幕尺寸变化时自动重新计算。
目标
- 通过
RelativeRect和Anchor描述 HUD 元素位置和大小,使布局在不同分辨率/宽高比下保持稳定。 - 提供简单的注册 API:实现
Layer#render即可插入自定义 HUD 元素。 - 提供可视化配置界面 (
FlexHudConfigScreen):拖拽移动,使用手柄调整大小;ResizeMode控制约束(自由、纵横比、水平、垂直、固定)。 - 持久化和热更新:使用 NeoForge
ModConfig存储和同步位置;更改在运行时立即生效。
快速开始
注册一个可自由调整大小的快捷栏 HUD 元素:
public class BuiltInFlexHud {
public static void registerHotbarHud() {
ResourceLocation id = FlexHudApi.HOTBAR_ID; // 唯一元素 ID
// 默认相对矩形:底部中心锚点,宽度 182,高度 22
FlexHudApi.RelativeRect defaultRelativeRect = new FlexHudApi.RelativeRect(
FlexHudApi.Anchor.BOTTOM_CENTER,
0, 0,
182, 22
);
// 渲染层:使用计算出的绝对矩形进行绘制
FlexHudApi.Layer hotbarLayer = (rect, guiGraphics, deltaTracker) -> {
PoseStack pose = guiGraphics.pose();
pose.pushPose();
int screenWidth = guiGraphics.guiWidth();
int screenHeight = guiGraphics.guiHeight();
// 从默认相对矩形计算默认快捷栏绝对矩形
FlexHudApi.Rect defaultRect = defaultRelativeRect.toAbsolute(screenWidth, screenHeight);
// 应用从 defaultRect 到目标矩形的仿射变换,实现自由移动/缩放
pose.mulPose(defaultRect.transform(rect));
((GuiAccessor) Minecraft.getInstance().gui).callRenderHotbar(guiGraphics, deltaTracker);
pose.popPose();
};
// 使用自由调整大小模式注册,附带默认相对矩形和渲染层
FlexHudApi.INSTANCE.register(id, FlexHudApi.ResizeMode.Free, defaultRelativeRect, hotbarLayer);
}
}
运行时,库在渲染前调用 updateScreenDimensions(),将每个元素的 RelativeRect 转换为当前分辨率下的绝对 Rect,并传递给您的 Layer#render。
API 概览
FlexHudApi#register(ResourceLocation id, ResizeMode mode, RelativeRect defaultRect, Layer layer)- 注册一个 HUD 元素;如果配置中存在已保存的布局,则覆盖默认布局。
FlexHudApi.Impl#updateElementRelativeRect(ResourceLocation id, RelativeRect newRect)- 运行时更新布局并持久化;配置界面使用此方法。
FlexHudApi.Impl#updateScreenDimensions()- 当屏幕尺寸/宽高比变化时重新计算所有绝对矩形。
FlexHudApi.Layer#render(Rect rect, GuiGraphics g, DeltaTracker dt)- 渲染回调:使用提供的绝对矩形进行绘制。
FlexHudApi.ResizeModeFree(自由)、Aspect(保持比例)、Horizontal(水平)、Vertical(垂直)、Fixed(固定)。
FlexHudApi.Anchor- 九宫格锚点:
TOP_LEFT / TOP_CENTER / TOP_RIGHT / CENTER_LEFT / CENTER / CENTER_RIGHT / BOTTOM_LEFT / BOTTOM_CENTER / BOTTOM_RIGHT(左上 / 中上 / 右上 / 左中 / 居中 / 右中 / 左下 / 中下 / 右下)。
- 九宫格锚点:
FlexHudApi.RelativeRect- 字段:
anchor, offsetX, offsetY, width, height, useRelativeSize - 方法:
toAbsolute(int w, int h)转换为绝对矩形;fromAbsolute(Rect rect, Anchor a, int w, int h)推断相对矩形。
- 字段:
FlexHudApi.Rect#transform(Rect to)- 从源矩形到目标矩形的仿射变换(平移 + 缩放),用于将现有绘制逻辑映射到新位置/大小。
可视化配置
- 游戏中按
Alt + H打开FlexHudConfigScreen。 - 拖拽移动,使用手柄调整大小;
ResizeMode决定约束。 - 更改会持久化到客户端配置(NeoForge
ModConfig),例如:
[hud]
relative_rects = [
"flexhud:hotbar|BOTTOM_CENTER|-2.9042664|-37.03853|188.19147|22.961472|false"
]
要求
Minecraft 1.21.1NeoForge 21.x(例如21.1.213)Java 21
许可证
- MIT(参见构建脚本/项目配置)。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。